@medplum/react 2.0.2 → 2.0.3

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 (305) hide show
  1. package/dist/cjs/OperationOutcomeAlert/OperationOutcomeAlert.d.ts +2 -1
  2. package/dist/cjs/ResourceDiffTable/ResourceDiffTable.stories.d.ts +5 -0
  3. package/dist/cjs/ResourceTable/ResourceTable.d.ts +13 -0
  4. package/dist/cjs/ResourceTimeline/ResourceTimeline.d.ts +2 -2
  5. package/dist/cjs/index.cjs +1833 -1211
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/index.d.ts +1 -0
  8. package/dist/cjs/index.min.cjs +1 -1
  9. package/dist/cjs/useResource/useResource.d.ts +2 -2
  10. package/dist/cjs/utils/date.d.ts +2 -1
  11. package/dist/esm/AddressDisplay/AddressDisplay.mjs +2 -2
  12. package/dist/esm/AddressDisplay/AddressDisplay.mjs.map +1 -1
  13. package/dist/esm/AddressInput/AddressInput.mjs +9 -9
  14. package/dist/esm/AddressInput/AddressInput.mjs.map +1 -1
  15. package/dist/esm/AnnotationInput/AnnotationInput.mjs +2 -2
  16. package/dist/esm/AnnotationInput/AnnotationInput.mjs.map +1 -1
  17. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs +2 -2
  18. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +1 -1
  19. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs +4 -4
  20. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs.map +1 -1
  21. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs +20 -19
  22. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs.map +1 -1
  23. package/dist/esm/AttachmentButton/AttachmentButton.mjs +3 -3
  24. package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +1 -1
  25. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs +9 -9
  26. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs.map +1 -1
  27. package/dist/esm/AttachmentInput/AttachmentInput.mjs +5 -5
  28. package/dist/esm/AttachmentInput/AttachmentInput.mjs.map +1 -1
  29. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs +6 -6
  30. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs.map +1 -1
  31. package/dist/esm/BackboneElementInput/BackboneElementInput.mjs +7 -7
  32. package/dist/esm/BackboneElementInput/BackboneElementInput.mjs.map +1 -1
  33. package/dist/esm/CalendarInput/CalendarInput.mjs +18 -18
  34. package/dist/esm/CalendarInput/CalendarInput.mjs.map +1 -1
  35. package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs +5 -5
  36. package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs.map +1 -1
  37. package/dist/esm/CodeInput/CodeInput.mjs +2 -2
  38. package/dist/esm/CodeInput/CodeInput.mjs.map +1 -1
  39. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs +2 -2
  40. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs.map +1 -1
  41. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs +2 -2
  42. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs.map +1 -1
  43. package/dist/esm/CodingDisplay/CodingDisplay.mjs +2 -2
  44. package/dist/esm/CodingDisplay/CodingDisplay.mjs.map +1 -1
  45. package/dist/esm/CodingInput/CodingInput.mjs +2 -2
  46. package/dist/esm/CodingInput/CodingInput.mjs.map +1 -1
  47. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs +3 -3
  48. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs.map +1 -1
  49. package/dist/esm/ContactDetailInput/ContactDetailInput.mjs +4 -4
  50. package/dist/esm/ContactDetailInput/ContactDetailInput.mjs.map +1 -1
  51. package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs +2 -2
  52. package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs.map +1 -1
  53. package/dist/esm/ContactPointInput/ContactPointInput.mjs +5 -5
  54. package/dist/esm/ContactPointInput/ContactPointInput.mjs.map +1 -1
  55. package/dist/esm/Container/Container.mjs +2 -2
  56. package/dist/esm/Container/Container.mjs.map +1 -1
  57. package/dist/esm/DateTimeInput/DateTimeInput.mjs +2 -2
  58. package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +1 -1
  59. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs +3 -7
  60. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +1 -1
  61. package/dist/esm/DescriptionList/DescriptionList.mjs +5 -5
  62. package/dist/esm/DescriptionList/DescriptionList.mjs.map +1 -1
  63. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs +49 -49
  64. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs.map +1 -1
  65. package/dist/esm/Document/Document.mjs +3 -3
  66. package/dist/esm/Document/Document.mjs.map +1 -1
  67. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs +7 -7
  68. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +1 -1
  69. package/dist/esm/ErrorBoundary/ErrorBoundary.mjs +4 -4
  70. package/dist/esm/ErrorBoundary/ErrorBoundary.mjs.map +1 -1
  71. package/dist/esm/ExtensionInput/ExtensionInput.mjs +2 -2
  72. package/dist/esm/ExtensionInput/ExtensionInput.mjs.map +1 -1
  73. package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs +2 -2
  74. package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs.map +1 -1
  75. package/dist/esm/FhirPathTable/FhirPathTable.mjs +19 -19
  76. package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +1 -1
  77. package/dist/esm/Form/Form.mjs +2 -2
  78. package/dist/esm/Form/Form.mjs.map +1 -1
  79. package/dist/esm/FormSection/FormSection.mjs +2 -2
  80. package/dist/esm/FormSection/FormSection.mjs.map +1 -1
  81. package/dist/esm/GoogleButton/GoogleButton.mjs +4 -4
  82. package/dist/esm/GoogleButton/GoogleButton.mjs.map +1 -1
  83. package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs +2 -2
  84. package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs.map +1 -1
  85. package/dist/esm/HumanNameInput/HumanNameInput.mjs +7 -7
  86. package/dist/esm/HumanNameInput/HumanNameInput.mjs.map +1 -1
  87. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs +2 -2
  88. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs.map +1 -1
  89. package/dist/esm/IdentifierInput/IdentifierInput.mjs +4 -4
  90. package/dist/esm/IdentifierInput/IdentifierInput.mjs.map +1 -1
  91. package/dist/esm/Logo/Logo.mjs +8 -8
  92. package/dist/esm/Logo/Logo.mjs.map +1 -1
  93. package/dist/esm/MedplumLink/MedplumLink.mjs +2 -2
  94. package/dist/esm/MedplumLink/MedplumLink.mjs.map +1 -1
  95. package/dist/esm/MedplumProvider/MedplumProvider.mjs +2 -2
  96. package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +1 -1
  97. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs +2 -2
  98. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs.map +1 -1
  99. package/dist/esm/MoneyInput/MoneyInput.mjs +4 -4
  100. package/dist/esm/MoneyInput/MoneyInput.mjs.map +1 -1
  101. package/dist/esm/NoteDisplay/NoteDisplay.mjs +2 -2
  102. package/dist/esm/NoteDisplay/NoteDisplay.mjs.map +1 -1
  103. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.d.ts +2 -1
  104. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs +5 -4
  105. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs.map +1 -1
  106. package/dist/esm/Panel/Panel.mjs +2 -2
  107. package/dist/esm/Panel/Panel.mjs.map +1 -1
  108. package/dist/esm/PatientTimeline/PatientTimeline.mjs +12 -12
  109. package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +1 -1
  110. package/dist/esm/PeriodInput/PeriodInput.mjs +4 -4
  111. package/dist/esm/PeriodInput/PeriodInput.mjs.map +1 -1
  112. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs +34 -34
  113. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +1 -1
  114. package/dist/esm/QuantityDisplay/QuantityDisplay.mjs +2 -2
  115. package/dist/esm/QuantityDisplay/QuantityDisplay.mjs.map +1 -1
  116. package/dist/esm/QuantityInput/QuantityInput.mjs +5 -5
  117. package/dist/esm/QuantityInput/QuantityInput.mjs.map +1 -1
  118. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs +31 -31
  119. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +1 -1
  120. package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs +32 -32
  121. package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs.map +1 -1
  122. package/dist/esm/RangeDisplay/RangeDisplay.mjs +2 -2
  123. package/dist/esm/RangeDisplay/RangeDisplay.mjs.map +1 -1
  124. package/dist/esm/RangeInput/RangeInput.mjs +4 -4
  125. package/dist/esm/RangeInput/RangeInput.mjs.map +1 -1
  126. package/dist/esm/RatioDisplay/RatioDisplay.mjs +4 -4
  127. package/dist/esm/RatioDisplay/RatioDisplay.mjs.map +1 -1
  128. package/dist/esm/RatioInput/RatioInput.mjs +4 -4
  129. package/dist/esm/RatioInput/RatioInput.mjs.map +1 -1
  130. package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs +3 -3
  131. package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs.map +1 -1
  132. package/dist/esm/ReferenceInput/ReferenceInput.mjs +4 -4
  133. package/dist/esm/ReferenceInput/ReferenceInput.mjs.map +1 -1
  134. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs +32 -31
  135. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +1 -1
  136. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs +16 -15
  137. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs.map +1 -1
  138. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs +3 -3
  139. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs.map +1 -1
  140. package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs +19 -18
  141. package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs.map +1 -1
  142. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs +4 -4
  143. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs.map +1 -1
  144. package/dist/esm/ResourceBadge/ResourceBadge.mjs +4 -4
  145. package/dist/esm/ResourceBadge/ResourceBadge.mjs.map +1 -1
  146. package/dist/esm/ResourceBlame/ResourceBlame.mjs +13 -13
  147. package/dist/esm/ResourceBlame/ResourceBlame.mjs.map +1 -1
  148. package/dist/esm/ResourceDiff/ResourceDiff.mjs +7 -7
  149. package/dist/esm/ResourceDiff/ResourceDiff.mjs.map +1 -1
  150. package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs +18 -18
  151. package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs.map +1 -1
  152. package/dist/esm/ResourceDiffTable/ResourceDiffTable.stories.d.ts +5 -0
  153. package/dist/esm/ResourceForm/ResourceForm.mjs +12 -12
  154. package/dist/esm/ResourceForm/ResourceForm.mjs.map +1 -1
  155. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs +17 -17
  156. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs.map +1 -1
  157. package/dist/esm/ResourceInput/ResourceInput.mjs +8 -8
  158. package/dist/esm/ResourceInput/ResourceInput.mjs.map +1 -1
  159. package/dist/esm/ResourceName/ResourceName.mjs +2 -2
  160. package/dist/esm/ResourceName/ResourceName.mjs.map +1 -1
  161. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +26 -26
  162. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +1 -1
  163. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs +34 -34
  164. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +1 -1
  165. package/dist/esm/ResourceTable/ResourceTable.d.ts +13 -0
  166. package/dist/esm/ResourceTable/ResourceTable.mjs +5 -2
  167. package/dist/esm/ResourceTable/ResourceTable.mjs.map +1 -1
  168. package/dist/esm/ResourceTimeline/ResourceTimeline.d.ts +2 -2
  169. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs +105 -76
  170. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +1 -1
  171. package/dist/esm/Scheduler/Scheduler.mjs +22 -22
  172. package/dist/esm/Scheduler/Scheduler.mjs.map +1 -1
  173. package/dist/esm/SearchControl/SearchControl.mjs +55 -49
  174. package/dist/esm/SearchControl/SearchControl.mjs.map +1 -1
  175. package/dist/esm/SearchControl/SearchUtils.mjs +4 -4
  176. package/dist/esm/SearchControl/SearchUtils.mjs.map +1 -1
  177. package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs +25 -25
  178. package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +1 -1
  179. package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs +37 -37
  180. package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs.map +1 -1
  181. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs +6 -6
  182. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs.map +1 -1
  183. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs +4 -4
  184. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs.map +1 -1
  185. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs +8 -8
  186. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs.map +1 -1
  187. package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs +75 -62
  188. package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs.map +1 -1
  189. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs +8 -8
  190. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +1 -1
  191. package/dist/esm/StatusBadge/StatusBadge.mjs +2 -2
  192. package/dist/esm/StatusBadge/StatusBadge.mjs.map +1 -1
  193. package/dist/esm/Timeline/Timeline.mjs +20 -20
  194. package/dist/esm/Timeline/Timeline.mjs.map +1 -1
  195. package/dist/esm/TimingInput/TimingInput.mjs +19 -19
  196. package/dist/esm/TimingInput/TimingInput.mjs.map +1 -1
  197. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +2 -2
  198. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +1 -1
  199. package/dist/esm/auth/AuthenticationForm.mjs +22 -22
  200. package/dist/esm/auth/AuthenticationForm.mjs.map +1 -1
  201. package/dist/esm/auth/ChooseProfileForm.mjs +11 -11
  202. package/dist/esm/auth/ChooseProfileForm.mjs.map +1 -1
  203. package/dist/esm/auth/ChooseScopeForm.mjs +9 -9
  204. package/dist/esm/auth/ChooseScopeForm.mjs.map +1 -1
  205. package/dist/esm/auth/MfaForm.mjs +12 -12
  206. package/dist/esm/auth/MfaForm.mjs.map +1 -1
  207. package/dist/esm/auth/NewProjectForm.mjs +12 -12
  208. package/dist/esm/auth/NewProjectForm.mjs.map +1 -1
  209. package/dist/esm/auth/NewUserForm.mjs +22 -22
  210. package/dist/esm/auth/NewUserForm.mjs.map +1 -1
  211. package/dist/esm/auth/RegisterForm.mjs +5 -5
  212. package/dist/esm/auth/RegisterForm.mjs.map +1 -1
  213. package/dist/esm/auth/SignInForm.mjs +8 -8
  214. package/dist/esm/auth/SignInForm.mjs.map +1 -1
  215. package/dist/esm/index.d.ts +1 -0
  216. package/dist/esm/index.min.mjs +1 -1
  217. package/dist/esm/index.mjs +1 -0
  218. package/dist/esm/index.mjs.map +1 -1
  219. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs +69 -0
  220. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs.map +1 -0
  221. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs +18 -0
  222. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs.map +1 -0
  223. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs +24 -0
  224. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs.map +1 -0
  225. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs +14 -0
  226. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs.map +1 -0
  227. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs +18 -0
  228. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs.map +1 -0
  229. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs +19 -0
  230. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs.map +1 -0
  231. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs +25 -0
  232. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs.map +1 -0
  233. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs +16 -0
  234. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs.map +1 -0
  235. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs +19 -0
  236. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs.map +1 -0
  237. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs +26 -0
  238. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs.map +1 -0
  239. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs +23 -0
  240. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs.map +1 -0
  241. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs +12 -0
  242. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs.map +1 -0
  243. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs +19 -0
  244. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs.map +1 -0
  245. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs +13 -0
  246. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs.map +1 -0
  247. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs +14 -0
  248. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs.map +1 -0
  249. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs +20 -0
  250. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs.map +1 -0
  251. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs +19 -0
  252. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs.map +1 -0
  253. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs +19 -0
  254. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs.map +1 -0
  255. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs +14 -0
  256. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs.map +1 -0
  257. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs +26 -0
  258. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs.map +1 -0
  259. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs +13 -0
  260. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs.map +1 -0
  261. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs +14 -0
  262. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs.map +1 -0
  263. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs +21 -0
  264. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs.map +1 -0
  265. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs +21 -0
  266. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs.map +1 -0
  267. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs +18 -0
  268. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs.map +1 -0
  269. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs +29 -0
  270. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs.map +1 -0
  271. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs +12 -0
  272. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs.map +1 -0
  273. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs +12 -0
  274. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs.map +1 -0
  275. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs +20 -0
  276. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs.map +1 -0
  277. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs +20 -0
  278. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs.map +1 -0
  279. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs +21 -0
  280. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs.map +1 -0
  281. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs +19 -0
  282. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs.map +1 -0
  283. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs +16 -0
  284. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs.map +1 -0
  285. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs +16 -0
  286. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs.map +1 -0
  287. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs +18 -0
  288. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs.map +1 -0
  289. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs +18 -0
  290. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs.map +1 -0
  291. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs +19 -0
  292. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs.map +1 -0
  293. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs +13 -0
  294. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs.map +1 -0
  295. package/dist/esm/useResource/useResource.d.ts +2 -2
  296. package/dist/esm/useResource/useResource.mjs +62 -42
  297. package/dist/esm/useResource/useResource.mjs.map +1 -1
  298. package/dist/esm/utils/date.d.ts +2 -1
  299. package/dist/esm/utils/date.mjs +31 -25
  300. package/dist/esm/utils/date.mjs.map +1 -1
  301. package/icons-unique.txt +36 -0
  302. package/icons.txt +44 -0
  303. package/package.json +6 -6
  304. package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs +0 -6
  305. package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs.map +0 -1
