@medplum/react 0.10.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/cjs/AttachmentButton.d.ts +2 -0
  2. package/dist/cjs/CalendarInput.d.ts +0 -1
  3. package/dist/cjs/CheckboxFormSection.d.ts +0 -1
  4. package/dist/cjs/DescriptionList.d.ts +0 -1
  5. package/dist/cjs/DiagnosticReportDisplay.d.ts +0 -1
  6. package/dist/cjs/Document.d.ts +0 -1
  7. package/dist/cjs/FhirPathTable.d.ts +0 -1
  8. package/dist/cjs/FormSection.d.ts +0 -1
  9. package/dist/cjs/MedplumLink.d.ts +2 -4
  10. package/dist/cjs/QuestionnaireBuilder.d.ts +0 -1
  11. package/dist/cjs/QuestionnaireForm.d.ts +0 -1
  12. package/dist/cjs/RequestGroupDisplay.d.ts +0 -1
  13. package/dist/cjs/ResourceBadge.d.ts +0 -1
  14. package/dist/cjs/ResourceBlame.d.ts +0 -1
  15. package/dist/cjs/ResourceDiff.d.ts +0 -1
  16. package/dist/cjs/ResourceDiffTable.d.ts +0 -2
  17. package/dist/cjs/ResourceName.d.ts +2 -1
  18. package/dist/cjs/ResourceTimeline.d.ts +0 -1
  19. package/dist/cjs/Scheduler.d.ts +0 -1
  20. package/dist/cjs/SearchControl.d.ts +0 -1
  21. package/dist/cjs/SearchFilterEditor.d.ts +0 -1
  22. package/dist/cjs/Timeline.d.ts +0 -1
  23. package/dist/cjs/auth/AuthenticationForm.d.ts +1 -0
  24. package/dist/cjs/auth/RegisterForm.d.ts +0 -1
  25. package/dist/cjs/auth/SignInForm.d.ts +1 -1
  26. package/dist/cjs/index.js +1252 -907
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/index.min.js +1 -1
  29. package/dist/cjs/index.min.js.map +1 -1
  30. package/dist/cjs/stories/DescriptionList.stories.d.ts +5 -0
  31. package/dist/cjs/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
  32. package/dist/cjs/stories/RequestGroupDisplay.stories.d.ts +1 -0
  33. package/dist/cjs/stories/ResourceTable.stories.d.ts +4 -0
  34. package/dist/cjs/stories/covid19.d.ts +15 -0
  35. package/dist/esm/AttachmentArrayInput.js +2 -2
  36. package/dist/esm/AttachmentArrayInput.js.map +1 -1
  37. package/dist/esm/AttachmentButton.d.ts +2 -0
  38. package/dist/esm/AttachmentButton.js +4 -1
  39. package/dist/esm/AttachmentButton.js.map +1 -1
  40. package/dist/esm/BackboneElementInput.js +2 -1
  41. package/dist/esm/BackboneElementInput.js.map +1 -1
  42. package/dist/esm/CalendarInput.d.ts +0 -1
  43. package/dist/esm/CalendarInput.js +39 -2
  44. package/dist/esm/CalendarInput.js.map +1 -1
  45. package/dist/esm/CheckboxFormSection.d.ts +0 -1
  46. package/dist/esm/CheckboxFormSection.js +5 -5
  47. package/dist/esm/CheckboxFormSection.js.map +1 -1
  48. package/dist/esm/DescriptionList.d.ts +0 -1
  49. package/dist/esm/DescriptionList.js +23 -1
  50. package/dist/esm/DescriptionList.js.map +1 -1
  51. package/dist/esm/DiagnosticReportDisplay.d.ts +0 -1
  52. package/dist/esm/DiagnosticReportDisplay.js +40 -22
  53. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  54. package/dist/esm/Document.d.ts +0 -1
  55. package/dist/esm/Document.js +7 -2
  56. package/dist/esm/Document.js.map +1 -1
  57. package/dist/esm/ErrorBoundary.js +2 -1
  58. package/dist/esm/ErrorBoundary.js.map +1 -1
  59. package/dist/esm/FhirPathTable.d.ts +0 -1
  60. package/dist/esm/FhirPathTable.js +5 -5
  61. package/dist/esm/FhirPathTable.js.map +1 -1
  62. package/dist/esm/FormSection.d.ts +0 -1
  63. package/dist/esm/FormSection.js +3 -11
  64. package/dist/esm/FormSection.js.map +1 -1
  65. package/dist/esm/MedplumLink.d.ts +2 -4
  66. package/dist/esm/MedplumLink.js +11 -8
  67. package/dist/esm/MedplumLink.js.map +1 -1
  68. package/dist/esm/PlanDefinitionBuilder.js +41 -10
  69. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  70. package/dist/esm/QuestionnaireBuilder.d.ts +0 -1
  71. package/dist/esm/QuestionnaireBuilder.js +78 -31
  72. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  73. package/dist/esm/QuestionnaireForm.d.ts +0 -1
  74. package/dist/esm/QuestionnaireForm.js +26 -16
  75. package/dist/esm/QuestionnaireForm.js.map +1 -1
  76. package/dist/esm/RequestGroupDisplay.d.ts +0 -1
  77. package/dist/esm/RequestGroupDisplay.js +8 -7
  78. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  79. package/dist/esm/ResourceBadge.d.ts +0 -1
  80. package/dist/esm/ResourceBadge.js +2 -1
  81. package/dist/esm/ResourceBadge.js.map +1 -1
  82. package/dist/esm/ResourceBlame.d.ts +0 -1
  83. package/dist/esm/ResourceBlame.js +59 -10
  84. package/dist/esm/ResourceBlame.js.map +1 -1
  85. package/dist/esm/ResourceDiff.d.ts +0 -1
  86. package/dist/esm/ResourceDiff.js +13 -2
  87. package/dist/esm/ResourceDiff.js.map +1 -1
  88. package/dist/esm/ResourceDiffTable.d.ts +0 -2
  89. package/dist/esm/ResourceDiffTable.js +25 -3
  90. package/dist/esm/ResourceDiffTable.js.map +1 -1
  91. package/dist/esm/ResourceForm.js +6 -5
  92. package/dist/esm/ResourceForm.js.map +1 -1
  93. package/dist/esm/ResourceInput.js +28 -2
  94. package/dist/esm/ResourceInput.js.map +1 -1
  95. package/dist/esm/ResourceName.d.ts +2 -1
  96. package/dist/esm/ResourceName.js +5 -2
  97. package/dist/esm/ResourceName.js.map +1 -1
  98. package/dist/esm/ResourcePropertyDisplay.js +6 -6
  99. package/dist/esm/ResourcePropertyDisplay.js.map +1 -1
  100. package/dist/esm/ResourceTimeline.d.ts +0 -1
  101. package/dist/esm/ResourceTimeline.js +78 -25
  102. package/dist/esm/ResourceTimeline.js.map +1 -1
  103. package/dist/esm/Scheduler.d.ts +0 -1
  104. package/dist/esm/Scheduler.js +20 -4
  105. package/dist/esm/Scheduler.js.map +1 -1
  106. package/dist/esm/SearchControl.d.ts +0 -1
  107. package/dist/esm/SearchControl.js +33 -18
  108. package/dist/esm/SearchControl.js.map +1 -1
  109. package/dist/esm/SearchFilterEditor.d.ts +0 -1
  110. package/dist/esm/SearchFilterEditor.js +2 -2
  111. package/dist/esm/SearchFilterEditor.js.map +1 -1
  112. package/dist/esm/Timeline.d.ts +0 -1
  113. package/dist/esm/Timeline.js +13 -16
  114. package/dist/esm/Timeline.js.map +1 -1
  115. package/dist/esm/auth/AuthenticationForm.d.ts +1 -0
  116. package/dist/esm/auth/AuthenticationForm.js +6 -3
  117. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  118. package/dist/esm/auth/ChooseProfileForm.js +3 -3
  119. package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
  120. package/dist/esm/auth/NewProjectForm.js +3 -3
  121. package/dist/esm/auth/NewProjectForm.js.map +1 -1
  122. package/dist/esm/auth/NewUserForm.js +4 -3
  123. package/dist/esm/auth/NewUserForm.js.map +1 -1
  124. package/dist/esm/auth/RegisterForm.d.ts +0 -1
  125. package/dist/esm/auth/RegisterForm.js.map +1 -1
  126. package/dist/esm/auth/SignInForm.d.ts +1 -1
  127. package/dist/esm/auth/SignInForm.js +1 -1
  128. package/dist/esm/auth/SignInForm.js.map +1 -1
  129. package/dist/esm/index.min.js +1 -1
  130. package/dist/esm/index.min.js.map +1 -1
  131. package/dist/esm/stories/DescriptionList.stories.d.ts +5 -0
  132. package/dist/esm/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
  133. package/dist/esm/stories/RequestGroupDisplay.stories.d.ts +1 -0
  134. package/dist/esm/stories/ResourceTable.stories.d.ts +4 -0
  135. package/dist/esm/stories/covid19.d.ts +15 -0
  136. package/package.json +35 -23
  137. package/rollup.config.mjs +111 -0
  138. package/dist/cjs/defaulttheme.css +0 -192
  139. package/dist/cjs/styles.css +0 -528
  140. package/dist/esm/defaulttheme.css +0 -192
  141. package/dist/esm/styles.css +0 -528