@@ -1,7 +1,6 @@
1
1
  import { createStyles, Center, Loader, Group, Button, Text, Table, Menu, UnstyledButton, Pagination } from '@mantine/core';
2
2
  import { formatSearchQuery, globalSchema, DEFAULT_SEARCH_COUNT } from '@medplum/core';
3
- import { IconFilter as R0, IconColumns as sF, IconFilePlus as X_, IconTableExport as _Ae, IconTrash as zKe, IconBoxMultiple as bw, IconAdjustmentsHorizontal as oe } from '../node_modules/@tabler/icons/icons-react/dist/index.esm.mjs';
4
- import e__default, { useState, useRef, useEffect } from 'react';
3
+ import React, { useState, useRef, useEffect } from 'react';
5
4
  import { Container } from '../Container/Container.mjs';
6
5
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
7
6
  import { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor.mjs';
@@ -12,6 +11,13 @@ import { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu.mjs';
12
11
  import { isCheckboxCell, killEvent } from '../utils/dom.mjs';
13
12
  import { getFieldDefinitions } from './SearchControlField.mjs';
14
13
  import { buildFieldNameString, renderValue, setPage, addFilter, getOpString } from './SearchUtils.mjs';
14
+ import IconFilter from '../node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs';
15
+ import IconColumns from '../node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs';
16
+ import IconFilePlus from '../node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs';
17
+ import IconTableExport from '../node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs';
18
+ import IconTrash from '../node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs';
19
+ import IconBoxMultiple from '../node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs';
20
+ import IconAdjustmentsHorizontal from '../node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs';
15
21
 
16
22
  class SearchChangeEvent extends Event {
17
23
  constructor(definition) {
@@ -178,8 +184,8 @@ function SearchControl(props) {
178
184
  }, [medplum, props.search.resourceType]);
179
185
  const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];
180
186
  if (!typeSchema) {
181
- return (e__default.createElement(Center, { style: { width: '100%', height: '100%' } },
182
- e__default.createElement(Loader, null)));
187
+ return (React.createElement(Center, { style: { width: '100%', height: '100%' } },
188
+ React.createElement(Loader, null)));
183
189
  }
184
190
  const checkboxColumn = props.checkboxesEnabled;
185
191
  const fields = getFieldDefinitions(search);
@@ -191,36 +197,36 @@ function SearchControl(props) {
191
197
  const buttonColor = 'gray';
192
198
  const iconSize = 16;
193
199
  const isMobile = window.innerWidth < 768;
194
- return (e__default.createElement("div", { className: classes.root, "data-testid": "search-control" },
195
- !props.hideToolbar && (e__default.createElement(Group, { position: "apart", mb: "xl" },
196
- e__default.createElement(Group, { spacing: 2 },
197
- e__default.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: e__default.createElement(R0, { size: iconSize }), onClick: () => setState({ ...stateRef.current, fieldEditorVisible: true }) }, "Fields"),
198
- e__default.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: e__default.createElement(sF, { size: iconSize }), onClick: () => setState({ ...stateRef.current, filterEditorVisible: true }) }, "Filters"),
199
- props.onNew && (e__default.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: e__default.createElement(X_, { size: iconSize }), onClick: props.onNew }, "New...")),
200
- !isMobile && props.onExport && (e__default.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: e__default.createElement(_Ae, { size: iconSize }), onClick: props.onExport }, "Export...")),
201
- !isMobile && props.onDelete && (e__default.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: e__default.createElement(zKe, { size: iconSize }), onClick: () => props.onDelete(Object.keys(state.selected)) }, "Delete...")),
202
- !isMobile && props.onBulk && (e__default.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: e__default.createElement(bw, { size: iconSize }), onClick: () => props.onBulk(Object.keys(state.selected)) }, "Bulk..."))),
203
- lastResult && (e__default.createElement(Text, { size: "xs", color: "dimmed" },
200
+ return (React.createElement("div", { className: classes.root, "data-testid": "search-control" },
201
+ !props.hideToolbar && (React.createElement(Group, { position: "apart", mb: "xl" },
202
+ React.createElement(Group, { spacing: 2 },
203
+ React.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(IconFilter, { size: iconSize }), onClick: () => setState({ ...stateRef.current, fieldEditorVisible: true }) }, "Fields"),
204
+ React.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(IconColumns, { size: iconSize }), onClick: () => setState({ ...stateRef.current, filterEditorVisible: true }) }, "Filters"),
205
+ props.onNew && (React.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(IconFilePlus, { size: iconSize }), onClick: props.onNew }, "New...")),
206
+ !isMobile && props.onExport && (React.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(IconTableExport, { size: iconSize }), onClick: props.onExport }, "Export...")),
207
+ !isMobile && props.onDelete && (React.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(IconTrash, { size: iconSize }), onClick: () => props.onDelete(Object.keys(state.selected)) }, "Delete...")),
208
+ !isMobile && props.onBulk && (React.createElement(Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(IconBoxMultiple, { size: iconSize }), onClick: () => props.onBulk(Object.keys(state.selected)) }, "Bulk..."))),
209
+ lastResult && (React.createElement(Text, { size: "xs", color: "dimmed" },
204
210
  getStart(search, lastResult.total),
205
211
  "-",
206
212
  getEnd(search, lastResult.total),
207
213
  " of",
208
214
  ' ',
209
215
  lastResult.total?.toLocaleString())))),
210
- e__default.createElement(Table, { className: classes.table },
211
- e__default.createElement("thead", null,
212
- e__default.createElement("tr", null,
213
- checkboxColumn && (e__default.createElement("th", null,
214
- e__default.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
215
- fields.map((field) => (e__default.createElement("th", { key: field.name },
216
- e__default.createElement(Menu, { shadow: "md", width: 240, position: "bottom-end" },
217
- e__default.createElement(Menu.Target, null,
218
- e__default.createElement(UnstyledButton, { className: classes.control },
219
- e__default.createElement(Group, { position: "apart", noWrap: true },
220
- e__default.createElement(Text, { weight: 500, size: "sm" }, buildFieldNameString(field.name)),
221
- e__default.createElement(Center, { className: classes.icon },
222
- e__default.createElement(oe, { size: 14, stroke: 1.5 }))))),
223
- e__default.createElement(SearchPopupMenu, { search: props.search, searchParams: field.searchParams, onPrompt: (searchParam, filter) => {
216
+ React.createElement(Table, { className: classes.table },
217
+ React.createElement("thead", null,
218
+ React.createElement("tr", null,
219
+ checkboxColumn && (React.createElement("th", null,
220
+ React.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
221
+ fields.map((field) => (React.createElement("th", { key: field.name },
222
+ React.createElement(Menu, { shadow: "md", width: 240, position: "bottom-end" },
223
+ React.createElement(Menu.Target, null,
224
+ React.createElement(UnstyledButton, { className: classes.control },
225
+ React.createElement(Group, { position: "apart", noWrap: true },
226
+ React.createElement(Text, { weight: 500, size: "sm" }, buildFieldNameString(field.name)),
227
+ React.createElement(Center, { className: classes.icon },
228
+ React.createElement(IconAdjustmentsHorizontal, { size: 14, stroke: 1.5 }))))),
229
+ React.createElement(SearchPopupMenu, { search: props.search, searchParams: field.searchParams, onPrompt: (searchParam, filter) => {
224
230
  setState({
225
231
  ...stateRef.current,
226
232
  filterDialogVisible: true,
@@ -230,18 +236,18 @@ function SearchControl(props) {
230
236
  }, onChange: (result) => {
231
237
  emitSearchChange(result);
232
238
  } })))))),
233
- !props.hideFilters && (e__default.createElement("tr", null,
234
- checkboxColumn && e__default.createElement("th", null),
235
- fields.map((field) => (e__default.createElement("th", { key: field.name }, field.searchParams && (e__default.createElement(FilterDescription, { resourceType: resourceType, searchParams: field.searchParams, filters: props.search.filters })))))))),
236
- e__default.createElement("tbody", null, resources?.map((resource) => resource && (e__default.createElement("tr", { key: resource.id, className: classes.tr, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
237
- checkboxColumn && (e__default.createElement("td", null,
238
- e__default.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!state.selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
239
- fields.map((field) => (e__default.createElement("td", { key: field.name }, renderValue(resource, field))))))))),
240
- resources?.length === 0 && (e__default.createElement(Container, null,
241
- e__default.createElement(Center, null,
242
- e__default.createElement(Text, { size: "xl", color: "dimmed" }, "No results")))),
243
- lastResult?.total !== undefined && lastResult.total > 0 && (e__default.createElement(Center, { m: "md", p: "md" },
244
- e__default.createElement(Pagination, { page: getPage(search), total: getTotalPages(search, lastResult.total), onChange: (newPage) => emitSearchChange(setPage(search, newPage)), getItemAriaLabel: (page) => {
239
+ !props.hideFilters && (React.createElement("tr", null,
240
+ checkboxColumn && React.createElement("th", null),
241
+ fields.map((field) => (React.createElement("th", { key: field.name }, field.searchParams && (React.createElement(FilterDescription, { resourceType: resourceType, searchParams: field.searchParams, filters: props.search.filters })))))))),
242
+ React.createElement("tbody", null, resources?.map((resource) => resource && (React.createElement("tr", { key: resource.id, className: classes.tr, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
243
+ checkboxColumn && (React.createElement("td", null,
244
+ React.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!state.selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
245
+ fields.map((field) => (React.createElement("td", { key: field.name }, renderValue(resource, field))))))))),
246
+ resources?.length === 0 && (React.createElement(Container, null,
247
+ React.createElement(Center, null,
248
+ React.createElement(Text, { size: "xl", color: "dimmed" }, "No results")))),
249
+ lastResult?.total !== undefined && lastResult.total > 0 && (React.createElement(Center, { m: "md", p: "md" },
250
+ React.createElement(Pagination, { page: getPage(search), total: getTotalPages(search, lastResult.total), onChange: (newPage) => emitSearchChange(setPage(search, newPage)), getItemAriaLabel: (page) => {
245
251
  switch (page) {
246
252
  case 'prev':
247
253
  return 'Previous page';
@@ -251,9 +257,9 @@ function SearchControl(props) {
251
257
  return undefined;
252
258
  }
253
259
  } }))),
254
- outcome && (e__default.createElement("div", { "data-testid": "search-error" },
255
- e__default.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
256
- e__default.createElement(SearchFieldEditor, { search: props.search, visible: stateRef.current.fieldEditorVisible, onOk: (result) => {
260
+ outcome && (React.createElement("div", { "data-testid": "search-error" },
261
+ React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
262
+ React.createElement(SearchFieldEditor, { search: props.search, visible: stateRef.current.fieldEditorVisible, onOk: (result) => {
257
263
  emitSearchChange(result);
258
264
  setState({
259
265
  ...stateRef.current,
@@ -265,7 +271,7 @@ function SearchControl(props) {
265
271
  fieldEditorVisible: false,
266
272
  });
267
273
  } }),
268
- e__default.createElement(SearchFilterEditor, { search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
274
+ React.createElement(SearchFilterEditor, { search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
269
275
  emitSearchChange(result);
270
276
  setState({
271
277
  ...stateRef.current,
@@ -277,7 +283,7 @@ function SearchControl(props) {
277
283
  filterEditorVisible: false,
278
284
  });
279
285
  } }),
280
- e__default.createElement(SearchFilterValueDialog, { key: state.filterDialogSearchParam?.code, visible: stateRef.current.filterDialogVisible, title: 'Input', resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
286
+ React.createElement(SearchFilterValueDialog, { key: state.filterDialogSearchParam?.code, visible: stateRef.current.filterDialogVisible, title: 'Input', resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
281
287
  emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));
282
288
  setState({
283
289
  ...stateRef.current,
@@ -290,16 +296,16 @@ function SearchControl(props) {
290
296
  });
291
297
  } })));
292
298
  }
293
- const MemoizedSearchControl = e__default.memo(SearchControl);
299
+ const MemoizedSearchControl = React.memo(SearchControl);
294
300
  function FilterDescription(props) {
295
301
  const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));
296
302
  if (filters.length === 0) {
297
- return e__default.createElement("span", null, "no filters");
303
+ return React.createElement("span", null, "no filters");
298
304
  }
299
- return (e__default.createElement(e__default.Fragment, null, filters.map((filter, index) => (e__default.createElement("div", { key: `filter-${index}-${filters.length}` },
305
+ return (React.createElement(React.Fragment, null, filters.map((filter, index) => (React.createElement("div", { key: `filter-${index}-${filters.length}` },
300
306
  getOpString(filter.operator),
301
307
  "\u00A0",
302
- e__default.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
308
+ React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
303
309
  }
304
310
  function getPage(search) {
305
311
  return Math.floor((search.offset || 0) / (search.count || DEFAULT_SEARCH_COUNT)) + 1;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchControl.mjs","sources":["../../../src/SearchControl/SearchControl.tsx"],"sourcesContent":["import {\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs}px ${theme.spacing.md}px`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: 'accurate', fields: undefined })\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n }, [medplum, search, onLoad]);\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 = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: 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 searchResponse = stateRef.current?.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n *\n * @param e The click event.\n * @param resource The FHIR resource.\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 if (e.button === 2) {\n // Ignore right clicks\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 setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && props.onExport && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={props.onExport}\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </Text>\n )}\n </Group>\n )}\n <Table className={classes.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}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\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={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n page={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getItemAriaLabel={(page) => {\n switch (page) {\n case 'prev':\n return 'Previous page';\n case 'next':\n return 'Next page';\n default:\n return undefined;\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue={''}\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter, index: number) => (\n <div key={`filter-${index}-${filters.length}`}>\n {getOpString(filter.operator)}\n &nbsp;\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset || 0) / (search.count || DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count || DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n"],"names":["React","IconFilter","IconColumns","IconFilePlus","IconTableExport","IconTrash","IconBoxMultiple","IconAdjustmentsHorizontal"],"mappings":"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"}
1
+ {"version":3,"file":"SearchControl.mjs","sources":["../../../src/SearchControl/SearchControl.tsx"],"sourcesContent":["import {\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs}px ${theme.spacing.md}px`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: 'accurate', fields: undefined })\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n }, [medplum, search, onLoad]);\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 = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: 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 searchResponse = stateRef.current?.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n *\n * @param e The click event.\n * @param resource The FHIR resource.\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 if (e.button === 2) {\n // Ignore right clicks\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 setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && props.onExport && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={props.onExport}\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </Text>\n )}\n </Group>\n )}\n <Table className={classes.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}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\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={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n page={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getItemAriaLabel={(page) => {\n switch (page) {\n case 'prev':\n return 'Previous page';\n case 'next':\n return 'Next page';\n default:\n return undefined;\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue={''}\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter, index: number) => (\n <div key={`filter-${index}-${filters.length}`}>\n {getOpString(filter.operator)}\n &nbsp;\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset || 0) / (search.count || DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count || DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Operator, DEFAULT_SEARCH_COUNT, capitalize, formatDateTime, evalFhirPathTyped } from '@medplum/core';
2
- import e__default from 'react';
2
+ import React from 'react';
3
3
  import { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.mjs';
4
4
 
5
5
  const searchParamToOperators = {
@@ -448,7 +448,7 @@ function renderPropertyValue(resource, elementDefinition) {
448
448
  if (!value) {
449
449
  return null;
450
450
  }
451
- return (e__default.createElement(ResourcePropertyDisplay, { property: elementDefinition, propertyType: propertyType, value: value, maxWidth: 200, ignoreMissingValues: true, link: false }));
451
+ return (React.createElement(ResourcePropertyDisplay, { property: elementDefinition, propertyType: propertyType, value: value, maxWidth: 200, ignoreMissingValues: true, link: false }));
452
452
  }
453
453
  /**
454
454
  * Returns a fragment to be displayed in the search table for a search parameter.
@@ -463,9 +463,9 @@ function renderSearchParameterValue(resource, searchParam, elementDefinition) {
463
463
  return null;
464
464
  }
465
465
  if (elementDefinition) {
466
- return (e__default.createElement(ResourcePropertyDisplay, { propertyType: value[0].type, value: value[0].value, maxWidth: 200, ignoreMissingValues: true, link: false }));
466
+ return (React.createElement(ResourcePropertyDisplay, { propertyType: value[0].type, value: value[0].value, maxWidth: 200, ignoreMissingValues: true, link: false }));
467
467
  }
468
- return (e__default.createElement(e__default.Fragment, null, value.map((v, index) => (e__default.createElement("span", { key: `${index}-${value.length}` }, typeof v === 'object' ? JSON.stringify(v) : v)))));
468
+ return (React.createElement(React.Fragment, null, value.map((v, index) => (React.createElement("span", { key: `${index}-${value.length}` }, typeof v === 'object' ? JSON.stringify(v) : v)))));
469
469
  }
470
470
 
471
471
  export { addDateFilterBetween, addField, addFilter, addLastMonthFilter, addMissingFilter, addNextMonthFilter, addThisMonthFilter, addTodayFilter, addTomorrowFilter, addYearToDateFilter, addYesterdayFilter, buildFieldNameString, clearFilters, clearFiltersOnField, deleteFilter, getOpString, getSearchOperators, getSortField, isSortDescending, renderValue, setFilters, setOffset, setPage, setSort, toggleSort };
@@ -1 +1 @@
1
- {"version":3,"file":"SearchUtils.mjs","sources":["../../../src/SearchControl/SearchUtils.tsx"],"sourcesContent":["import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n Operator,\n PropertyType,\n SearchRequest,\n} from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n};\n\n/**\n * Sets the array of filters.\n *\n * @param {Array} filters The new filters.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n *\n * @param {string} code The field key name to clear filters.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters || []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The operation key name.\n * @param {?string} value The filter value.\n * @param {boolean=} opt_clear Optional flag to clear filters on the field.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value || '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n *\n * @param {string} field The field key name.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields && definition.fields.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n *\n * @param {number} index The filter index.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n *\n * @param {string} field The field key name.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n *\n * @param {string} field The field key name.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n *\n * @param {string} field The field key name.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of days from this day.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n *\n * @param {string} field The field key name.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n *\n * @param {string} field The field key name.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n *\n * @param {string} field The field key name.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of months from this month.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n *\n * @param {string} field The field key name.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n *\n * @param {string} field The field key name.\n * @param {Date} d1 The start date.\n * @param {Date} d2 The end date.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n *\n * @param {string} field The field key name.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n *\n * @param {number} offset The offset number.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition The search definition.\n * @param page The new page number\n * @return The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n *\n * @param {string} sortField The sort key.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n *\n * @param {string} key The field key name.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n *\n * @param {string} op The operation code.\n * @return {string} A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param key The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0], field.elementDefinition);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') || '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @param elementDefinition Optional element definition.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(\n resource: Resource,\n searchParam: SearchParameter,\n elementDefinition: ElementDefinition | undefined\n): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n if (elementDefinition) {\n return (\n <ResourcePropertyDisplay\n propertyType={value[0].type as PropertyType}\n value={value[0].value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n }\n\n return (\n <>\n {value.map((v, index) => (\n <span key={`${index}-${value.length}`}>\n {typeof v === 'object' ? JSON.stringify(v) : (v as string | number)}\n </span>\n ))}\n </>\n );\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"SearchUtils.mjs","sources":["../../../src/SearchControl/SearchUtils.tsx"],"sourcesContent":["import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n Operator,\n PropertyType,\n SearchRequest,\n} from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n};\n\n/**\n * Sets the array of filters.\n *\n * @param {Array} filters The new filters.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n *\n * @param {string} code The field key name to clear filters.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters || []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The operation key name.\n * @param {?string} value The filter value.\n * @param {boolean=} opt_clear Optional flag to clear filters on the field.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value || '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n *\n * @param {string} field The field key name.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields && definition.fields.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n *\n * @param {number} index The filter index.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n *\n * @param {string} field The field key name.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n *\n * @param {string} field The field key name.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n *\n * @param {string} field The field key name.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of days from this day.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n *\n * @param {string} field The field key name.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n *\n * @param {string} field The field key name.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n *\n * @param {string} field The field key name.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of months from this month.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n *\n * @param {string} field The field key name.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n *\n * @param {string} field The field key name.\n * @param {Date} d1 The start date.\n * @param {Date} d2 The end date.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n *\n * @param {string} field The field key name.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n *\n * @param {number} offset The offset number.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition The search definition.\n * @param page The new page number\n * @return The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n *\n * @param {string} sortField The sort key.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n *\n * @param {string} key The field key name.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n *\n * @param {string} op The operation code.\n * @return {string} A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param key The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0], field.elementDefinition);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') || '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @param elementDefinition Optional element definition.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(\n resource: Resource,\n searchParam: SearchParameter,\n elementDefinition: ElementDefinition | undefined\n): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n if (elementDefinition) {\n return (\n <ResourcePropertyDisplay\n propertyType={value[0].type as PropertyType}\n value={value[0].value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n }\n\n return (\n <>\n {value.map((v, index) => (\n <span key={`${index}-${value.length}`}>\n {typeof v === 'object' ? JSON.stringify(v) : (v as string | number)}\n </span>\n ))}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Modal, Button } from '@mantine/core';
2
2
  import { stringify, globalSchema } from '@medplum/core';
3
- import e__default, { useState, useRef, useEffect } from 'react';
3
+ import React, { useState, useRef, useEffect } from 'react';
4
4
  import { buildFieldNameString } from '../SearchControl/SearchUtils.mjs';
5
5
 
6
6
  function SearchFieldEditor(props) {
@@ -141,30 +141,30 @@ function SearchFieldEditor(props) {
141
141
  const available = getFieldsList(typeDef)
142
142
  .filter((field) => !selected?.includes(field))
143
143
  .sort();
144
- return (e__default.createElement(Modal, { title: "Fields", closeButtonLabel: "Close", opened: props.visible, onClose: props.onCancel },
145
- e__default.createElement("div", null,
146
- e__default.createElement("table", { style: { margin: 'auto' } },
147
- e__default.createElement("thead", null,
148
- e__default.createElement("tr", null,
149
- e__default.createElement("th", { colSpan: 2, align: "center" }, "Available"),
150
- e__default.createElement("th", { colSpan: 2, align: "center" }, "Selected"))),
151
- e__default.createElement("tbody", null,
152
- e__default.createElement("tr", null,
153
- e__default.createElement("td", { colSpan: 2, align: "center" },
154
- e__default.createElement("select", { ref: availableRef, size: 15, tabIndex: 1, style: { width: '200px' }, onKeyDown: (e) => handleAvailableKeyDown(e), onDoubleClick: () => handleAvailableDoubleClick(), "data-testid": "available" }, available.map((key) => (e__default.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))),
155
- e__default.createElement("td", { colSpan: 2, align: "center" },
156
- e__default.createElement("select", { ref: selectedRef, size: 15, tabIndex: 4, style: { width: '200px' }, onKeyDown: (e) => handleSelectedKeyDown(e), onDoubleClick: () => handleSelectedDoubleClick(), "data-testid": "selected" }, selected.map((key) => (e__default.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))))),
157
- e__default.createElement("tfoot", null,
158
- e__default.createElement("tr", null,
159
- e__default.createElement("td", { align: "center" },
160
- e__default.createElement(Button, { compact: true, variant: "outline", onClick: onAddField }, "Add")),
161
- e__default.createElement("td", { align: "center" },
162
- e__default.createElement(Button, { compact: true, variant: "outline", onClick: onRemoveField }, "Remove")),
163
- e__default.createElement("td", { align: "center" },
164
- e__default.createElement(Button, { compact: true, variant: "outline", onClick: onMoveUp }, "Up")),
165
- e__default.createElement("td", { align: "center" },
166
- e__default.createElement(Button, { compact: true, variant: "outline", onClick: onMoveDown }, "Down")))))),
167
- e__default.createElement(Button, { onClick: () => props.onOk(state.search) }, "OK")));
144
+ return (React.createElement(Modal, { title: "Fields", closeButtonLabel: "Close", opened: props.visible, onClose: props.onCancel },
145
+ React.createElement("div", null,
146
+ React.createElement("table", { style: { margin: 'auto' } },
147
+ React.createElement("thead", null,
148
+ React.createElement("tr", null,
149
+ React.createElement("th", { colSpan: 2, align: "center" }, "Available"),
150
+ React.createElement("th", { colSpan: 2, align: "center" }, "Selected"))),
151
+ React.createElement("tbody", null,
152
+ React.createElement("tr", null,
153
+ React.createElement("td", { colSpan: 2, align: "center" },
154
+ React.createElement("select", { ref: availableRef, size: 15, tabIndex: 1, style: { width: '200px' }, onKeyDown: (e) => handleAvailableKeyDown(e), onDoubleClick: () => handleAvailableDoubleClick(), "data-testid": "available" }, available.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))),
155
+ React.createElement("td", { colSpan: 2, align: "center" },
156
+ React.createElement("select", { ref: selectedRef, size: 15, tabIndex: 4, style: { width: '200px' }, onKeyDown: (e) => handleSelectedKeyDown(e), onDoubleClick: () => handleSelectedDoubleClick(), "data-testid": "selected" }, selected.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))))),
157
+ React.createElement("tfoot", null,
158
+ React.createElement("tr", null,
159
+ React.createElement("td", { align: "center" },
160
+ React.createElement(Button, { compact: true, variant: "outline", onClick: onAddField }, "Add")),
161
+ React.createElement("td", { align: "center" },
162
+ React.createElement(Button, { compact: true, variant: "outline", onClick: onRemoveField }, "Remove")),
163
+ React.createElement("td", { align: "center" },
164
+ React.createElement(Button, { compact: true, variant: "outline", onClick: onMoveUp }, "Up")),
165
+ React.createElement("td", { align: "center" },
166
+ React.createElement(Button, { compact: true, variant: "outline", onClick: onMoveDown }, "Down")))))),
167
+ React.createElement(Button, { onClick: () => props.onOk(state.search) }, "OK")));
168
168
  }
169
169
  /**
170
170
  * Returns a list of fields/columns available for a type.