@@ -1,3 +1,4 @@
1
+ import { Title } from '@mantine/core';
1
2
  import React from 'react';
2
3
 
3
4
  /**
@@ -17,7 +18,7 @@ class ErrorBoundary extends React.Component {
17
18
  }
18
19
  render() {
19
20
  if (this.state.error) {
20
- return React.createElement("h1", null, "Something went wrong.");
21
+ return React.createElement(Title, null, "Something went wrong.");
21
22
  }
22
23
  return this.props.children;
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sources":["../../src/ErrorBoundary.tsx"],"sourcesContent":["import React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return <h1>Something went wrong.</h1>;\n }\n\n return this.props.children;\n }\n}\n"],"names":[],"mappings":";;AAUA;;;AAGG;AACU,MAAA,aAAc,SAAQ,KAAK,CAAC,SAAiD,CAAA;AAGxF,IAAA,WAAA,CAAY,KAAyB,EAAA;QACnC,KAAK,CAAC,KAAK,CAAC,CAAC;AACb,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;KACjB;IAED,OAAO,wBAAwB,CAAC,KAAU,EAAA;QACxC,OAAO,EAAE,KAAK,EAAE,CAAC;KAClB;IAED,iBAAiB,CAAC,KAAY,EAAE,SAAoB,EAAA;QAClD,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KACpD;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AACpB,YAAA,OAAO,wDAA8B,CAAC;AACvC,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;KAC5B;AACF;;;;"}
1
+ {"version":3,"file":"ErrorBoundary.js","sources":["../../src/ErrorBoundary.tsx"],"sourcesContent":["import { Title } from '@mantine/core';\nimport React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return <Title>Something went wrong.</Title>;\n }\n\n return this.props.children;\n }\n}\n"],"names":[],"mappings":";;;AAWA;;;AAGG;AACU,MAAA,aAAc,SAAQ,KAAK,CAAC,SAAiD,CAAA;AAGxF,IAAA,WAAA,CAAY,KAAyB,EAAA;QACnC,KAAK,CAAC,KAAK,CAAC,CAAC;AACb,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;KACjB;IAED,OAAO,wBAAwB,CAAC,KAAU,EAAA;QACxC,OAAO,EAAE,KAAK,EAAE,CAAC;KAClB;IAED,iBAAiB,CAAC,KAAY,EAAE,SAAoB,EAAA;QAClD,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KACpD;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YACpB,OAAO,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA,EAAA,uBAAA,CAA8B,CAAC;AAC7C,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;KAC5B;AACF;;;;"}
@@ -2,7 +2,6 @@ import { PropertyType } from '@medplum/core';
2
2
  import { Resource } from '@medplum/fhirtypes';
3
3
  import React from 'react';
4
4
  import { SearchClickEvent } from './SearchControl';
5
- import './SearchControl.css';
6
5
  export interface SmartSearchField {
7
6
  readonly propertyType: PropertyType;
8
7
  readonly name: string;
@@ -94,22 +94,22 @@ function FhirPathTable(props) {
94
94
  return React.createElement(Loader, null);
95
95
  }
96
96
  const checkboxColumn = props.checkboxesEnabled;
97
- return (React.createElement("div", { className: "medplum-search-control", onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
97
+ return (React.createElement("div", { onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
98
98
  React.createElement(Table, null,
99
99
  React.createElement("thead", null,
100
100
  React.createElement("tr", null,
101
- checkboxColumn && (React.createElement("th", { className: "medplum-search-icon-cell" },
101
+ checkboxColumn && (React.createElement("th", null,
102
102
  React.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
103
103
  fields.map((field) => (React.createElement("th", { key: field.name }, field.name))))),
104
104
  React.createElement("tbody", null, (_c = (_b = response === null || response === void 0 ? void 0 : response.data) === null || _b === void 0 ? void 0 : _b.ResourceList) === null || _c === void 0 ? void 0 : _c.map((resource) => resource && (React.createElement("tr", { key: resource.id, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
105
- checkboxColumn && (React.createElement("td", { className: "medplum-search-icon-cell" },
105
+ checkboxColumn && (React.createElement("td", null,
106
106
  React.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
107
107
  fields.map((field) => {
108
108
  return (React.createElement("td", { key: field.name },
109
109
  React.createElement(FhirPathDisplay, { propertyType: field.propertyType, path: field.fhirPath, resource: resource })));
110
110
  })))))),
111
- ((_e = (_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.ResourceList) === null || _e === void 0 ? void 0 : _e.length) === 0 && (React.createElement("div", { "data-testid": "empty-search", className: "medplum-empty-search" }, "No results")),
112
- outcome && (React.createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
111
+ ((_e = (_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.ResourceList) === null || _e === void 0 ? void 0 : _e.length) === 0 && React.createElement("div", { "data-testid": "empty-search" }, "No results"),
112
+ outcome && (React.createElement("div", { "data-testid": "search-error" },
113
113
  React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
114
114
  props.onBulk && (React.createElement(Button, { onClick: () => props.onBulk(Object.keys(selectedRef.current)) }, "Bulk..."))));
115
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FhirPathTable.js","sources":["../../src/FhirPathTable.tsx"],"sourcesContent":["import { Button, Loader, Table } from '@mantine/core';\nimport { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from './FhirPathDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { SearchClickEvent } from './SearchControl';\nimport { isCheckboxCell, killEvent } from './utils/dom';\n\nimport './SearchControl.css';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data?.ResourceList?.length === 0 && (\n <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FhirPathTable.js","sources":["../../src/FhirPathTable.tsx"],"sourcesContent":["import { Button, Loader, Table } from '@mantine/core';\nimport { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from './FhirPathDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { SearchClickEvent } from './SearchControl';\nimport { isCheckboxCell, killEvent } from './utils/dom';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data?.ResourceList?.length === 0 && <div data-testid=\"empty-search\">No results</div>}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { OperationOutcome } from '@medplum/fhirtypes';
2
2
  import React from 'react';
3
- import './FormSection.css';
4
3
  export interface FormSectionProps {
5
4
  title?: string;
6
5
  htmlFor?: string;
@@ -1,17 +1,9 @@
1
+ import { Input } from '@mantine/core';
1
2
  import React from 'react';
2
- import { getIssuesForExpression } from './utils/outcomes.js';
3
+ import { getErrorsForInput } from './utils/outcomes.js';
3
4
 
4
5
  function FormSection(props) {
5
- const issues = getIssuesForExpression(props.outcome, props.htmlFor);
6
- const invalid = issues && issues.length > 0;
7
- return (React.createElement("fieldset", { className: "medplum-form-section" },
8
- props.title && React.createElement("label", { htmlFor: props.htmlFor }, props.title),
9
- props.description && React.createElement("p", null, props.description),
10
- props.children,
11
- invalid && (React.createElement("div", { id: props.htmlFor + '-errors', className: "medplum-input-error" }, issues === null || issues === void 0 ? void 0 : issues.map((issue) => {
12
- var _a, _b;
13
- 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));
14
- })))));
6
+ return (React.createElement(Input.Wrapper, { id: props.htmlFor, label: props.title, description: props.description, error: getErrorsForInput(props.outcome, props.htmlFor) }, props.children));
15
7
  }
16
8
 
17
9
  export { FormSection };
@@ -1 +1 @@
1
- {"version":3,"file":"FormSection.js","sources":["../../src/FormSection.tsx"],"sourcesContent":["import { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './FormSection.css';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n const issues = getIssuesForExpression(props.outcome, props.htmlFor);\n const invalid = issues && issues.length > 0;\n return (\n <fieldset className=\"medplum-form-section\">\n {props.title && <label htmlFor={props.htmlFor}>{props.title}</label>}\n {props.description && <p>{props.description}</p>}\n {props.children}\n {invalid && (\n <div id={props.htmlFor + '-errors'} 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 </fieldset>\n );\n}\n"],"names":[],"mappings":";;;AAaM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAU,SAAS,EAAC,sBAAsB,EAAA;AACvC,QAAA,KAAK,CAAC,KAAK,IAAI,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,OAAO,EAAE,KAAK,CAAC,OAAO,EAAA,EAAG,KAAK,CAAC,KAAK,CAAS;AACnE,QAAA,KAAK,CAAC,WAAW,IAAI,+BAAI,KAAK,CAAC,WAAW,CAAK;AAC/C,QAAA,KAAK,CAAC,QAAQ;QACd,OAAO,KACN,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,EAAE,EAAE,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,SAAS,EAAC,qBAAqB,EAChE,EAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,GAAG,CAAC,CAAC,KAAK,KAAI;;YAAC,QACtB,4CAAiB,kBAAkB,EAAC,GAAG,EAAE,CAAA,EAAA,GAAA,KAAK,CAAC,OAAO,0CAAE,IAAI,EAAA,EACzD,MAAA,KAAK,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,CAChB,EACP;AAAA,SAAA,CAAC,CACE,CACP,CACQ,EACX;AACJ;;;;"}
1
+ {"version":3,"file":"FormSection.js","sources":["../../src/FormSection.tsx"],"sourcesContent":["import { Input } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from './utils/outcomes';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n return (\n <Input.Wrapper\n id={props.htmlFor}\n label={props.title}\n description={props.description}\n error={getErrorsForInput(props.outcome, props.htmlFor)}\n >\n {props.children}\n </Input.Wrapper>\n );\n}\n"],"names":[],"mappings":";;;;AAaM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,CAAC,OAAO,EAAA,EACZ,EAAE,EAAE,KAAK,CAAC,OAAO,EACjB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAErD,EAAA,KAAK,CAAC,QAAQ,CACD,EAChB;AACJ;;;;"}
@@ -1,12 +1,10 @@
1
+ import { TextProps } from '@mantine/core';
1
2
  import { Reference, Resource } from '@medplum/fhirtypes';
2
3
  import React from 'react';
3
- export interface MedplumLinkProps {
4
+ export interface MedplumLinkProps extends TextProps {
4
5
  to?: Resource | Reference | string;
5
6
  suffix?: string;
6
7
  label?: string;
7
- id?: string;
8
- testid?: string;
9
- className?: string;
10
8
  onClick?: () => void;
11
9
  children: React.ReactNode;
12
10
  }
@@ -1,22 +1,25 @@
1
+ import { __rest } from './node_modules/tslib/tslib.es6.js';
2
+ import { Anchor } from '@mantine/core';
1
3
  import React from 'react';
2
4
  import { useNavigate } from 'react-router-dom';
3
5
  import { killEvent } from './utils/dom.js';
4
6
 
5
7
  function MedplumLink(props) {
6
8
  const navigate = useNavigate();
7
- let href = getHref(props.to);
8
- if (props.suffix) {
9
- href += '/' + props.suffix;
9
+ const { to, suffix, label, onClick, children } = props, rest = __rest(props, ["to", "suffix", "label", "onClick", "children"]);
10
+ let href = getHref(to);
11
+ if (suffix) {
12
+ href += '/' + suffix;
10
13
  }
11
- return (React.createElement("a", { href: href, id: props.id, "aria-label": props.label, "data-testid": props.testid || 'link', className: props.className, onClick: (e) => {
14
+ return (React.createElement(Anchor, Object.assign({ href: href, "aria-label": label, onClick: (e) => {
12
15
  killEvent(e);
13
- if (props.onClick) {
14
- props.onClick();
16
+ if (onClick) {
17
+ onClick();
15
18
  }
16
- else if (props.to) {
19
+ else if (to) {
17
20
  navigate(href);
18
21
  }
19
- } }, props.children));
22
+ } }, rest), children));
20
23
  }
21
24
  function getHref(to) {
22
25
  if (to) {
@@ -1 +1 @@
1
- {"version":3,"file":"MedplumLink.js","sources":["../../src/MedplumLink.tsx"],"sourcesContent":["import { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { killEvent } from './utils/dom';\n\nexport interface MedplumLinkProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n id?: string;\n testid?: string;\n className?: string;\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useNavigate();\n\n let href = getHref(props.to);\n if (props.suffix) {\n href += '/' + props.suffix;\n }\n\n return (\n <a\n href={href}\n id={props.id}\n aria-label={props.label}\n data-testid={props.testid || 'link'}\n className={props.className}\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n if (props.onClick) {\n props.onClick();\n } else if (props.to) {\n navigate(href);\n }\n }}\n >\n {props.children}\n </a>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if ('resourceType' in to) {\n return getResourceHref(to);\n } else if ('reference' in to) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n"],"names":[],"mappings":";;;;AAgBM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,EAAE;AAChB,QAAA,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,KAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EACE,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,KAAK,CAAC,EAAE,EACA,YAAA,EAAA,KAAK,CAAC,KAAK,EAAA,aAAA,EACV,KAAK,CAAC,MAAM,IAAI,MAAM,EACnC,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,OAAO,EAAE,CAAC,CAAuB,KAAI;YACnC,SAAS,CAAC,CAAC,CAAC,CAAC;YACb,IAAI,KAAK,CAAC,OAAO,EAAE;gBACjB,KAAK,CAAC,OAAO,EAAE,CAAC;AACjB,aAAA;iBAAM,IAAI,KAAK,CAAC,EAAE,EAAE;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChB,aAAA;AACH,SAAC,IAEA,KAAK,CAAC,QAAQ,CACb,EACJ;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,EAA6C,EAAA;AAC5D,IAAA,IAAI,EAAE,EAAE;AACN,QAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;AAC1B,YAAA,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC1B,SAAA;aAAM,IAAI,cAAc,IAAI,EAAE,EAAE;AAC/B,YAAA,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC;AAC5B,SAAA;aAAM,IAAI,WAAW,IAAI,EAAE,EAAE;AAC5B,YAAA,OAAO,gBAAgB,CAAC,EAAE,CAAC,CAAC;AAC7B,SAAA;AACF,KAAA;AACD,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,EAAU,EAAA;IAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC/E,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;IACD,OAAO,GAAG,GAAG,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,EAAY,EAAA;IACnC,OAAO,CAAA,CAAA,EAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAA,CAAE,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAa,EAAA;AACrC,IAAA,OAAO,CAAI,CAAA,EAAA,EAAE,CAAC,SAAS,EAAE,CAAC;AAC5B;;;;"}
1
+ {"version":3,"file":"MedplumLink.js","sources":["../../src/MedplumLink.tsx"],"sourcesContent":["import { Anchor, TextProps } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { killEvent } from './utils/dom';\n\nexport interface MedplumLinkProps extends TextProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useNavigate();\n const { to, suffix, label, onClick, children, ...rest } = props;\n\n let href = getHref(to);\n if (suffix) {\n href += '/' + suffix;\n }\n\n return (\n <Anchor\n href={href}\n aria-label={label}\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n if (onClick) {\n onClick();\n } else if (to) {\n navigate(href);\n }\n }}\n {...rest}\n >\n {children}\n </Anchor>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if ('resourceType' in to) {\n return getResourceHref(to);\n } else if ('reference' in to) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n"],"names":[],"mappings":";;;;;;AAcM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;AAC/B,IAAA,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAc,GAAA,KAAK,EAAd,IAAI,GAAA,MAAA,CAAK,KAAK,EAAzD,CAAA,IAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,CAAiD,CAAQ,CAAC;AAEhE,IAAA,IAAI,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;AACvB,IAAA,IAAI,MAAM,EAAE;AACV,QAAA,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC;AACtB,KAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,MAAA,CAAA,MAAA,CAAA,EACL,IAAI,EAAE,IAAI,EACE,YAAA,EAAA,KAAK,EACjB,OAAO,EAAE,CAAC,CAAuB,KAAI;YACnC,SAAS,CAAC,CAAC,CAAC,CAAC;AACb,YAAA,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,EAAE,CAAC;AACX,aAAA;AAAM,iBAAA,IAAI,EAAE,EAAE;gBACb,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChB,aAAA;AACH,SAAC,IACG,IAAI,CAAA,EAEP,QAAQ,CACF,EACT;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,EAA6C,EAAA;AAC5D,IAAA,IAAI,EAAE,EAAE;AACN,QAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;AAC1B,YAAA,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC1B,SAAA;aAAM,IAAI,cAAc,IAAI,EAAE,EAAE;AAC/B,YAAA,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC;AAC5B,SAAA;aAAM,IAAI,WAAW,IAAI,EAAE,EAAE;AAC5B,YAAA,OAAO,gBAAgB,CAAC,EAAE,CAAC,CAAC;AAC7B,SAAA;AACF,KAAA;AACD,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,EAAU,EAAA;IAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC/E,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;IACD,OAAO,GAAG,GAAG,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,EAAY,EAAA;IACnC,OAAO,CAAA,CAAA,EAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAA,CAAE,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAa,EAAA;AACrC,IAAA,OAAO,CAAI,CAAA,EAAA,EAAE,CAAC,SAAS,EAAE,CAAC;AAC5B;;;;"}
@@ -1,7 +1,8 @@
1
- import { TextInput, Button, NativeSelect } from '@mantine/core';
1
+ import { createStyles, TextInput, Button, Stack, NativeSelect } from '@mantine/core';
2
2
  import { getReferenceString } from '@medplum/core';
3
3
  import React, { useState, useRef, useEffect } from 'react';
4
4
  import { Form } from './Form.js';
5
+ import { FormSection } from './FormSection.js';
5
6
  import { useMedplum } from './MedplumProvider.js';
6
7
  import { ReferenceDisplay } from './ReferenceDisplay.js';
7
8
  import { setPropertyValue } from './ResourceForm.js';
@@ -11,6 +12,32 @@ import { ResourcePropertyInput } from './ResourcePropertyInput.js';
11
12
  import { useResource } from './useResource.js';
12
13
  import { killEvent } from './utils/dom.js';
13
14
 
15
+ const useStyles = createStyles((theme) => ({
16
+ section: {
17
+ position: 'relative',
18
+ margin: '4px 4px 8px 0',
19
+ padding: '6px 12px 16px 6px',
20
+ border: `1.5px solid ${theme.colors.gray[1]}`,
21
+ borderRadius: theme.radius.sm,
22
+ transition: 'all 0.1s',
23
+ },
24
+ hovering: {
25
+ border: `1.5px solid ${theme.colors.blue[5]}`,
26
+ },
27
+ editing: {
28
+ border: `1.5px solid ${theme.colors.gray[1]}`,
29
+ borderLeft: `4px solid ${theme.colors.blue[5]}`,
30
+ },
31
+ bottomActions: {
32
+ position: 'absolute',
33
+ right: 4,
34
+ bottom: 0,
35
+ fontSize: theme.fontSizes.xs,
36
+ '& a': {
37
+ marginLeft: 8,
38
+ },
39
+ },
40
+ }));
14
41
  function PlanDefinitionBuilder(props) {
15
42
  const medplum = useMedplum();
16
43
  const defaultValue = useResource(props.value);
@@ -44,13 +71,14 @@ function PlanDefinitionBuilder(props) {
44
71
  function changeProperty(property, newValue) {
45
72
  setValue(Object.assign(Object.assign({}, valueRef.current), { [property]: newValue }));
46
73
  }
47
- return (React.createElement("div", { className: "medplum-questionnaire-builder" },
74
+ return (React.createElement("div", null,
48
75
  React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
49
76
  React.createElement(TextInput, { label: "Plan Title", defaultValue: value.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
50
77
  React.createElement(ActionArrayBuilder, { actions: value.action || [], selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: (x) => changeProperty('action', x) }),
51
78
  React.createElement(Button, { type: "submit" }, "Save"))));
52
79
  }
53
80
  function ActionArrayBuilder(props) {
81
+ const { classes } = useStyles();
54
82
  const actionsRef = useRef();
55
83
  actionsRef.current = props.actions;
56
84
  function changeAction(changedAction) {
@@ -63,16 +91,17 @@ function ActionArrayBuilder(props) {
63
91
  function removeAction(removedAction) {
64
92
  props.onChange(actionsRef.current.filter((i) => i !== removedAction));
65
93
  }
66
- return (React.createElement("div", { className: "section" },
94
+ return (React.createElement("div", { className: classes.section },
67
95
  props.actions.map((action) => (React.createElement("div", { key: action.id },
68
96
  React.createElement(ActionBuilder, { action: action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeAction, onRemove: () => removeAction(action) })))),
69
- React.createElement("div", { className: "bottom-actions" },
97
+ React.createElement("div", { className: classes.bottomActions },
70
98
  React.createElement("a", { href: "#", onClick: (e) => {
71
99
  killEvent(e);
72
100
  addAction({ id: generateId() });
73
101
  } }, "Add action"))));
74
102
  }
75
103
  function ActionBuilder(props) {
104
+ const { classes, cx } = useStyles();
76
105
  const { action } = props;
77
106
  const actionType = getInitialActionType(action);
78
107
  const editing = props.selectedKey === props.action.id;
@@ -85,10 +114,13 @@ function ActionBuilder(props) {
85
114
  killEvent(e);
86
115
  props.setHoverKey(props.action.id);
87
116
  }
88
- const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';
117
+ const className = cx(classes.section, {
118
+ [classes.editing]: editing,
119
+ [classes.hovering]: hovering && !editing,
120
+ });
89
121
  return (React.createElement("div", { "data-testid": action.id, className: className, onClick: onClick, onMouseOver: onHover },
90
122
  editing ? (React.createElement(ActionEditor, { action: action, actionType: actionType, onChange: props.onChange, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onRemove: props.onRemove })) : (React.createElement(ActionDisplay, { action: action, actionType: actionType })),
91
- React.createElement("div", { className: "bottom-actions" },
123
+ React.createElement("div", { className: classes.bottomActions },
92
124
  React.createElement("a", { href: "#", onClick: (e) => {
93
125
  e.preventDefault();
94
126
  props.onRemove();
@@ -119,7 +151,7 @@ function ActionEditor(props) {
119
151
  function changeProperty(property, value) {
120
152
  props.onChange(Object.assign(Object.assign({}, action), { [property]: value }));
121
153
  }
122
- return (React.createElement(React.Fragment, null,
154
+ return (React.createElement(Stack, { spacing: "xl" },
123
155
  React.createElement(TextInput, { name: `actionTitle-${action.id}`, label: "Title", defaultValue: action.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
124
156
  React.createElement(TextInput, { name: `actionDescription-${action.id}`, label: "Description", defaultValue: action.description, onChange: (e) => changeProperty('description', e.currentTarget.value) }),
125
157
  React.createElement(NativeSelect, { label: "Type of Action", description: "The type of the action to be performed.", name: `actionType-${action.id}`, defaultValue: actionType, onChange: (e) => setActionType(e.currentTarget.value), data: ['', 'appointment', 'lab', 'questionnaire', 'task'] }),
@@ -138,9 +170,8 @@ function ActionEditor(props) {
138
170
  return null;
139
171
  }
140
172
  })(),
141
- React.createElement("p", null, "Timing"),
142
- React.createElement("p", null, "When the action should take place."),
143
- React.createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange })));
173
+ React.createElement(FormSection, { title: "Timing", description: "When the action should take place." },
174
+ React.createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange }))));
144
175
  }
145
176
  function ActionResourceTypeBuilder(props) {
146
177
  const { id, definitionCanonical } = props.action;
@@ -1 +1 @@
1
- {"version":3,"file":"PlanDefinitionBuilder.js","sources":["../../src/PlanDefinitionBuilder.tsx"],"sourcesContent":["import { Button, NativeSelect, TextInput } from '@mantine/core';\nimport { getReferenceString, IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { ElementDefinition, PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from './Form';\nimport { useMedplum } from './MedplumProvider';\nimport { ReferenceDisplay } from './ReferenceDisplay';\nimport { setPropertyValue } from './ResourceForm';\nimport { ResourceInput } from './ResourceInput';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>(undefined);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className=\"section\">\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </a>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: React.SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n}\n\nconst timingProperty: ElementDefinition = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: '1',\n type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <>\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <p>Timing</p>\n <p>When the action should take place.</p>\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, PropertyType] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PlanDefinitionBuilder.js","sources":["../../src/PlanDefinitionBuilder.tsx"],"sourcesContent":["import { Button, createStyles, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { getReferenceString, IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { ElementDefinition, PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { useMedplum } from './MedplumProvider';\nimport { ReferenceDisplay } from './ReferenceDisplay';\nimport { setPropertyValue } from './ResourceForm';\nimport { ResourceInput } from './ResourceInput';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n}));\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>(undefined);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const { classes } = useStyles();\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className={classes.section}>\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className={classes.bottomActions}>\n <a\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </a>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { classes, cx } = useStyles();\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: React.SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className={classes.bottomActions}>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n}\n\nconst timingProperty: ElementDefinition = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: '1',\n type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <Stack spacing=\"xl\">\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\">\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </Stack>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, PropertyType] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { Questionnaire, Reference } from '@medplum/fhirtypes';
3
- import './QuestionnaireBuilder.css';
4
3
  export interface QuestionnaireBuilderProps {
5
4
  questionnaire: Questionnaire | Reference<Questionnaire>;
6
5
  onSubmit: (result: Questionnaire) => void;