synapse-react-client 4.0.18 → 4.0.20

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 (1609) hide show
  1. package/dist/SWC.index.d.ts +3 -1
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +3 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/aridhia-queries/aridhiaTokenExchange.js.map +1 -1
  6. package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
  7. package/dist/assets/DefaultColorfulPortalCardBackground.js.map +1 -1
  8. package/dist/assets/GoogleIcon.js.map +1 -1
  9. package/dist/assets/GoogleIcon24.js.map +1 -1
  10. package/dist/assets/homepage/BlinkingLiveIcon.d.ts +1 -1
  11. package/dist/assets/homepage/BlinkingLiveIcon.js.map +1 -1
  12. package/dist/assets/homepage/aacr.js.map +1 -1
  13. package/dist/assets/homepage/cri.js.map +1 -1
  14. package/dist/assets/homepage/ctf.js.map +1 -1
  15. package/dist/assets/homepage/egress.js.map +1 -1
  16. package/dist/assets/homepage/facebook.js.map +1 -1
  17. package/dist/assets/homepage/fisma.js.map +1 -1
  18. package/dist/assets/homepage/gff.js.map +1 -1
  19. package/dist/assets/homepage/github.js.map +1 -1
  20. package/dist/assets/homepage/gray.js.map +1 -1
  21. package/dist/assets/homepage/hipaa-compliant.js.map +1 -1
  22. package/dist/assets/homepage/instagram.js.map +1 -1
  23. package/dist/assets/homepage/linkedin.js.map +1 -1
  24. package/dist/assets/homepage/ml-commons.js.map +1 -1
  25. package/dist/assets/homepage/nih-aging.js.map +1 -1
  26. package/dist/assets/homepage/nih-heart.js.map +1 -1
  27. package/dist/assets/homepage/nih-nci.js.map +1 -1
  28. package/dist/assets/homepage/nih-nimh.js.map +1 -1
  29. package/dist/assets/homepage/ntap.js.map +1 -1
  30. package/dist/assets/homepage/plan-item.js.map +1 -1
  31. package/dist/assets/homepage/powered-by-synapse-feature.js.map +1 -1
  32. package/dist/assets/homepage/precision-governance-feature.js.map +1 -1
  33. package/dist/assets/homepage/python.js.map +1 -1
  34. package/dist/assets/homepage/r.js.map +1 -1
  35. package/dist/assets/homepage/research-credit-feature.js.map +1 -1
  36. package/dist/assets/homepage/seamless-integration-feature.js.map +1 -1
  37. package/dist/assets/homepage/sloan.js.map +1 -1
  38. package/dist/assets/homepage/twitter.js.map +1 -1
  39. package/dist/assets/homepage/users.js.map +1 -1
  40. package/dist/assets/homepage/youtube.js.map +1 -1
  41. package/dist/assets/icons/AccessDataAnywhere.js.map +1 -1
  42. package/dist/assets/icons/AccessPending.js.map +1 -1
  43. package/dist/assets/icons/AccessPendingCloud.js.map +1 -1
  44. package/dist/assets/icons/AddAd.js.map +1 -1
  45. package/dist/assets/icons/AddToList.js.map +1 -1
  46. package/dist/assets/icons/Alert.js.map +1 -1
  47. package/dist/assets/icons/Arrow.js.map +1 -1
  48. package/dist/assets/icons/AwardScroll.js.map +1 -1
  49. package/dist/assets/icons/Baseline.js.map +1 -1
  50. package/dist/assets/icons/Cavatica.js.map +1 -1
  51. package/dist/assets/icons/CertifiedUser.js.map +1 -1
  52. package/dist/assets/icons/Challenge.js.map +1 -1
  53. package/dist/assets/icons/Checkbox/Checked.js.map +1 -1
  54. package/dist/assets/icons/Checkbox/Checked2.js.map +1 -1
  55. package/dist/assets/icons/Checkbox/Indeterminate.js.map +1 -1
  56. package/dist/assets/icons/Checkbox/Indeterminate2.js.map +1 -1
  57. package/dist/assets/icons/Checkbox/Unchecked.js.map +1 -1
  58. package/dist/assets/icons/Checkbox/Unchecked2.js.map +1 -1
  59. package/dist/assets/icons/ClappingHands.js.map +1 -1
  60. package/dist/assets/icons/CloudWarning.js.map +1 -1
  61. package/dist/assets/icons/CommunicateFindings.js.map +1 -1
  62. package/dist/assets/icons/CreateVersion.js.map +1 -1
  63. package/dist/assets/icons/DNA_Two.js.map +1 -1
  64. package/dist/assets/icons/Data2.js.map +1 -1
  65. package/dist/assets/icons/DoubleQuotes.js.map +1 -1
  66. package/dist/assets/icons/EmailAddressAdornment.js.map +1 -1
  67. package/dist/assets/icons/FileWithShield.js.map +1 -1
  68. package/dist/assets/icons/FileWithShield2.js.map +1 -1
  69. package/dist/assets/icons/FrontHand.js.map +1 -1
  70. package/dist/assets/icons/HandWithMoney.js.map +1 -1
  71. package/dist/assets/icons/IconCopy.js.map +1 -1
  72. package/dist/assets/icons/IconMinus.js.map +1 -1
  73. package/dist/assets/icons/IconPlus.js.map +1 -1
  74. package/dist/assets/icons/Java.js.map +1 -1
  75. package/dist/assets/icons/MintDoi.js.map +1 -1
  76. package/dist/assets/icons/MultiFile.js.map +1 -1
  77. package/dist/assets/icons/MultiFile2.js.map +1 -1
  78. package/dist/assets/icons/NoData.js.map +1 -1
  79. package/dist/assets/icons/NoSearchResults.js.map +1 -1
  80. package/dist/assets/icons/ORCIDIcon.js.map +1 -1
  81. package/dist/assets/icons/OpenBook.js.map +1 -1
  82. package/dist/assets/icons/Podium.js.map +1 -1
  83. package/dist/assets/icons/Python.js.map +1 -1
  84. package/dist/assets/icons/QueryStructuredData.js.map +1 -1
  85. package/dist/assets/icons/RLogo.js.map +1 -1
  86. package/dist/assets/icons/RecordProvenance.js.map +1 -1
  87. package/dist/assets/icons/RosetteRibbon.js.map +1 -1
  88. package/dist/assets/icons/SageFullLogo.js.map +1 -1
  89. package/dist/assets/icons/SearchImage.js.map +1 -1
  90. package/dist/assets/icons/ShareYourResearch.js.map +1 -1
  91. package/dist/assets/icons/Sort.js.map +1 -1
  92. package/dist/assets/icons/StarTrophy.js.map +1 -1
  93. package/dist/assets/icons/SynapseFullLogo.js.map +1 -1
  94. package/dist/assets/icons/SynapseIconWhite.js.map +1 -1
  95. package/dist/assets/icons/SynapseLogoName.js.map +1 -1
  96. package/dist/assets/icons/TasksIcon.js.map +1 -1
  97. package/dist/assets/icons/Terminal.js.map +1 -1
  98. package/dist/assets/icons/ThreeStars.js.map +1 -1
  99. package/dist/assets/icons/UnpackagableFile.js.map +1 -1
  100. package/dist/assets/icons/UnpackagableFile2.js.map +1 -1
  101. package/dist/assets/icons/ValidatedProfile.js.map +1 -1
  102. package/dist/assets/icons/account-certified.js.map +1 -1
  103. package/dist/assets/icons/account-enabled-mfa.js.map +1 -1
  104. package/dist/assets/icons/account-validated.js.map +1 -1
  105. package/dist/assets/icons/bioChemicalPhysical.js.map +1 -1
  106. package/dist/assets/icons/chart2.js.map +1 -1
  107. package/dist/assets/icons/columns.js.map +1 -1
  108. package/dist/assets/icons/columnsDarkTheme.js.map +1 -1
  109. package/dist/assets/icons/computationalTool.js.map +1 -1
  110. package/dist/assets/icons/dataReuse.js.map +1 -1
  111. package/dist/assets/icons/emailAddressAdornment2.js.map +1 -1
  112. package/dist/assets/icons/emailWithNotification.js.map +1 -1
  113. package/dist/assets/icons/error_page/maintenance.js.map +1 -1
  114. package/dist/assets/icons/error_page/no-access.js.map +1 -1
  115. package/dist/assets/icons/error_page/unavailable.js.map +1 -1
  116. package/dist/assets/icons/file.js.map +1 -1
  117. package/dist/assets/icons/inSilicoModel.js.map +1 -1
  118. package/dist/assets/icons/institution.js.map +1 -1
  119. package/dist/assets/icons/json-form-tool-no-submissions.js.map +1 -1
  120. package/dist/assets/icons/modelSystem.js.map +1 -1
  121. package/dist/assets/icons/mouse.js.map +1 -1
  122. package/dist/assets/icons/organizations.js.map +1 -1
  123. package/dist/assets/icons/person.js.map +1 -1
  124. package/dist/assets/icons/spatialProfiling.js.map +1 -1
  125. package/dist/assets/icons/standardDataModel.js.map +1 -1
  126. package/dist/assets/icons/study-active.js.map +1 -1
  127. package/dist/assets/icons/study-complete.js.map +1 -1
  128. package/dist/assets/icons/subscribe_plus.js.map +1 -1
  129. package/dist/assets/icons/synapse-logo.js.map +1 -1
  130. package/dist/assets/icons/terms/CheckIcon.js.map +1 -1
  131. package/dist/assets/icons/translational.js.map +1 -1
  132. package/dist/assets/icons/tree_horizontal.js.map +1 -1
  133. package/dist/assets/illustrations/acknowledgement_statements_illustration.js.map +1 -1
  134. package/dist/assets/illustrations/challenges_illustration.js.map +1 -1
  135. package/dist/assets/illustrations/cohort_builder_illustration.js.map +1 -1
  136. package/dist/assets/illustrations/data_access_management_illustration.js.map +1 -1
  137. package/dist/assets/illustrations/datasets_illustration.js.map +1 -1
  138. package/dist/assets/illustrations/diagonalLinePattern.js.map +1 -1
  139. package/dist/assets/illustrations/discussions_illustration.js.map +1 -1
  140. package/dist/assets/illustrations/docker_illustration.js.map +1 -1
  141. package/dist/assets/illustrations/donation_illustration.js.map +1 -1
  142. package/dist/assets/illustrations/favorites_illustration.js.map +1 -1
  143. package/dist/assets/illustrations/files_illustration.js.map +1 -1
  144. package/dist/assets/illustrations/following_illustration.js.map +1 -1
  145. package/dist/assets/illustrations/index.js.map +1 -1
  146. package/dist/assets/illustrations/left_dot_blob_dark_illustration.js.map +1 -1
  147. package/dist/assets/illustrations/left_dot_blob_illustration.js.map +1 -1
  148. package/dist/assets/illustrations/projects_illustration.js.map +1 -1
  149. package/dist/assets/illustrations/right_dot_blob_dark_illustration.js.map +1 -1
  150. package/dist/assets/illustrations/right_dot_blob_illustration.js.map +1 -1
  151. package/dist/assets/illustrations/tables_illustration.js.map +1 -1
  152. package/dist/assets/illustrations/teams_illustration.js.map +1 -1
  153. package/dist/assets/illustrations/trash_can_illustration.js.map +1 -1
  154. package/dist/assets/illustrations/underconstruction_illustration.js.map +1 -1
  155. package/dist/assets/illustrations/wikis_illustration.js.map +1 -1
  156. package/dist/assets/logos/other/ad-workbench-logo.js.map +1 -1
  157. package/dist/assets/logos/other/cavatica-logo.js.map +1 -1
  158. package/dist/assets/logos/other/pluto-logo.js.map +1 -1
  159. package/dist/assets/logos/other/terra-logo.js.map +1 -1
  160. package/dist/assets/mui_components/AccessManagement.js.map +1 -1
  161. package/dist/assets/mui_components/AccountCertified.js.map +1 -1
  162. package/dist/assets/mui_components/AccountRegistered.js.map +1 -1
  163. package/dist/assets/mui_components/AccountValidated.js.map +1 -1
  164. package/dist/assets/mui_components/ActionKey.js.map +1 -1
  165. package/dist/assets/mui_components/BioChemicalPhysical.js.map +1 -1
  166. package/dist/assets/mui_components/Chromatin.js.map +1 -1
  167. package/dist/assets/mui_components/Clinical.js.map +1 -1
  168. package/dist/assets/mui_components/ComputationalTool.js.map +1 -1
  169. package/dist/assets/mui_components/Data.js.map +1 -1
  170. package/dist/assets/mui_components/DataLocked.js.map +1 -1
  171. package/dist/assets/mui_components/DataReuse.js.map +1 -1
  172. package/dist/assets/mui_components/Dataset.js.map +1 -1
  173. package/dist/assets/mui_components/DatasetCollection.js.map +1 -1
  174. package/dist/assets/mui_components/Docker.js.map +1 -1
  175. package/dist/assets/mui_components/GeneExpression.js.map +1 -1
  176. package/dist/assets/mui_components/GeneVariants.js.map +1 -1
  177. package/dist/assets/mui_components/HelpChatBubble.js.map +1 -1
  178. package/dist/assets/mui_components/Imaging.js.map +1 -1
  179. package/dist/assets/mui_components/InSilicoModel.js.map +1 -1
  180. package/dist/assets/mui_components/Kinomics.js.map +1 -1
  181. package/dist/assets/mui_components/LineGraph.js.map +1 -1
  182. package/dist/assets/mui_components/ModelSystem.js.map +1 -1
  183. package/dist/assets/mui_components/Other.js.map +1 -1
  184. package/dist/assets/mui_components/PackagableFile.js.map +1 -1
  185. package/dist/assets/mui_components/PackagableFile2.js.map +1 -1
  186. package/dist/assets/mui_components/Proteomics.js.map +1 -1
  187. package/dist/assets/mui_components/Rat.js.map +1 -1
  188. package/dist/assets/mui_components/SpatialProfiling.js.map +1 -1
  189. package/dist/assets/sustainability/darkDialPosition1.js.map +1 -1
  190. package/dist/assets/sustainability/darkDialPosition2.js.map +1 -1
  191. package/dist/assets/sustainability/darkDialPosition3.js.map +1 -1
  192. package/dist/assets/sustainability/darkDialPosition4.js.map +1 -1
  193. package/dist/assets/sustainability/dialPosition1.js.map +1 -1
  194. package/dist/assets/sustainability/dialPosition2.js.map +1 -1
  195. package/dist/assets/sustainability/dialPosition3.js.map +1 -1
  196. package/dist/assets/sustainability/dialPosition4.js.map +1 -1
  197. package/dist/assets/themed_icons/Active.js.map +1 -1
  198. package/dist/assets/themed_icons/Chart.js.map +1 -1
  199. package/dist/assets/themed_icons/Close.js.map +1 -1
  200. package/dist/assets/themed_icons/Collapse.js.map +1 -1
  201. package/dist/assets/themed_icons/Columns.js.map +1 -1
  202. package/dist/assets/themed_icons/ColumnsDark.js.map +1 -1
  203. package/dist/assets/themed_icons/Database.js.map +1 -1
  204. package/dist/assets/themed_icons/Download.js.map +1 -1
  205. package/dist/assets/themed_icons/Expand.js.map +1 -1
  206. package/dist/assets/themed_icons/Explore.js.map +1 -1
  207. package/dist/assets/themed_icons/ExternalLink.js.map +1 -1
  208. package/dist/assets/themed_icons/Filter.js.map +1 -1
  209. package/dist/assets/themed_icons/Program.js.map +1 -1
  210. package/dist/assets/themed_icons/Project.js.map +1 -1
  211. package/dist/assets/themed_icons/Publication.js.map +1 -1
  212. package/dist/assets/themed_icons/Search.js.map +1 -1
  213. package/dist/assets/themed_icons/Settings.js.map +1 -1
  214. package/dist/assets/themed_icons/SortDown.js.map +1 -1
  215. package/dist/assets/themed_icons/SortUp.js.map +1 -1
  216. package/dist/assets/themed_icons/SqlEditorIcon.js.map +1 -1
  217. package/dist/assets/themed_icons/Study.js.map +1 -1
  218. package/dist/assets/themed_icons/ToolClinical.js.map +1 -1
  219. package/dist/assets/themed_icons/ToolComputational.js.map +1 -1
  220. package/dist/assets/themed_icons/ToolExperimental.js.map +1 -1
  221. package/dist/assets/themed_icons/VerticalDots.js.map +1 -1
  222. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js.map +1 -1
  223. package/dist/components/AccessRequirement/EntityActionsRequired.js.map +1 -1
  224. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.js.map +1 -1
  225. package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
  226. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js +10 -11
  227. package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
  228. package/dist/components/AccessRequirementList/AccessRequirementList.js +73 -76
  229. package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
  230. package/dist/components/AccessRequirementList/AccessRequirementListItem.js.map +1 -1
  231. package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
  232. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js.map +1 -1
  233. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
  234. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
  235. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.js.map +1 -1
  236. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js.map +1 -1
  237. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.js.map +1 -1
  238. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.js.map +1 -1
  239. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js.map +1 -1
  240. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
  241. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.js.map +1 -1
  242. package/dist/components/AccessRequirementList/RequirementItem/AuthenticatedRequirement.js.map +1 -1
  243. package/dist/components/AccessRequirementList/RequirementItem/CertificationRequirement.js.map +1 -1
  244. package/dist/components/AccessRequirementList/RequirementItem/LockAccessRequirementItem.js.map +1 -1
  245. package/dist/components/AccessRequirementList/RequirementItem/RequirementItem.js.map +1 -1
  246. package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
  247. package/dist/components/AccessRequirementList/RequirementItem/TwoFactorAuthEnabledRequirement.js.map +1 -1
  248. package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js.map +1 -1
  249. package/dist/components/AccessRequirementList/RequirementItem/ValidationRequirement.js.map +1 -1
  250. package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
  251. package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
  252. package/dist/components/AccessTokenPage/AccessTokenPage.js.map +1 -1
  253. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
  254. package/dist/components/AccountLevelBadge/AccountLevelBadge.js.map +1 -1
  255. package/dist/components/AccountLevelBadges/AccountLevelBadges.js.map +1 -1
  256. package/dist/components/AccountLevelBadges/useRevokeCertificationUI.js.map +1 -1
  257. package/dist/components/AcknowledgementsPage/AcknowledgementsDialog.js.map +1 -1
  258. package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
  259. package/dist/components/AcknowledgementsPage/StudyAcknowledgement.js.map +1 -1
  260. package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
  261. package/dist/components/AclEditor/AclEditor.js.map +1 -1
  262. package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
  263. package/dist/components/AclEditor/AclEditorSkeleton.js.map +1 -1
  264. package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
  265. package/dist/components/AclEditor/ReadOnlyPermissionLevel.js.map +1 -1
  266. package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js +2 -4
  267. package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
  268. package/dist/components/AclEditor/ResourceAccessItem.js.map +1 -1
  269. package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
  270. package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
  271. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js.map +1 -1
  272. package/dist/components/AddToDownloadListV2.js.map +1 -1
  273. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  274. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
  275. package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
  276. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  277. package/dist/components/Authentication/LoginFlowBackButton.js.map +1 -1
  278. package/dist/components/Authentication/LoginForm.js.map +1 -1
  279. package/dist/components/Authentication/LoginMethod.js.map +1 -1
  280. package/dist/components/Authentication/LoginMethodButton.js.map +1 -1
  281. package/dist/components/Authentication/Logout.js.map +1 -1
  282. package/dist/components/Authentication/OneTimePasswordForm.js.map +1 -1
  283. package/dist/components/Authentication/PasswordField.js.map +1 -1
  284. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  285. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  286. package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
  287. package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
  288. package/dist/components/Authentication/StandaloneLoginForm.js.map +1 -1
  289. package/dist/components/Authentication/TOTPForm.js.map +1 -1
  290. package/dist/components/Authentication/TwoFactorAuthSettingsPanel.js.map +1 -1
  291. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  292. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  293. package/dist/components/Authentication/TwoFactorSecretDialog.js.map +1 -1
  294. package/dist/components/Authentication/UsernamePasswordForm.js.map +1 -1
  295. package/dist/components/BasePortalCard/BasePortalCard.js.map +1 -1
  296. package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
  297. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  298. package/dist/components/CTASectionWrapper/CTASectionWrapper.js.map +1 -1
  299. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
  300. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  301. package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
  302. package/dist/components/CardDeck/CardDeck.Desktop.js.map +1 -1
  303. package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
  304. package/dist/components/CardDeck/CardDeck.js.map +1 -1
  305. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  306. package/dist/components/CardGridWithLinks/CardGridWithLinks.js.map +1 -1
  307. package/dist/components/CertificationQuiz/CertificationAnswer.js.map +1 -1
  308. package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
  309. package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
  310. package/dist/components/ChallengeDetailPage/ChallengeDetailPage.js.map +1 -1
  311. package/dist/components/ChallengeRegisterButton/ChallengeRegisterButton.js.map +1 -1
  312. package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js.map +1 -1
  313. package/dist/components/ChallengeSubmission/AddExternalRepo.js.map +1 -1
  314. package/dist/components/ChallengeSubmission/AvailableEvaluationQueueList.js.map +1 -1
  315. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  316. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js +62 -64
  317. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  318. package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
  319. package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
  320. package/dist/components/ChallengeSubmission/SubmissionCommitList.js.map +1 -1
  321. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  322. package/dist/components/ChallengeTeamWizard/ChallengeTeamSearch.js.map +1 -1
  323. package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.js.map +1 -1
  324. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js +96 -102
  325. package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
  326. package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
  327. package/dist/components/ChallengeTeamWizard/MembershipRequestForm.js.map +1 -1
  328. package/dist/components/ChallengeTeamWizard/OpenMembershipInvitation.js.map +1 -1
  329. package/dist/components/ChallengeTeamWizard/RegistrationSuccessful.js.map +1 -1
  330. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js.map +1 -1
  331. package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.js.map +1 -1
  332. package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
  333. package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
  334. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  335. package/dist/components/CitationPopover/CitationPopover.js.map +1 -1
  336. package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
  337. package/dist/components/CitationPopover/CitationPopoverUtils.js.map +1 -1
  338. package/dist/components/CitationPopover/useCitation.js.map +1 -1
  339. package/dist/components/ColorGradient/ColorGradient.js.map +1 -1
  340. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js.map +1 -1
  341. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  342. package/dist/components/ComponentCollapse.js.map +1 -1
  343. package/dist/components/ConfirmationDialog/ConfirmationDialog.js.map +1 -1
  344. package/dist/components/CookiesNotification/CookiePreferencesDialog.js.map +1 -1
  345. package/dist/components/CookiesNotification/CookiesNotification.d.ts.map +1 -1
  346. package/dist/components/CookiesNotification/CookiesNotification.js +9 -9
  347. package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
  348. package/dist/components/CopyToClipboardIcon.js.map +1 -1
  349. package/dist/components/CopyToClipboardInput/CopyToClipboardInput.js.map +1 -1
  350. package/dist/components/CopyToClipboardString/CopyToClipboardString.js.map +1 -1
  351. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
  352. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizardUtils.js.map +1 -1
  353. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  354. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js.map +1 -1
  355. package/dist/components/CreateTableViewWizard/CreateTableViewWizard.js.map +1 -1
  356. package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
  357. package/dist/components/CreateTableViewWizard/TableNameForm.js.map +1 -1
  358. package/dist/components/CreateTableViewWizard/TableTypeSelection.js.map +1 -1
  359. package/dist/components/CreateTableViewWizard/ViewTypeSelection.js.map +1 -1
  360. package/dist/components/CrispChat/CrispChat.js.map +1 -1
  361. package/dist/components/DataExplorer/DataExplorer.css +1 -0
  362. package/dist/components/DataExplorer/DataExplorer.d.ts +13 -0
  363. package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -0
  364. package/dist/components/DataExplorer/DataExplorer.js +116 -0
  365. package/dist/components/DataExplorer/DataExplorer.js.map +1 -0
  366. package/dist/components/DataExplorer/DataExplorer.module.js +22 -0
  367. package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -0
  368. package/dist/components/DataExplorer/DataExplorer.module.scss +156 -0
  369. package/dist/components/DataGrid/DataGrid.js +72 -72
  370. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  371. package/dist/components/DataGrid/DataGridTypes.js.map +1 -1
  372. package/dist/components/DataGrid/DataGridWebSocket.d.ts +2 -0
  373. package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
  374. package/dist/components/DataGrid/DataGridWebSocket.js +9 -10
  375. package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
  376. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
  377. package/dist/components/DataGrid/StartGridSession.js.map +1 -1
  378. package/dist/components/DataGrid/SynapseGrid.d.ts +3 -1
  379. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  380. package/dist/components/DataGrid/SynapseGrid.js +219 -211
  381. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  382. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  383. package/dist/components/DataGrid/columns/AutocompleteColumn.js +106 -102
  384. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  385. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  386. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +97 -89
  387. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  388. package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
  389. package/dist/components/DataGrid/columns/GridAutocompleteChip.js.map +1 -1
  390. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +19 -8
  391. package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -1
  392. package/dist/components/DataGrid/columns/useGridAutocompleteState.js +64 -43
  393. package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -1
  394. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
  395. package/dist/components/DataGrid/components/ExportCsvFromGridButton.js.map +1 -1
  396. package/dist/components/DataGrid/components/GridMenuButton/GridMenuButton.js.map +1 -1
  397. package/dist/components/DataGrid/components/GridSessionSelectionField.js.map +1 -1
  398. package/dist/components/DataGrid/components/UploadCsvToGridButton.js.map +1 -1
  399. package/dist/components/DataGrid/components/UploadCsvToGridDialog.d.ts.map +1 -1
  400. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +9 -9
  401. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
  402. package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
  403. package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
  404. package/dist/components/DataGrid/hooks/useColumnResizeHandles.js +2 -0
  405. package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
  406. package/dist/components/DataGrid/hooks/useExportDataGridToCsv.js.map +1 -1
  407. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.d.ts.map +1 -1
  408. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +8 -1
  409. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
  410. package/dist/components/DataGrid/hooks/useGridReplicaUsers.js.map +1 -1
  411. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  412. package/dist/components/DataGrid/hooks/useRemoteSelections.js.map +1 -1
  413. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  414. package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
  415. package/dist/components/DataGrid/useDataGridWebsocket.d.ts +2 -0
  416. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  417. package/dist/components/DataGrid/useDataGridWebsocket.js +12 -2
  418. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  419. package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
  420. package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
  421. package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
  422. package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
  423. package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
  424. package/dist/components/DataGrid/utils/MessageCounter.js.map +1 -1
  425. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  426. package/dist/components/DataGrid/utils/calculateColumnWidth.js.map +1 -1
  427. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  428. package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
  429. package/dist/components/DataGrid/utils/convertActionToModelChange.js.map +1 -1
  430. package/dist/components/DataGrid/utils/createTestModel.js.map +1 -1
  431. package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.js.map +1 -1
  432. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  433. package/dist/components/DataGrid/utils/getCellAuthorSid.js.map +1 -1
  434. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  435. package/dist/components/DataGrid/utils/getChangeTooltipText.js.map +1 -1
  436. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -1
  437. package/dist/components/DataGrid/utils/getReplicaCategory.js.map +1 -1
  438. package/dist/components/DataGrid/utils/isValidationUpToDateForRow.js.map +1 -1
  439. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  440. package/dist/components/DataGrid/utils/json-rx/JsonRxMessage.js.map +1 -1
  441. package/dist/components/DataGrid/utils/json-rx/JsonRxNotification.js.map +1 -1
  442. package/dist/components/DataGrid/utils/json-rx/JsonRxRequest.js.map +1 -1
  443. package/dist/components/DataGrid/utils/json-rx/JsonRxRequestComplete.js.map +1 -1
  444. package/dist/components/DataGrid/utils/json-rx/JsonRxResponse.js.map +1 -1
  445. package/dist/components/DataGrid/utils/json-rx/JsonRxResponseComplete.js.map +1 -1
  446. package/dist/components/DataGrid/utils/logicalTimestampToString.js.map +1 -1
  447. package/dist/components/DataGrid/utils/mapOperationsToModelChanges.js.map +1 -1
  448. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  449. package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
  450. package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
  451. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js.map +1 -1
  452. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -1
  453. package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
  454. package/dist/components/DatasetJsonLdScript.js.map +1 -1
  455. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  456. package/dist/components/Dialog/ConfirmCloseWithoutSavingDialog.js.map +1 -1
  457. package/dist/components/DialogBase.js.map +1 -1
  458. package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
  459. package/dist/components/DirectDownload/FileEntityDirectDownload.js.map +1 -1
  460. package/dist/components/DirectDownloadButton.js.map +1 -1
  461. package/dist/components/DownloadCart/ActionRequiredCard/ActionRequiredCard.js.map +1 -1
  462. package/dist/components/DownloadCart/ActionRequiredListItem.js.map +1 -1
  463. package/dist/components/DownloadCart/AvailableForDownloadTable.js.map +1 -1
  464. package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
  465. package/dist/components/DownloadCart/DirectProgrammaticDownload.js.map +1 -1
  466. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  467. package/dist/components/DownloadCart/DownloadDetails.js.map +1 -1
  468. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  469. package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
  470. package/dist/components/DownloadCart/DownloadListStats.js.map +1 -1
  471. package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
  472. package/dist/components/DownloadCart/EnableTwoFaRequirementCard.js.map +1 -1
  473. package/dist/components/DownloadCart/MeetAccessRequirementCard.js.map +1 -1
  474. package/dist/components/DownloadCart/RequestDownloadCard.js.map +1 -1
  475. package/dist/components/DownloadCart/ShowDownloadV2.js.map +1 -1
  476. package/dist/components/DownloadCart/TableQueryActionsRequired.js.map +1 -1
  477. package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
  478. package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
  479. package/dist/components/DropdownSelect/DropdownSelect.js.map +1 -1
  480. package/dist/components/DynamicForm/DynamicForm.js.map +1 -1
  481. package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
  482. package/dist/components/Ecosystem/EcosystemCard.js.map +1 -1
  483. package/dist/components/Ecosystem/EcosystemLayout.js.map +1 -1
  484. package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
  485. package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
  486. package/dist/components/EntityAclEditor/CreateOrDeleteLocalSharingSettingsButton.js.map +1 -1
  487. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  488. package/dist/components/EntityAclEditor/EntityAclEditorModal.js.map +1 -1
  489. package/dist/components/EntityAclEditor/InheritanceMessage.js.map +1 -1
  490. package/dist/components/EntityAclEditor/OpenData.js.map +1 -1
  491. package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
  492. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +68 -70
  493. package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
  494. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  495. package/dist/components/EntityCitation/EntityCitationUtils.js.map +1 -1
  496. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +32 -35
  497. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  498. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  499. package/dist/components/EntityFinder/Breadcrumbs.js.map +1 -1
  500. package/dist/components/EntityFinder/EntityFinder.js +134 -136
  501. package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
  502. package/dist/components/EntityFinder/EntityFinderModal.js.map +1 -1
  503. package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -1
  504. package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
  505. package/dist/components/EntityFinder/details/EntityDetailsList.js +20 -20
  506. package/dist/components/EntityFinder/details/EntityDetailsList.js.map +1 -1
  507. package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
  508. package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
  509. package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
  510. package/dist/components/EntityFinder/details/configurations/ReferenceDetails.js.map +1 -1
  511. package/dist/components/EntityFinder/details/configurations/SearchDetails.js.map +1 -1
  512. package/dist/components/EntityFinder/details/view/DetailsView.js +67 -67
  513. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  514. package/dist/components/EntityFinder/details/view/VersionColumnHeader.js +1 -1
  515. package/dist/components/EntityFinder/details/view/VersionColumnHeader.js.map +1 -1
  516. package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
  517. package/dist/components/EntityFinder/details/view/table/CreatedOnCell.js.map +1 -1
  518. package/dist/components/EntityFinder/details/view/table/DateCell.js.map +1 -1
  519. package/dist/components/EntityFinder/details/view/table/EntityBadgeIconsCell.js.map +1 -1
  520. package/dist/components/EntityFinder/details/view/table/EntityFinderCheckboxCell.js.map +1 -1
  521. package/dist/components/EntityFinder/details/view/table/EntityFinderVersionCell.js.map +1 -1
  522. package/dist/components/EntityFinder/details/view/table/EntityNameCell.js.map +1 -1
  523. package/dist/components/EntityFinder/details/view/table/EntityTypeCell.js.map +1 -1
  524. package/dist/components/EntityFinder/details/view/table/FileEntityDirectDownloadCell.js.map +1 -1
  525. package/dist/components/EntityFinder/details/view/table/FileEntityMD5Cell.js.map +1 -1
  526. package/dist/components/EntityFinder/details/view/table/FileEntitySizeCell.js.map +1 -1
  527. package/dist/components/EntityFinder/details/view/table/ModifiedByCell.js.map +1 -1
  528. package/dist/components/EntityFinder/details/view/table/ModifiedOnCell.js.map +1 -1
  529. package/dist/components/EntityFinder/details/view/table/ParentProjectCell.js.map +1 -1
  530. package/dist/components/EntityFinder/details/view/table/UserBadgeCell.js.map +1 -1
  531. package/dist/components/EntityFinder/tree/EntityTree.js +80 -80
  532. package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
  533. package/dist/components/EntityFinder/tree/VirtualizedTree.js +31 -31
  534. package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
  535. package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
  536. package/dist/components/EntityForm/EntityForm.js.map +1 -1
  537. package/dist/components/EntityHeaderTable/DebouncedInput.js.map +1 -1
  538. package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
  539. package/dist/components/EntityHeaderTable/EntityHeaderTableCellRenderers.js.map +1 -1
  540. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  541. package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
  542. package/dist/components/EntityIcon.js.map +1 -1
  543. package/dist/components/EntityLink.js.map +1 -1
  544. package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
  545. package/dist/components/EntityTreeTable/EntityTreeTable.js.map +1 -1
  546. package/dist/components/EntityTreeTable/components/AutoLoadMore.js.map +1 -1
  547. package/dist/components/EntityTreeTable/components/ColumnHeaders.js.map +1 -1
  548. package/dist/components/EntityTreeTable/components/EntityBadgeIconsCell.js.map +1 -1
  549. package/dist/components/EntityTreeTable/components/EntityNameCell.js.map +1 -1
  550. package/dist/components/EntityTreeTable/components/EntityTreeTableContext.js.map +1 -1
  551. package/dist/components/EntityTreeTable/components/EntityTreeTableRow.js.map +1 -1
  552. package/dist/components/EntityTreeTable/components/EntityTreeTableView.js.map +1 -1
  553. package/dist/components/EntityTreeTable/components/IdCell.js.map +1 -1
  554. package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
  555. package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
  556. package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
  557. package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
  558. package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
  559. package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
  560. package/dist/components/EntityUpload/EntityUploadModal.js +29 -31
  561. package/dist/components/EntityUpload/EntityUploadModal.js.map +1 -1
  562. package/dist/components/EntityUpload/EntityUploadPromptDialog.js.map +1 -1
  563. package/dist/components/EntityUpload/ExternalObjectStoreCredentialsForm.js.map +1 -1
  564. package/dist/components/EntityUpload/FileUploadProgress.js.map +1 -1
  565. package/dist/components/EntityUpload/LinkToURL.js.map +1 -1
  566. package/dist/components/EntityUpload/ProjectStorageLimitAlert.js.map +1 -1
  567. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  568. package/dist/components/EntityViewScopeEditor/EntityViewScopeEditor.js.map +1 -1
  569. package/dist/components/EntityViewScopeEditor/EntityViewScopeEditorModal.js.map +1 -1
  570. package/dist/components/Evaluation/CreatedOnByUserDiv.js.map +1 -1
  571. package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.js.map +1 -1
  572. package/dist/components/Evaluation/EvaluationCard.js.map +1 -1
  573. package/dist/components/Evaluation/EvaluationEditor.js.map +1 -1
  574. package/dist/components/Evaluation/EvaluationEditorPage.js.map +1 -1
  575. package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
  576. package/dist/components/Evaluation/EvaluationRoundEditorDropdown.js.map +1 -1
  577. package/dist/components/Evaluation/EvaluationRoundEditorList.js.map +1 -1
  578. package/dist/components/Evaluation/input_models/models.js.map +1 -1
  579. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js.map +1 -1
  580. package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.js.map +1 -1
  581. package/dist/components/EvaluationFinder/EvaluationFinder.js.map +1 -1
  582. package/dist/components/ExperimentalMode/ExperimentalMode.d.ts.map +1 -1
  583. package/dist/components/ExperimentalMode/ExperimentalMode.js +24 -30
  584. package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
  585. package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
  586. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  587. package/dist/components/FeaturedDataTabs/FacetPlotsCardGrid.js.map +1 -1
  588. package/dist/components/FeaturedDataTabs/FeaturedDataPlots.js.map +1 -1
  589. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
  590. package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
  591. package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
  592. package/dist/components/FeaturedResearch/FeaturedResearch.js +16 -18
  593. package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
  594. package/dist/components/FeaturedToolsList/FeaturedToolCard.js.map +1 -1
  595. package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
  596. package/dist/components/FilePreview/EntityPreview.js.map +1 -1
  597. package/dist/components/FilePreview/FileEntityPreview.js.map +1 -1
  598. package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
  599. package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
  600. package/dist/components/FilePreview/PdfPreview.js.map +1 -1
  601. package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
  602. package/dist/components/FilePreview/PreviewUtils.js.map +1 -1
  603. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  604. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  605. package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
  606. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  607. package/dist/components/Forum/ForumPage.js.map +1 -1
  608. package/dist/components/Forum/ForumTable.js.map +1 -1
  609. package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
  610. package/dist/components/Forum/SubscribersModal.js.map +1 -1
  611. package/dist/components/ForumSearch/ForumSearch.js.map +1 -1
  612. package/dist/components/FullTextSearch/FullTextSearch.js.map +1 -1
  613. package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
  614. package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
  615. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  616. package/dist/components/GenericCard/CardUtils.js.map +1 -1
  617. package/dist/components/GenericCard/CollapsibleDescription.js.map +1 -1
  618. package/dist/components/GenericCard/CroissantButton/CroissantButton.js.map +1 -1
  619. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  620. package/dist/components/GenericCard/GenericCardActionButton.js.map +1 -1
  621. package/dist/components/GenericCard/GenericCardIcon.js.map +1 -1
  622. package/dist/components/GenericCard/GenericCardTitle.js.map +1 -1
  623. package/dist/components/GenericCard/LabelMaybeWithIcon.js.map +1 -1
  624. package/dist/components/GenericCard/Linkify.js.map +1 -1
  625. package/dist/components/GenericCard/PortalDOI/PortalDOI.js.map +1 -1
  626. package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.js.map +1 -1
  627. package/dist/components/GenericCard/SynapseCardLabel.js +1 -1
  628. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  629. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  630. package/dist/components/GenericCard/useResolvedSynapseEntity.js.map +1 -1
  631. package/dist/components/Goals/Goals.Desktop.js.map +1 -1
  632. package/dist/components/Goals/Goals.Mobile.js.map +1 -1
  633. package/dist/components/Goals/Goals.js +25 -27
  634. package/dist/components/Goals/Goals.js.map +1 -1
  635. package/dist/components/GoalsV2/GoalsV2.Desktop.js.map +1 -1
  636. package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
  637. package/dist/components/GoalsV2/GoalsV2.js +14 -16
  638. package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
  639. package/dist/components/GoalsV3/GoalsV3.Desktop.js.map +1 -1
  640. package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
  641. package/dist/components/GoalsV3/GoalsV3.js +14 -16
  642. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  643. package/dist/components/GoogleAnalytics/GoogleAnalytics.js.map +1 -1
  644. package/dist/components/GoogleMap/GoogleMap.js.map +1 -1
  645. package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
  646. package/dist/components/HasAccess/AccessIcon.js +10 -10
  647. package/dist/components/HasAccess/AccessIcon.js.map +1 -1
  648. package/dist/components/HasAccess/HasAccessV2.js.map +1 -1
  649. package/dist/components/HasAccess/useHasAccess.js.map +1 -1
  650. package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
  651. package/dist/components/HeaderCard.js.map +1 -1
  652. package/dist/components/HelpPopover/HelpPopover.js.map +1 -1
  653. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  654. package/dist/components/IDUReport/IDUReport.js.map +1 -1
  655. package/dist/components/IDUReport/IDUReportSubmissionInfo.js.map +1 -1
  656. package/dist/components/Icon/Icon.js.map +1 -1
  657. package/dist/components/IconList.js.map +1 -1
  658. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  659. package/dist/components/IconSvgButton.js.map +1 -1
  660. package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js +7 -9
  661. package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
  662. package/dist/components/ImageFromSynapseTable.js.map +1 -1
  663. package/dist/components/InteractiveCopyIdsIcon.js.map +1 -1
  664. package/dist/components/JSONArrayEditor/JSONArrayEditor.js.map +1 -1
  665. package/dist/components/JSONArrayEditor/JSONArrayEditorModal.js.map +1 -1
  666. package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
  667. package/dist/components/JsonLdScript.js.map +1 -1
  668. package/dist/components/JsonSchemaForm/JsonSchemaForm.js.map +1 -1
  669. package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
  670. package/dist/components/JsonSchemaForm/templates/ArrayFieldItemButtonTemplate.js.map +1 -1
  671. package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
  672. package/dist/components/JsonSchemaForm/templates/ArrayFieldTemplate.js.map +1 -1
  673. package/dist/components/JsonSchemaForm/templates/ArrayFieldTitleTemplate.js.map +1 -1
  674. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  675. package/dist/components/JsonSchemaForm/templates/ButtonTemplate.js.map +1 -1
  676. package/dist/components/JsonSchemaForm/templates/DescriptionFieldTemplate.js.map +1 -1
  677. package/dist/components/JsonSchemaForm/templates/ErrorListTemplate.js.map +1 -1
  678. package/dist/components/JsonSchemaForm/templates/FieldDescriptionTable.js.map +1 -1
  679. package/dist/components/JsonSchemaForm/templates/FieldErrorTemplate.js.map +1 -1
  680. package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
  681. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  682. package/dist/components/JsonSchemaForm/widgets/BooleanWidget.js.map +1 -1
  683. package/dist/components/JsonSchemaForm/widgets/DateTimeWidget.js.map +1 -1
  684. package/dist/components/JsonSchemaForm/widgets/SelectWidget.js.map +1 -1
  685. package/dist/components/LoadingScreen/LoadingScreen.js.map +1 -1
  686. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
  687. package/dist/components/Markdown/GovernanceMarkdownGithub.js.map +1 -1
  688. package/dist/components/Markdown/MarkdownCollapse.js.map +1 -1
  689. package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
  690. package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
  691. package/dist/components/Markdown/MarkdownPopover.js.map +1 -1
  692. package/dist/components/Markdown/MarkdownSynapse.d.ts.map +1 -1
  693. package/dist/components/Markdown/MarkdownSynapse.js +75 -106
  694. package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
  695. package/dist/components/Markdown/MarkdownUtils.d.ts +14 -4
  696. package/dist/components/Markdown/MarkdownUtils.d.ts.map +1 -1
  697. package/dist/components/Markdown/MarkdownUtils.js +38 -37
  698. package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
  699. package/dist/components/Markdown/MarkdownWidget.js.map +1 -1
  700. package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
  701. package/dist/components/Markdown/UserMentionModal.js.map +1 -1
  702. package/dist/components/Markdown/widget/Bookmarks.js.map +1 -1
  703. package/dist/components/Markdown/widget/MarkdownButton.js.map +1 -1
  704. package/dist/components/Markdown/widget/MarkdownEntityPreview.js.map +1 -1
  705. package/dist/components/Markdown/widget/MarkdownIDUReport.js.map +1 -1
  706. package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
  707. package/dist/components/Markdown/widget/MarkdownSynapseImage.js.map +1 -1
  708. package/dist/components/Markdown/widget/MarkdownSynapsePlot.js.map +1 -1
  709. package/dist/components/Markdown/widget/MarkdownSynapseTable.js.map +1 -1
  710. package/dist/components/Markdown/widget/MarkdownTableOfContents.js.map +1 -1
  711. package/dist/components/Markdown/widget/MarkdownUserOrTeamBadge.js.map +1 -1
  712. package/dist/components/Markdown/widget/MarkdownVideo.js.map +1 -1
  713. package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
  714. package/dist/components/ModalDownload/ModalDownload.FormSchema.js.map +1 -1
  715. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  716. package/dist/components/MuiContainer.js.map +1 -1
  717. package/dist/components/OAuthClientAclEditor/OAuthAclEditorModal.js.map +1 -1
  718. package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
  719. package/dist/components/OAuthClientManagement/CreateOAuthClient.js.map +1 -1
  720. package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
  721. package/dist/components/OrientationBanner/OrientationBanner.js.map +1 -1
  722. package/dist/components/PageProgress/PageProgress.js.map +1 -1
  723. package/dist/components/Plot/BarPlot.js.map +1 -1
  724. package/dist/components/Plot/DotPlot.js.map +1 -1
  725. package/dist/components/Plot/Plot.d.ts +12 -1
  726. package/dist/components/Plot/Plot.d.ts.map +1 -1
  727. package/dist/components/Plot/Plot.js +5 -1
  728. package/dist/components/Plot/Plot.js.map +1 -1
  729. package/dist/components/Plot/PlotPanelHeader.js.map +1 -1
  730. package/dist/components/Plot/SynapsePlot.js.map +1 -1
  731. package/dist/components/Plot/SynapseSankeyPlot.d.ts +12 -0
  732. package/dist/components/Plot/SynapseSankeyPlot.d.ts.map +1 -0
  733. package/dist/components/Plot/SynapseSankeyPlot.js +54 -0
  734. package/dist/components/Plot/SynapseSankeyPlot.js.map +1 -0
  735. package/dist/components/Plot/ThemesPlot.js.map +1 -1
  736. package/dist/components/Plot/UpsetPlot.js.map +1 -1
  737. package/dist/components/Plot/index.d.ts +3 -1
  738. package/dist/components/Plot/index.d.ts.map +1 -1
  739. package/dist/components/Plot/index.js +2 -1
  740. package/dist/components/Plot/safe-react-plotly-factory.js.map +1 -1
  741. package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
  742. package/dist/components/PortalAclEditor/PortalAclEditorModal.js.map +1 -1
  743. package/dist/components/PortalFeatureHighlights/PortalFeatureHighlights.js.map +1 -1
  744. package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js +4 -6
  745. package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
  746. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
  747. package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
  748. package/dist/components/PortalList/PortalCard.js.map +1 -1
  749. package/dist/components/PortalList/PortalList.js.map +1 -1
  750. package/dist/components/PortalSectionHeader/PortalSectionHeader.js.map +1 -1
  751. package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js +69 -69
  752. package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
  753. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  754. package/dist/components/Programs/Programs.Desktop.js.map +1 -1
  755. package/dist/components/Programs/Programs.Mobile.js.map +1 -1
  756. package/dist/components/Programs/Programs.js.map +1 -1
  757. package/dist/components/ProjectStorage/ProjectDataAvailability.js.map +1 -1
  758. package/dist/components/ProvenanceGraph/ActivityNodeLabel.js.map +1 -1
  759. package/dist/components/ProvenanceGraph/EntityNodeLabel.js.map +1 -1
  760. package/dist/components/ProvenanceGraph/EntityPlaceholderNodeLabel.js.map +1 -1
  761. package/dist/components/ProvenanceGraph/ExpandGraphNodeLabel.js.map +1 -1
  762. package/dist/components/ProvenanceGraph/ExternalGraphNodeLabel.js.map +1 -1
  763. package/dist/components/ProvenanceGraph/ProvenanceEntityIcon.js.map +1 -1
  764. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  765. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  766. package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
  767. package/dist/components/ProvenanceGraph/ProvenanceUtils.js +13 -13
  768. package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
  769. package/dist/components/ProvenanceGraph/UndefinedNodeLabel.js.map +1 -1
  770. package/dist/components/QueryContext/QueryContext.js.map +1 -1
  771. package/dist/components/QueryCount/QueryCount.js.map +1 -1
  772. package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
  773. package/dist/components/QuerySortSelector.js.map +1 -1
  774. package/dist/components/QueryVisualizationWrapper/NoContentPlaceholder.js.map +1 -1
  775. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.js.map +1 -1
  776. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  777. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +67 -65
  778. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  779. package/dist/components/QueryWrapper/QueryWrapper.js +27 -27
  780. package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
  781. package/dist/components/QueryWrapper/QueryWrapperLoadingScreen.js.map +1 -1
  782. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  783. package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
  784. package/dist/components/QueryWrapper/ViewMoreQueryResultsButton.js.map +1 -1
  785. package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
  786. package/dist/components/QueryWrapper/useComputeRowSelectionPrimaryKey.js.map +1 -1
  787. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js.map +1 -1
  788. package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
  789. package/dist/components/QueryWrapper/useHasFacetedSelectColumn.js.map +1 -1
  790. package/dist/components/QueryWrapper/useOnQueryDataChange.js.map +1 -1
  791. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  792. package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js.map +1 -1
  793. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
  794. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  795. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +1 -0
  796. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  797. package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js.map +1 -1
  798. package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
  799. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  800. package/dist/components/RORInstitutionField/RORInstitutionField.js.map +1 -1
  801. package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js +6 -8
  802. package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
  803. package/dist/components/RegisterPageLogoutPrompt/RegisterPageLogoutPrompt.js.map +1 -1
  804. package/dist/components/ReleaseCard/ReleaseCard.js.map +1 -1
  805. package/dist/components/ReleaseCard/ReleaseCardLarge.js.map +1 -1
  806. package/dist/components/ReleaseCard/ReleaseCardMedium.js.map +1 -1
  807. package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
  808. package/dist/components/RenderIfInView/RenderIfInView.js.map +1 -1
  809. package/dist/components/ResizableContainer/ResizableContainer.js.map +1 -1
  810. package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
  811. package/dist/components/Resources/Resources.Desktop.js.map +1 -1
  812. package/dist/components/Resources/Resources.Mobile.js.map +1 -1
  813. package/dist/components/Resources/Resources.js +8 -11
  814. package/dist/components/Resources/Resources.js.map +1 -1
  815. package/dist/components/RowDataTable/RowDataTable.js.map +1 -1
  816. package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
  817. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  818. package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
  819. package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
  820. package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js.map +1 -1
  821. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js.map +1 -1
  822. package/dist/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.js.map +1 -1
  823. package/dist/components/SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.js.map +1 -1
  824. package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js.map +1 -1
  825. package/dist/components/SchemaDrivenAnnotationEditor/template/SynapseAnnotationsWrapIfAdditionalTemplate.js.map +1 -1
  826. package/dist/components/SchemaDrivenAnnotationEditor/widget/TextWidget.js.map +1 -1
  827. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  828. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -1
  829. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +1 -1
  830. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
  831. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +1 -0
  832. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
  833. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  834. package/dist/components/SetBasicAccessRequirementFields/AccessRequirementTextInstructions.js.map +1 -1
  835. package/dist/components/SetBasicAccessRequirementFields/AccessRequirementWikiInstructions.js.map +1 -1
  836. package/dist/components/SetBasicAccessRequirementFields/AccessorRequirements.js.map +1 -1
  837. package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.js.map +1 -1
  838. package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.js.map +1 -1
  839. package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
  840. package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
  841. package/dist/components/ShowMore/ShowMore.js.map +1 -1
  842. package/dist/components/SignInButton.js.map +1 -1
  843. package/dist/components/SignInRequiredModal/SignInRequiredModal.js.map +1 -1
  844. package/dist/components/Skeleton/SkeletonButton.js.map +1 -1
  845. package/dist/components/Skeleton/SkeletonInlineBlock.js.map +1 -1
  846. package/dist/components/Skeleton/SkeletonParagraph.js.map +1 -1
  847. package/dist/components/Skeleton/SkeletonTable.js.map +1 -1
  848. package/dist/components/SmartLink/SmartButton.js.map +1 -1
  849. package/dist/components/SmartLink/SmartLink.js.map +1 -1
  850. package/dist/components/SmartLink/useSmartLink.js.map +1 -1
  851. package/dist/components/SourceAppImage.js.map +1 -1
  852. package/dist/components/SpinnerButton/SpinnerButton.js.map +1 -1
  853. package/dist/components/SqlDefinedTableEditor/SqlDefinedTableEditor.js.map +1 -1
  854. package/dist/components/SqlDefinedTableEditor/SqlDefinedTableEditorModal.js.map +1 -1
  855. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts +1 -1
  856. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts.map +1 -1
  857. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
  858. package/dist/components/StatisticsPlot.js.map +1 -1
  859. package/dist/components/StepperDialog/StepperDialog.js.map +1 -1
  860. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  861. package/dist/components/SubmissionViewScopeEditor/SubmissionViewScopeEditor.js.map +1 -1
  862. package/dist/components/SubmissionViewScopeEditor/SubmissionViewScopeEditorModal.js.map +1 -1
  863. package/dist/components/SubscriptionPage/ForumTopic.js.map +1 -1
  864. package/dist/components/SubscriptionPage/SubscriptionItem.js.map +1 -1
  865. package/dist/components/SubscriptionPage/SubscriptionPage.js.map +1 -1
  866. package/dist/components/SubscriptionPage/ThreadTopic.js.map +1 -1
  867. package/dist/components/SubscriptionPage/Topic.js.map +1 -1
  868. package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
  869. package/dist/components/SustainabilityScorecard/Dial.js.map +1 -1
  870. package/dist/components/SustainabilityScorecard/DialLayout.js.map +1 -1
  871. package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
  872. package/dist/components/SustainabilityScorecard/SustainabilityScorecardSummary.js.map +1 -1
  873. package/dist/components/SustainabilityScorecard/SustainabilityScorecardUtils.js.map +1 -1
  874. package/dist/components/SynapseChat/AccessLevelMenu.js.map +1 -1
  875. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  876. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  877. package/dist/components/SynapseChat/SynapseChatDialog.js.map +1 -1
  878. package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
  879. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  880. package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -1
  881. package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
  882. package/dist/components/SynapseChat/useChatState.js.map +1 -1
  883. package/dist/components/SynapseFooter/SynapseFooter.js.map +1 -1
  884. package/dist/components/SynapseFooter/SynapseLinksColumn.js.map +1 -1
  885. package/dist/components/SynapseForm/DataDebug.js.map +1 -1
  886. package/dist/components/SynapseForm/Header.js.map +1 -1
  887. package/dist/components/SynapseForm/NavButtons.js.map +1 -1
  888. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  889. package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
  890. package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
  891. package/dist/components/SynapseForm/SynapseFormCheckboxWidget.js.map +1 -1
  892. package/dist/components/SynapseForm/SynapseFormCheckboxesWidget.js.map +1 -1
  893. package/dist/components/SynapseForm/SynapseFormRadioWidget.js.map +1 -1
  894. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js.map +1 -1
  895. package/dist/components/SynapseForm/SynapseFormUtils.js.map +1 -1
  896. package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
  897. package/dist/components/SynapseForm/WarningDialog.js.map +1 -1
  898. package/dist/components/SynapseForm/types.js.map +1 -1
  899. package/dist/components/SynapseForm/useGetFormPropsFromSearchParams.js.map +1 -1
  900. package/dist/components/SynapseHomepageV2/FloatingBlobsBackground.js.map +1 -1
  901. package/dist/components/SynapseHomepageV2/HomepageStyles.js.map +1 -1
  902. package/dist/components/SynapseHomepageV2/SynapseByTheNumbers.js.map +1 -1
  903. package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
  904. package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
  905. package/dist/components/SynapseHomepageV2/SynapseFeaturedDatasetItem.js.map +1 -1
  906. package/dist/components/SynapseHomepageV2/SynapseFeaturedDatasets.js.map +1 -1
  907. package/dist/components/SynapseHomepageV2/SynapseFeatures.js.map +1 -1
  908. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js +18 -21
  909. package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
  910. package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js.map +1 -1
  911. package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
  912. package/dist/components/SynapseHomepageV2/SynapseHomepageV2.js.map +1 -1
  913. package/dist/components/SynapseHomepageV2/SynapseHotdrops.js.map +1 -1
  914. package/dist/components/SynapseHomepageV2/SynapseHotdropsItem.js.map +1 -1
  915. package/dist/components/SynapseHomepageV2/SynapseInAction.js.map +1 -1
  916. package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
  917. package/dist/components/SynapseHomepageV2/SynapsePartners.js.map +1 -1
  918. package/dist/components/SynapseHomepageV2/SynapsePlan.js.map +1 -1
  919. package/dist/components/SynapseHomepageV2/SynapsePlanContent.js.map +1 -1
  920. package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
  921. package/dist/components/SynapseHomepageV2/SynapsePlansPage.js.map +1 -1
  922. package/dist/components/SynapseHomepageV2/SynapseSearchChips.js.map +1 -1
  923. package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
  924. package/dist/components/SynapseHomepageV2/SynapseTrendingProjectsItem.js.map +1 -1
  925. package/dist/components/SynapseHomepageV2/WordPressNews.js.map +1 -1
  926. package/dist/components/SynapseHomepageV2/WordPressNewsItem.js.map +1 -1
  927. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +78 -78
  928. package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
  929. package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
  930. package/dist/components/SynapseSearchPageResults/HasAccessChip.js.map +1 -1
  931. package/dist/components/SynapseSearchPageResults/HighlightedTypography.js.map +1 -1
  932. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
  933. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  934. package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js.map +1 -1
  935. package/dist/components/SynapseSearchPageResults/SynapseSearchPage.js.map +1 -1
  936. package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
  937. package/dist/components/SynapseSearchPageResults/SynapseSearchPageRouter.js.map +1 -1
  938. package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js.map +1 -1
  939. package/dist/components/SynapseSearchPageResults/chipStyles.js.map +1 -1
  940. package/dist/components/SynapseTable/CustomControls/CustomControlButton.js.map +1 -1
  941. package/dist/components/SynapseTable/CustomControls/CustomControlPanel.js.map +1 -1
  942. package/dist/components/SynapseTable/CustomControls/CustomControls.js.map +1 -1
  943. package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
  944. package/dist/components/SynapseTable/ExpandCollapseButton.js.map +1 -1
  945. package/dist/components/SynapseTable/ExpandableTableDataCell.js.map +1 -1
  946. package/dist/components/SynapseTable/NoContentAvailable.js.map +1 -1
  947. package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
  948. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +4 -4
  949. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  950. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js.map +1 -1
  951. package/dist/components/SynapseTable/SearchResultsNotFound.js.map +1 -1
  952. package/dist/components/SynapseTable/SearchV2.js.map +1 -1
  953. package/dist/components/SynapseTable/SqlEditor.js.map +1 -1
  954. package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
  955. package/dist/components/SynapseTable/SynapseTableCell/EntityIdList.js.map +1 -1
  956. package/dist/components/SynapseTable/SynapseTableCell/EvaluationIdRenderer.js.map +1 -1
  957. package/dist/components/SynapseTable/SynapseTableCell/JSON/ComplexJSONRenderer.js.map +1 -1
  958. package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONArrayRenderer.js.map +1 -1
  959. package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONObjectRenderer.js.map +1 -1
  960. package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONPrimitiveRenderer.js.map +1 -1
  961. package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONRendererUtils.js.map +1 -1
  962. package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONTableCellRenderer.js.map +1 -1
  963. package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
  964. package/dist/components/SynapseTable/SynapseTableCell/UserIdList.js.map +1 -1
  965. package/dist/components/SynapseTable/SynapseTableConstants.js.map +1 -1
  966. package/dist/components/SynapseTable/SynapseTableContext.js.map +1 -1
  967. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  968. package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
  969. package/dist/components/SynapseTable/TableIsEmpty.js.map +1 -1
  970. package/dist/components/SynapseTable/TablePagination.js.map +1 -1
  971. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
  972. package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js.map +1 -1
  973. package/dist/components/SynapseTable/datasets/DatasetEditorCheckboxCell.js.map +1 -1
  974. package/dist/components/SynapseTable/datasets/DatasetEditorUtils.js.map +1 -1
  975. package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js.map +1 -1
  976. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +131 -133
  977. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  978. package/dist/components/SynapseTable/datasets/EntityFetchErrorCell.js.map +1 -1
  979. package/dist/components/SynapseTable/export/ADDiscoveryPortalInstructions.js.map +1 -1
  980. package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js +48 -51
  981. package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js.map +1 -1
  982. package/dist/components/SynapseTable/export/ExternalAnalysisPlatformInstructions.js.map +1 -1
  983. package/dist/components/SynapseTable/export/ExternalAnalysisPlatformsConstants.js.map +1 -1
  984. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
  985. package/dist/components/SynapseTable/export/ExternalPlatformDisclaimer.js.map +1 -1
  986. package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
  987. package/dist/components/SynapseTable/table-top/DownloadLoginModal.js.map +1 -1
  988. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  989. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  990. package/dist/components/SynapseTable/useTableSort.js.map +1 -1
  991. package/dist/components/SystemUseNotification/SystemUseNotification.js.map +1 -1
  992. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +12 -12
  993. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  994. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
  995. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/FieldWithRecommendedMinimum.js.map +1 -1
  996. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/MultiValueField.js +4 -4
  997. package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/MultiValueField.js.map +1 -1
  998. package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
  999. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditor.js.map +1 -1
  1000. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js.map +1 -1
  1001. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  1002. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +32 -32
  1003. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  1004. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.js.map +1 -1
  1005. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
  1006. package/dist/components/TableColumnSchemaEditor/Validators/BooleanSchema.js.map +1 -1
  1007. package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
  1008. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  1009. package/dist/components/TableColumnSchemaEditor/Validators/DefaultValueValidator.js.map +1 -1
  1010. package/dist/components/TableColumnSchemaEditor/Validators/DoubleSchema.js.map +1 -1
  1011. package/dist/components/TableColumnSchemaEditor/Validators/EntityIdSchema.js.map +1 -1
  1012. package/dist/components/TableColumnSchemaEditor/Validators/EnumValuesValidator.js.map +1 -1
  1013. package/dist/components/TableColumnSchemaEditor/Validators/IntegerSchema.js.map +1 -1
  1014. package/dist/components/TableColumnSchemaEditor/Validators/OptionalStringSchema.js.map +1 -1
  1015. package/dist/components/TableColumnSchemaEditor/Validators/getZodSchemaForColumnType.js.map +1 -1
  1016. package/dist/components/TableFeedCards/TableFeedCards.js.map +1 -1
  1017. package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
  1018. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  1019. package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
  1020. package/dist/components/TanStackTable/StyledVirtualTanStackTable.js.map +1 -1
  1021. package/dist/components/TanStackTable/TableBody.js.map +1 -1
  1022. package/dist/components/TanStackTable/TableCellRenderer.js.map +1 -1
  1023. package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
  1024. package/dist/components/TeamBadge.js.map +1 -1
  1025. package/dist/components/TeamSubjectsSelector/TeamBadgeOrError.js.map +1 -1
  1026. package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
  1027. package/dist/components/TemplateComponent.js.map +1 -1
  1028. package/dist/components/TemporaryBanner/TemporaryBanner.js.map +1 -1
  1029. package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
  1030. package/dist/components/TermsAndConditions/TermsAndConditionsItem.js.map +1 -1
  1031. package/dist/components/TextField/TextField.js.map +1 -1
  1032. package/dist/components/TextField/TextFieldWithWordLimit.js.map +1 -1
  1033. package/dist/components/TextToComponentCollapse.js.map +1 -1
  1034. package/dist/components/ThemeGallery/ThemeGallery.js.map +1 -1
  1035. package/dist/components/TimelinePlot/TimelineLegendItem.js.map +1 -1
  1036. package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
  1037. package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
  1038. package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
  1039. package/dist/components/TimelinePlot/phasesQueryResponseData.js.map +1 -1
  1040. package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
  1041. package/dist/components/TotalQueryResults.js.map +1 -1
  1042. package/dist/components/UserCard/Avatar.js.map +1 -1
  1043. package/dist/components/UserCard/UserBadge.js.map +1 -1
  1044. package/dist/components/UserCard/UserCard.js.map +1 -1
  1045. package/dist/components/UserCard/UserCardContextMenu.js.map +1 -1
  1046. package/dist/components/UserCard/UserCardLarge.js.map +1 -1
  1047. package/dist/components/UserCard/UserCardMedium.js.map +1 -1
  1048. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  1049. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Desktop.js.map +1 -1
  1050. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
  1051. package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.js.map +1 -1
  1052. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  1053. package/dist/components/UserOrTeamBadge/UserOrTeamBadge.js.map +1 -1
  1054. package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
  1055. package/dist/components/UserProfileLinks/UserChallenges.js.map +1 -1
  1056. package/dist/components/UserProfileLinks/UserProfileLinks.js.map +1 -1
  1057. package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
  1058. package/dist/components/UserProfileLinks/UserTeams.js.map +1 -1
  1059. package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
  1060. package/dist/components/Webhook/CreateWebhookModal.js.map +1 -1
  1061. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  1062. package/dist/components/Webhook/WebhookVerificationDialog.js.map +1 -1
  1063. package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
  1064. package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
  1065. package/dist/components/WizardChoiceButton/WizardChoiceButton.js.map +1 -1
  1066. package/dist/components/WizardChoiceButton/WizardChoiceButtonDescription.js.map +1 -1
  1067. package/dist/components/WizardChoiceButton/WizardChoiceButtonGroup.js.map +1 -1
  1068. package/dist/components/WordPress/WordPressLatestPostChip.js.map +1 -1
  1069. package/dist/components/WordPress/useWordPressCategories.js.map +1 -1
  1070. package/dist/components/WordPress/useWordPressPosts.js.map +1 -1
  1071. package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
  1072. package/dist/components/dataaccess/AccessHistoryDashboard.js.map +1 -1
  1073. package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
  1074. package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
  1075. package/dist/components/dataaccess/AccessRequirementSearchBox/AccessRequirementSearchBox.js.map +1 -1
  1076. package/dist/components/dataaccess/AccessRequirementTable.js.map +1 -1
  1077. package/dist/components/dataaccess/AccessSubmissionDashboard.js.map +1 -1
  1078. package/dist/components/dataaccess/RejectDataAccessRequestModal.js.map +1 -1
  1079. package/dist/components/dataaccess/RejectProfileValidationRequestModal.js.map +1 -1
  1080. package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
  1081. package/dist/components/dataaccess/SubmissionPage/ApproveSubmissionConfirmationModal.js.map +1 -1
  1082. package/dist/components/dataaccess/SubmissionPage/CancelDataAccessRequestConfirmationModal.js.map +1 -1
  1083. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  1084. package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
  1085. package/dist/components/dataaccess/UserAccessRequestHistory/SubmissionSortStateTranslator.js.map +1 -1
  1086. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.js.map +1 -1
  1087. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
  1088. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
  1089. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  1090. package/dist/components/doi/DoiFormSchemas.js.map +1 -1
  1091. package/dist/components/doi/PrivateEntityDoiWarning.js.map +1 -1
  1092. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
  1093. package/dist/components/download_list/DownloadConfirmationUI.js +30 -32
  1094. package/dist/components/download_list/DownloadConfirmationUI.js.map +1 -1
  1095. package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
  1096. package/dist/components/download_list/DownloadDetails.js.map +1 -1
  1097. package/dist/components/download_list/index.js.map +1 -1
  1098. package/dist/components/entity/metadata/AnnotationsTable.js.map +1 -1
  1099. package/dist/components/entity/metadata/EntityAnnotationKey.js.map +1 -1
  1100. package/dist/components/entity/metadata/EntityModal.js.map +1 -1
  1101. package/dist/components/entity/metadata/MetadataTable.js.map +1 -1
  1102. package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
  1103. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  1104. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js.map +1 -1
  1105. package/dist/components/entity/page/title_bar/CitationsDialog.js.map +1 -1
  1106. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  1107. package/dist/components/entity/page/title_bar/EntityTitleBarVersionInfo.js.map +1 -1
  1108. package/dist/components/entity/page/title_bar/TitleBarProperties.js.map +1 -1
  1109. package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
  1110. package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
  1111. package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
  1112. package/dist/components/error/ErrorBanner.js.map +1 -1
  1113. package/dist/components/error/ErrorChip.js.map +1 -1
  1114. package/dist/components/error/ErrorPage.js +24 -24
  1115. package/dist/components/error/ErrorPage.js.map +1 -1
  1116. package/dist/components/error/RouteErrorBoundary.js.map +1 -1
  1117. package/dist/components/error/SendMessageToEntityOwnerDialog.js.map +1 -1
  1118. package/dist/components/error/SynapseObjectDOIInfo.js.map +1 -1
  1119. package/dist/components/favorites/FavoriteButton.js.map +1 -1
  1120. package/dist/components/favorites/FavoritesPage.js.map +1 -1
  1121. package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
  1122. package/dist/components/file/upload/MultiFileUploadProgress.js.map +1 -1
  1123. package/dist/components/file/upload/UploadFilePanel.js.map +1 -1
  1124. package/dist/components/form/RadioGroupWithOtherString.js.map +1 -1
  1125. package/dist/components/home_page/ExpandableContent.js.map +1 -1
  1126. package/dist/components/index.js +48 -47
  1127. package/dist/components/layout/InfiniteTableLayout.js.map +1 -1
  1128. package/dist/components/layout/SWCHeader.js.map +1 -1
  1129. package/dist/components/layout/SWCPageLayout.js.map +1 -1
  1130. package/dist/components/menu/ComplexMenu.js.map +1 -1
  1131. package/dist/components/menu/DropdownMenu.js.map +1 -1
  1132. package/dist/components/row_renderers/Dataset.js.map +1 -1
  1133. package/dist/components/row_renderers/Funder.js.map +1 -1
  1134. package/dist/components/row_renderers/ObservationCard.js.map +1 -1
  1135. package/dist/components/row_renderers/utils/CardFooter.js.map +1 -1
  1136. package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
  1137. package/dist/components/styled/HoverPopover.js.map +1 -1
  1138. package/dist/components/styled/InlineBadge.js.map +1 -1
  1139. package/dist/components/styled/InputSizedButton.js.map +1 -1
  1140. package/dist/components/styled/LargeButton.js.map +1 -1
  1141. package/dist/components/styled/LeftRightPanel.js.map +1 -1
  1142. package/dist/components/styled/LightTooltip.js.map +1 -1
  1143. package/dist/components/styled/StyledFormControl.js.map +1 -1
  1144. package/dist/components/styled/StyledPopover.js.map +1 -1
  1145. package/dist/components/styled/StyledTableContainer.js.map +1 -1
  1146. package/dist/components/styled/WideButton.js.map +1 -1
  1147. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts +18 -0
  1148. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts.map +1 -0
  1149. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js +113 -0
  1150. package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js.map +1 -0
  1151. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  1152. package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts +5 -5
  1153. package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts.map +1 -1
  1154. package/dist/components/table/CsvPreview/CsvPreviewDialog.js +27 -76
  1155. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  1156. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts +19 -0
  1157. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts.map +1 -0
  1158. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js +41 -0
  1159. package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js.map +1 -0
  1160. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts +12 -0
  1161. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts.map +1 -0
  1162. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js +25 -0
  1163. package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js.map +1 -0
  1164. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts +18 -0
  1165. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts.map +1 -0
  1166. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js +55 -0
  1167. package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js.map +1 -0
  1168. package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts +19 -0
  1169. package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts.map +1 -0
  1170. package/dist/components/table/CsvPreview/useCreateTableFromCsv.js +35 -0
  1171. package/dist/components/table/CsvPreview/useCreateTableFromCsv.js.map +1 -0
  1172. package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts +22 -0
  1173. package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts.map +1 -0
  1174. package/dist/components/table/CsvPreview/useCsvUploadPreview.js +32 -0
  1175. package/dist/components/table/CsvPreview/useCsvUploadPreview.js.map +1 -0
  1176. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts +14 -0
  1177. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts.map +1 -0
  1178. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js +23 -0
  1179. package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js.map +1 -0
  1180. package/dist/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm.js.map +1 -1
  1181. package/dist/components/trash/TrashCanList.js.map +1 -1
  1182. package/dist/components/utils/Blocker.js.map +1 -1
  1183. package/dist/components/utils/ConditionalWrapper.js.map +1 -1
  1184. package/dist/components/utils/VisibilityObserver.js.map +1 -1
  1185. package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
  1186. package/dist/components/widgets/EntityColumnImage.js.map +1 -1
  1187. package/dist/components/widgets/FileHandleLink.js.map +1 -1
  1188. package/dist/components/widgets/ImageFileHandle.js.map +1 -1
  1189. package/dist/components/widgets/LoginAwareButton.js.map +1 -1
  1190. package/dist/components/widgets/Range.js.map +1 -1
  1191. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  1192. package/dist/components/widgets/SynapseImage.js.map +1 -1
  1193. package/dist/components/widgets/SynapseVideo.js.map +1 -1
  1194. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  1195. package/dist/components/widgets/facet-nav/FacetPlotLegendList.js.map +1 -1
  1196. package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js.map +1 -1
  1197. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.js.map +1 -1
  1198. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  1199. package/dist/components/widgets/facet-nav/PlotsContainerSkeleton.js.map +1 -1
  1200. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js.map +1 -1
  1201. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  1202. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  1203. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
  1204. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  1205. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.js.map +1 -1
  1206. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
  1207. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterSkeleton.js.map +1 -1
  1208. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  1209. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.js.map +1 -1
  1210. package/dist/components/widgets/query-filter/FacetChip.js.map +1 -1
  1211. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  1212. package/dist/components/widgets/query-filter/FacetFilterHeader.js.map +1 -1
  1213. package/dist/components/widgets/query-filter/FacetFilterSkeleton.js.map +1 -1
  1214. package/dist/components/widgets/query-filter/FacetFilterUtils.js.map +1 -1
  1215. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js.map +1 -1
  1216. package/dist/components/widgets/query-filter/RangeFacetFilter.js +3 -3
  1217. package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
  1218. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js +41 -41
  1219. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
  1220. package/dist/features/curator/GridPage/GridPage.js.map +1 -1
  1221. package/dist/features/curator/GridPage/components/GridPageRouter.js.map +1 -1
  1222. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  1223. package/dist/features/curator/GridPage/components/UpdateGridPageSearchParamsForm.js.map +1 -1
  1224. package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -1
  1225. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
  1226. package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -1
  1227. package/dist/features/curator/dashboard/components/UserOrTeamChip.js.map +1 -1
  1228. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts +5 -0
  1229. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
  1230. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +227 -181
  1231. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  1232. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  1233. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +3 -0
  1234. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  1235. package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
  1236. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +37 -34
  1237. package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
  1238. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  1239. package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
  1240. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
  1241. package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
  1242. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.d.ts.map +1 -1
  1243. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
  1244. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
  1245. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
  1246. package/dist/features/entity/metadata-task/utils/constants.d.ts +11 -3
  1247. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
  1248. package/dist/features/entity/metadata-task/utils/constants.js +2 -2
  1249. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
  1250. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js.map +1 -1
  1251. package/dist/features/entity/metadata-task/utils/getGridSourceIdForTask.js.map +1 -1
  1252. package/dist/features/entity/metadata-task/utils/getLatestGridSessionForSource.js.map +1 -1
  1253. package/dist/features/entity/metadata-task/utils/taskHasAssignee.js.map +1 -1
  1254. package/dist/features/team/invitation/components/OpenInvitationsToUserCard.js.map +1 -1
  1255. package/dist/index.js +54 -53
  1256. package/dist/index.js.map +1 -1
  1257. package/dist/mocks/MockAccessApprovals.js.map +1 -1
  1258. package/dist/mocks/MockSynapseContext.js.map +1 -1
  1259. package/dist/mocks/accessRequirement/mockAccessRequirementAcls.js.map +1 -1
  1260. package/dist/mocks/accessRequirement/mockAccessRequirements.js.map +1 -1
  1261. package/dist/mocks/applicationSessionContext/MockApplicationSessionContext.js.map +1 -1
  1262. package/dist/mocks/challenge/mockChallenge.js.map +1 -1
  1263. package/dist/mocks/chat/mockChat.js.map +1 -1
  1264. package/dist/mocks/curation/mockCurationTask.js.map +1 -1
  1265. package/dist/mocks/dataaccess/MockDataAccessRequest.js.map +1 -1
  1266. package/dist/mocks/dataaccess/MockResearchProject.js.map +1 -1
  1267. package/dist/mocks/dataaccess/MockSubmission.js.map +1 -1
  1268. package/dist/mocks/dataaccess/mockAccessRequest.js.map +1 -1
  1269. package/dist/mocks/discussion/mock_discussion.js.map +1 -1
  1270. package/dist/mocks/doi/MockDoi.js.map +1 -1
  1271. package/dist/mocks/entity/index.js.map +1 -1
  1272. package/dist/mocks/entity/mockDataset.js.map +1 -1
  1273. package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
  1274. package/dist/mocks/entity/mockEntity.js.map +1 -1
  1275. package/dist/mocks/entity/mockEvaluationQueue.js.map +1 -1
  1276. package/dist/mocks/entity/mockFileEntity.js.map +1 -1
  1277. package/dist/mocks/entity/mockFileEntityACLVariants.js.map +1 -1
  1278. package/dist/mocks/entity/mockFileView.js.map +1 -1
  1279. package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
  1280. package/dist/mocks/entity/mockProject.js.map +1 -1
  1281. package/dist/mocks/entity/mockProjectView.js.map +1 -1
  1282. package/dist/mocks/entity/mockReleaseCardsTable.js.map +1 -1
  1283. package/dist/mocks/entity/mockRootEntity.js.map +1 -1
  1284. package/dist/mocks/entity/mockTableEntity.js.map +1 -1
  1285. package/dist/mocks/faker/fakerUtils.js.map +1 -1
  1286. package/dist/mocks/faker/generateDiscussion.js.map +1 -1
  1287. package/dist/mocks/faker/generateEvaluation.js.map +1 -1
  1288. package/dist/mocks/faker/generateFakeEntity.js.map +1 -1
  1289. package/dist/mocks/faker/generateSubscription.js.map +1 -1
  1290. package/dist/mocks/mockAnnotationColumns.js.map +1 -1
  1291. package/dist/mocks/mockCertificationQuiz.js.map +1 -1
  1292. package/dist/mocks/mockDataCatalogQuery.js.map +1 -1
  1293. package/dist/mocks/mockFileViewQuery.js.map +1 -1
  1294. package/dist/mocks/mockOAuthClientAcls.js.map +1 -1
  1295. package/dist/mocks/mockQueryResponseData.js.map +1 -1
  1296. package/dist/mocks/mockQueryResponseDataWithManyEnumFacets.js.map +1 -1
  1297. package/dist/mocks/mockSchema.js.map +1 -1
  1298. package/dist/mocks/mockSearchQueryData.js.map +1 -1
  1299. package/dist/mocks/mockShortIo.js.map +1 -1
  1300. package/dist/mocks/mockSourceAppConfigQuery.js.map +1 -1
  1301. package/dist/mocks/mockSubscription.js.map +1 -1
  1302. package/dist/mocks/mockWiki.js.map +1 -1
  1303. package/dist/mocks/mockWikiPageKey.js.map +1 -1
  1304. package/dist/mocks/mock_drug_tool_data.js.map +1 -1
  1305. package/dist/mocks/mock_file_handle.js.map +1 -1
  1306. package/dist/mocks/mock_file_statistics.js.map +1 -1
  1307. package/dist/mocks/mock_has_access_data.js.map +1 -1
  1308. package/dist/mocks/mock_upload_destination.js.map +1 -1
  1309. package/dist/mocks/msw/handlers/accessRequirementAclHandlers.js.map +1 -1
  1310. package/dist/mocks/msw/handlers/accessRequirementHandlers.js.map +1 -1
  1311. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  1312. package/dist/mocks/msw/handlers/authHandlers.js.map +1 -1
  1313. package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
  1314. package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
  1315. package/dist/mocks/msw/handlers/chatHandlers.js.map +1 -1
  1316. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
  1317. package/dist/mocks/msw/handlers/dataciteHandlers.js.map +1 -1
  1318. package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
  1319. package/dist/mocks/msw/handlers/doiHandlers.js.map +1 -1
  1320. package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
  1321. package/dist/mocks/msw/handlers/evaluationHandlers.js.map +1 -1
  1322. package/dist/mocks/msw/handlers/featureFlagHandlers.js.map +1 -1
  1323. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  1324. package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
  1325. package/dist/mocks/msw/handlers/messageHandlers.js.map +1 -1
  1326. package/dist/mocks/msw/handlers/oauthClientAclHandlers.js.map +1 -1
  1327. package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
  1328. package/dist/mocks/msw/handlers/projectStorageHandlers.js.map +1 -1
  1329. package/dist/mocks/msw/handlers/realmHandlers.js.map +1 -1
  1330. package/dist/mocks/msw/handlers/researchProjectHandlers.js.map +1 -1
  1331. package/dist/mocks/msw/handlers/resetTwoFactorAuthHandlers.js.map +1 -1
  1332. package/dist/mocks/msw/handlers/schemaHandlers.js.map +1 -1
  1333. package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -1
  1334. package/dist/mocks/msw/handlers/shortIoHandlers.js.map +1 -1
  1335. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  1336. package/dist/mocks/msw/handlers/tableQueryHandlers.js.map +1 -1
  1337. package/dist/mocks/msw/handlers/tableQueryService.js.map +1 -1
  1338. package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
  1339. package/dist/mocks/msw/handlers/termsOfServiceHandlers.js.map +1 -1
  1340. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  1341. package/dist/mocks/msw/handlers/webhookHandlers.js.map +1 -1
  1342. package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
  1343. package/dist/mocks/msw/handlers.js.map +1 -1
  1344. package/dist/mocks/msw/server.d.ts +1 -1
  1345. package/dist/mocks/msw/server.d.ts.map +1 -1
  1346. package/dist/mocks/msw/server.js.map +1 -1
  1347. package/dist/mocks/msw/util/BasicMockedCrudService.js.map +1 -1
  1348. package/dist/mocks/oauth/MockClient.js.map +1 -1
  1349. package/dist/mocks/personalAccessToken/mockPersonalAccessToken.js.map +1 -1
  1350. package/dist/mocks/projectStorage/mockProjectStorageLimits.js.map +1 -1
  1351. package/dist/mocks/provenance/mockActivity.js.map +1 -1
  1352. package/dist/mocks/query/defaultFileViewColumnModels.js.map +1 -1
  1353. package/dist/mocks/query/mockFeaturedDataTabsQueryData.js.map +1 -1
  1354. package/dist/mocks/query/mockHomepageQueryResultData.js.map +1 -1
  1355. package/dist/mocks/query/mockProjectViewQueryResults.js.map +1 -1
  1356. package/dist/mocks/query/mockRejectionReasonsTableQueryResultBundle.js.map +1 -1
  1357. package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
  1358. package/dist/mocks/query/mockUserCardTableQueryResultBundle.js.map +1 -1
  1359. package/dist/mocks/query/mock_query_data.js.map +1 -1
  1360. package/dist/mocks/query/syn16787123.js.map +1 -1
  1361. package/dist/mocks/query/syn17328596.js.map +1 -1
  1362. package/dist/mocks/query/syn51735464.js.map +1 -1
  1363. package/dist/mocks/query/syn51735464GroupBySpecies.js.map +1 -1
  1364. package/dist/mocks/realm/mockRealmPrincipal.js.map +1 -1
  1365. package/dist/mocks/team/mockTeam.js.map +1 -1
  1366. package/dist/mocks/termsOfService/mockTermsOfService.js.map +1 -1
  1367. package/dist/mocks/user/mock_user_profile.js.map +1 -1
  1368. package/dist/mocks/usergroup/mockUserGroup.js.map +1 -1
  1369. package/dist/ror-client/index.js.map +1 -1
  1370. package/dist/stories/ColorPaletteInspector.js.map +1 -1
  1371. package/dist/stories/ToastDemo.js.map +1 -1
  1372. package/dist/stories/stubs/Alert/MuiAlert.js.map +1 -1
  1373. package/dist/stories/stubs/Button/MuiButton.js.map +1 -1
  1374. package/dist/stories/stubs/Dialog/MuiDialog.js.map +1 -1
  1375. package/dist/stories/stubs/TextField/MuiTextField.js.map +1 -1
  1376. package/dist/stories/stubs/Tooltip/MuiTooltip.js.map +1 -1
  1377. package/dist/synapse-client/HttpClient.js.map +1 -1
  1378. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  1379. package/dist/synapse-client/SynapseClient.js +61 -69
  1380. package/dist/synapse-client/SynapseClient.js.map +1 -1
  1381. package/dist/synapse-client/SynapseClientUtils.js.map +1 -1
  1382. package/dist/synapse-queries/InfiniteQueryUtils.js.map +1 -1
  1383. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  1384. package/dist/synapse-queries/QueryFilterUtils.js.map +1 -1
  1385. package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
  1386. package/dist/synapse-queries/asynchronous/usePollAsynchronousJob.js.map +1 -1
  1387. package/dist/synapse-queries/auth/useChangePassword.js.map +1 -1
  1388. package/dist/synapse-queries/auth/useOIDC.js.map +1 -1
  1389. package/dist/synapse-queries/auth/useResetPassword.js.map +1 -1
  1390. package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
  1391. package/dist/synapse-queries/challenge/useChallenge.js.map +1 -1
  1392. package/dist/synapse-queries/chat/useChat.js.map +1 -1
  1393. package/dist/synapse-queries/croissant/useGetCroissantUrl.js.map +1 -1
  1394. package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -0
  1395. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  1396. package/dist/synapse-queries/curation/task/useCurationTask.js +12 -2
  1397. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  1398. package/dist/synapse-queries/dataaccess/useAccessApprovals.js.map +1 -1
  1399. package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
  1400. package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js.map +1 -1
  1401. package/dist/synapse-queries/dataaccess/useGetApprovedSubmissionInfo.js.map +1 -1
  1402. package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
  1403. package/dist/synapse-queries/docker/useGetDockerTag.js.map +1 -1
  1404. package/dist/synapse-queries/doi/useDOI.js.map +1 -1
  1405. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  1406. package/dist/synapse-queries/entity/useActionsRequiredForTableQuery.js.map +1 -1
  1407. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  1408. package/dist/synapse-queries/entity/useEntityBoundSchema.js.map +1 -1
  1409. package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
  1410. package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
  1411. package/dist/synapse-queries/entity/useExportToADWorkbench.js.map +1 -1
  1412. package/dist/synapse-queries/entity/useExportToCavatica.js.map +1 -1
  1413. package/dist/synapse-queries/entity/useExportToPluto.js.map +1 -1
  1414. package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
  1415. package/dist/synapse-queries/entity/useGetEntityActionsRequired.js.map +1 -1
  1416. package/dist/synapse-queries/entity/useGetEntityChallenge.js.map +1 -1
  1417. package/dist/synapse-queries/entity/useGetEntityChildren.js.map +1 -1
  1418. package/dist/synapse-queries/entity/useGetEntityForum.js.map +1 -1
  1419. package/dist/synapse-queries/entity/useGetEntityHeaders.js.map +1 -1
  1420. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  1421. package/dist/synapse-queries/entity/useProjectStorage.js.map +1 -1
  1422. package/dist/synapse-queries/entity/useSchema.js.map +1 -1
  1423. package/dist/synapse-queries/evaluation/useEvaluation.js.map +1 -1
  1424. package/dist/synapse-queries/featureflags/useGetFeatureFlag.js.map +1 -1
  1425. package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
  1426. package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
  1427. package/dist/synapse-queries/file/useFileHandle.js.map +1 -1
  1428. package/dist/synapse-queries/file/useFiles.js.map +1 -1
  1429. package/dist/synapse-queries/file/useSynapseMultipartUpload.js.map +1 -1
  1430. package/dist/synapse-queries/file/useUploadDestination.js.map +1 -1
  1431. package/dist/synapse-queries/forum/useForum.js.map +1 -1
  1432. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  1433. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  1434. package/dist/synapse-queries/github/useGithub.js.map +1 -1
  1435. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  1436. package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
  1437. package/dist/synapse-queries/grid/useGridPresignedUrl.js.map +1 -1
  1438. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  1439. package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
  1440. package/dist/synapse-queries/message/useMessage.js.map +1 -1
  1441. package/dist/synapse-queries/oauth/useOAuthClient.js.map +1 -1
  1442. package/dist/synapse-queries/portal/useListPortals.js.map +1 -1
  1443. package/dist/synapse-queries/portal/usePortal.js.map +1 -1
  1444. package/dist/synapse-queries/provenance/useGetActivityForEntity.js.map +1 -1
  1445. package/dist/synapse-queries/realm/useRealmPrincipals.js.map +1 -1
  1446. package/dist/synapse-queries/ror/index.js.map +1 -1
  1447. package/dist/synapse-queries/search/useSearch.js.map +1 -1
  1448. package/dist/synapse-queries/search/useSuggestion.js.map +1 -1
  1449. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  1450. package/dist/synapse-queries/table/useColumnModel.js.map +1 -1
  1451. package/dist/synapse-queries/table/useDefiningSql.js.map +1 -1
  1452. package/dist/synapse-queries/table/useDownloadTable.js.map +1 -1
  1453. package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
  1454. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  1455. package/dist/synapse-queries/team/useTeam.js.map +1 -1
  1456. package/dist/synapse-queries/team/useTeamList.js.map +1 -1
  1457. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  1458. package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
  1459. package/dist/synapse-queries/trash/useTrashCan.js.map +1 -1
  1460. package/dist/synapse-queries/user/useCertificationQuiz.js.map +1 -1
  1461. package/dist/synapse-queries/user/useFavorites.js.map +1 -1
  1462. package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
  1463. package/dist/synapse-queries/user/useGetUserProjects.js.map +1 -1
  1464. package/dist/synapse-queries/user/useGetUserTeams.js.map +1 -1
  1465. package/dist/synapse-queries/user/usePersonalAccessToken.js.map +1 -1
  1466. package/dist/synapse-queries/user/useProjects.js.map +1 -1
  1467. package/dist/synapse-queries/user/useRevokeCertification.js.map +1 -1
  1468. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  1469. package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
  1470. package/dist/synapse-queries/verificationSubmission/useVerificationSubmission.js.map +1 -1
  1471. package/dist/synapse-queries/webhook/useWebhook.js.map +1 -1
  1472. package/dist/synapse-queries/wiki/useWiki.js.map +1 -1
  1473. package/dist/testutils/ComponentToBePassedPropsCustomMatcher.js.map +1 -1
  1474. package/dist/testutils/IsEditingStoreTestUtils.js +17 -0
  1475. package/dist/testutils/IsEditingStoreTestUtils.js.map +1 -0
  1476. package/dist/testutils/LocationTracker.js.map +1 -1
  1477. package/dist/testutils/MarkdownSynapseUtils.js.map +1 -1
  1478. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  1479. package/dist/testutils/TestingLibraryUtils.js +18 -16
  1480. package/dist/testutils/TestingLibraryUtils.js.map +1 -1
  1481. package/dist/testutils/muiDatePickerMock.js.map +1 -1
  1482. package/dist/testutils/vitest.setup.js.map +1 -1
  1483. package/dist/theme/DefaultTheme.js.map +1 -1
  1484. package/dist/theme/ThemeProvider.js.map +1 -1
  1485. package/dist/theme/mergeTheme.js.map +1 -1
  1486. package/dist/theme/palette/Palettes.js.map +1 -1
  1487. package/dist/theme/spreadSx.js.map +1 -1
  1488. package/dist/theme/typography/Link.js.map +1 -1
  1489. package/dist/theme/typography/Typography.js.map +1 -1
  1490. package/dist/tsconfig.build.tsbuildinfo +1 -1
  1491. package/dist/utils/APIConstants.js.map +1 -1
  1492. package/dist/utils/AppUtils/AppUtils.d.ts.map +1 -1
  1493. package/dist/utils/AppUtils/AppUtils.js +11 -11
  1494. package/dist/utils/AppUtils/AppUtils.js.map +1 -1
  1495. package/dist/utils/AppUtils/session/ApplicationSessionContext.js.map +1 -1
  1496. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  1497. package/dist/utils/AppUtils/session/AuthenticationGuard.js.map +1 -1
  1498. package/dist/utils/AppUtils/session/SessionInitializedGuard.js.map +1 -1
  1499. package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
  1500. package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
  1501. package/dist/utils/ContentTypeUtils.js.map +1 -1
  1502. package/dist/utils/OrientationBannerConstants.js.map +1 -1
  1503. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  1504. package/dist/utils/SynapseConstants.js.map +1 -1
  1505. package/dist/utils/analytics/sendAnalyticsEvent.js.map +1 -1
  1506. package/dist/utils/analytics/sendSearchEvent.js.map +1 -1
  1507. package/dist/utils/analytics/useGoogleAnalytics.js.map +1 -1
  1508. package/dist/utils/appendFinalQueryParamKey.js.map +1 -1
  1509. package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
  1510. package/dist/utils/context/AridhiaContext.js.map +1 -1
  1511. package/dist/utils/context/DocumentMetadataContext.js.map +1 -1
  1512. package/dist/utils/context/FullContextProvider.js.map +1 -1
  1513. package/dist/utils/context/GlobalIsEditingContext.js.map +1 -1
  1514. package/dist/utils/context/SynapseContext.js.map +1 -1
  1515. package/dist/utils/featureflag/FeatureFlags.d.ts +2 -1
  1516. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  1517. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  1518. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  1519. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  1520. package/dist/utils/functions/ArrayUtils.js.map +1 -1
  1521. package/dist/utils/functions/DateFormatter.js.map +1 -1
  1522. package/dist/utils/functions/DateTimeUtils.js.map +1 -1
  1523. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  1524. package/dist/utils/functions/FileHandleUtils.js.map +1 -1
  1525. package/dist/utils/functions/GridApiUtils.js.map +1 -1
  1526. package/dist/utils/functions/IsEqualTreatUndefinedAsMissing.js.map +1 -1
  1527. package/dist/utils/functions/IsExternalLink.js.map +1 -1
  1528. package/dist/utils/functions/ObjectUtils.js.map +1 -1
  1529. package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
  1530. package/dist/utils/functions/RealmUtils.js.map +1 -1
  1531. package/dist/utils/functions/RegularExpressions.js.map +1 -1
  1532. package/dist/utils/functions/ResolveLinkEntity.js.map +1 -1
  1533. package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
  1534. package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
  1535. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  1536. package/dist/utils/functions/StringUtils.js.map +1 -1
  1537. package/dist/utils/functions/TableColumnSchemaUtils.js.map +1 -1
  1538. package/dist/utils/functions/calculateFriendlyFileSize.js.map +1 -1
  1539. package/dist/utils/functions/colorPalette.js.map +1 -1
  1540. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  1541. package/dist/utils/functions/dispatchDownloadListChangeEvent.js.map +1 -1
  1542. package/dist/utils/functions/generateCsrfToken.js.map +1 -1
  1543. package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
  1544. package/dist/utils/functions/getEndpoint.js +3 -3
  1545. package/dist/utils/functions/getEndpoint.js.map +1 -1
  1546. package/dist/utils/functions/getPrincipalDisplayName.js.map +1 -1
  1547. package/dist/utils/functions/getSynapseEntityUrl.js.map +1 -1
  1548. package/dist/utils/functions/getSynapseWebClientLink.js.map +1 -1
  1549. package/dist/utils/functions/getUserData.js.map +1 -1
  1550. package/dist/utils/functions/queryUtils.js.map +1 -1
  1551. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  1552. package/dist/utils/functions/unCamelCase.js.map +1 -1
  1553. package/dist/utils/hooks/useConfirmItems.js.map +1 -1
  1554. package/dist/utils/hooks/useCookiePreferences.d.ts.map +1 -1
  1555. package/dist/utils/hooks/useCookiePreferences.js +24 -23
  1556. package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
  1557. package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
  1558. package/dist/utils/hooks/useDebouncedEffect.js.map +1 -1
  1559. package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
  1560. package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
  1561. package/dist/utils/hooks/useGetEntityMetadata.js.map +1 -1
  1562. package/dist/utils/hooks/useGetGoalData.js +2 -4
  1563. package/dist/utils/hooks/useGetGoalData.js.map +1 -1
  1564. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  1565. package/dist/utils/hooks/useGetIsAllSelectedInfiniteList.js.map +1 -1
  1566. package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
  1567. package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js.map +1 -1
  1568. package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
  1569. package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
  1570. package/dist/utils/hooks/useIsBot.js.map +1 -1
  1571. package/dist/utils/hooks/useJsonLdScriptElement.js.map +1 -1
  1572. package/dist/utils/hooks/useListState.js.map +1 -1
  1573. package/dist/utils/hooks/useLogin.js.map +1 -1
  1574. package/dist/utils/hooks/useMediaPrintOnly.js.map +1 -1
  1575. package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
  1576. package/dist/utils/hooks/useNativeSearchParams.js.map +1 -1
  1577. package/dist/utils/hooks/useOneSageURL.js.map +1 -1
  1578. package/dist/utils/hooks/useOverlay.js.map +1 -1
  1579. package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
  1580. package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
  1581. package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
  1582. package/dist/utils/hooks/useSet.js.map +1 -1
  1583. package/dist/utils/hooks/useShowDesktop.js.map +1 -1
  1584. package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
  1585. package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
  1586. package/dist/utils/hooks/useTraceUpdate.js.map +1 -1
  1587. package/dist/utils/hooks/useTrackTransientListItems.js.map +1 -1
  1588. package/dist/utils/hooks/useUploadFileEntity/getActiveUploadCount.js.map +1 -1
  1589. package/dist/utils/hooks/useUploadFileEntity/getFileEntityIdWithSameName.js.map +1 -1
  1590. package/dist/utils/hooks/useUploadFileEntity/useCreateFolderPath.js.map +1 -1
  1591. package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
  1592. package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
  1593. package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
  1594. package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
  1595. package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
  1596. package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
  1597. package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
  1598. package/dist/utils/html/TargetEnum.js.map +1 -1
  1599. package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
  1600. package/dist/utils/jsonschema/getEnumeratedValues.js.map +1 -1
  1601. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js.map +1 -1
  1602. package/dist/utils/jsonschema/getRequiredAttributes.js.map +1 -1
  1603. package/dist/utils/jsonschema/getSchemaForProperty.js.map +1 -1
  1604. package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
  1605. package/dist/utils/jsonschema/getType.js.map +1 -1
  1606. package/dist/utils/searchDefaults.js.map +1 -1
  1607. package/dist/utils/slots/SlotUtils.js.map +1 -1
  1608. package/dist/utils/types/IsType.js.map +1 -1
  1609. package/package.json +67 -66
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaDrivenAnnotationEditor.js","names":[],"sources":["../../../src/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport {\n useGetJson,\n useGetSchema,\n useGetSchemaBinding,\n useUpdateViaJson,\n} from '@/synapse-queries'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { Alert, Box, Divider, Link, Typography } from '@mui/material'\nimport RJSF from '@rjsf/core'\nimport { RJSFValidationError } from '@rjsf/utils'\nimport validator from '@rjsf/validator-ajv8'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { EntityJson } from '@sage-bionetworks/synapse-types'\nimport { JSONSchema7 } from 'json-schema'\nimport { omitBy } from 'lodash-es'\nimport isEmpty from 'lodash-es/isEmpty'\nimport noop from 'lodash-es/noop'\nimport { RefObject, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ConfirmationButtons,\n ConfirmationDialog,\n} from '../ConfirmationDialog/ConfirmationDialog'\nimport { JsonSchemaForm } from '../JsonSchemaForm/JsonSchemaForm'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport {\n dropNullishArrayValues,\n dropNullValues,\n getPossibleTopLevelPropertiesInObjectSchema,\n getFriendlyPropertyName,\n getJsonSchemaForForm,\n getSchemaIdForConcreteType,\n transformErrors,\n getUiSchemaForForm,\n shouldLiveValidate,\n customTranslateString,\n} from './AnnotationEditorUtils'\nimport SynapseAnnotationsRJSFObjectField from './field/SynapseAnnotationsRJSFObjectField'\nimport { ObjectFieldTemplate } from './template/ObjectFieldTemplate'\nimport SynapseAnnotationsWrapIfAdditionalTemplate from './template/SynapseAnnotationsWrapIfAdditionalTemplate'\nimport TextWidget from './widget/TextWidget'\n\nexport type SchemaDrivenAnnotationEditorProps = {\n /** The entity whose annotations should be edited with the form */\n entityId?: string\n /** If no entity ID is supplied, the schema to use for the form */\n schemaId?: string\n /** May be used to directly provide a JSON Schema to use for the form */\n validationSchema?: JSONSchema7\n /** Optionally supply a ref to the form to handle submission externally with `formRef.current.submit()`. */\n formRef?: RefObject<RJSF | null>\n /** Provide live input validation. This can cause performance degradation. By default, liveValidate will be true if an entity with a schema and existing annotations is being edited */\n liveValidate?: boolean\n /** Invoked after a successful form submission */\n onSuccess?: () => void\n /** If defined and formRef is not supplied, shows a 'Cancel' button and runs this effect on click */\n onCancel?: () => void\n /** Passes new form data upon each change to the form */\n onChange?: (annotations: Record<string, unknown>) => void\n /** If true, the editor will not render its own submit UI. */\n hideActions?: boolean\n}\n\n/**\n * Cleans the formData to remove values that are invalid for Synapse Annotations\n * @param formData\n * @param dropNullishValuesInArrays\n */\nfunction cleanFormData(\n formData: Record<string, unknown> | undefined,\n dropNullishValuesInArrays: boolean,\n) {\n let cleanedFormData = dropNullValues(formData)\n if (dropNullishValuesInArrays) {\n cleanedFormData = dropNullishArrayValues(cleanedFormData)\n }\n return cleanedFormData\n}\n\n/**\n * Renders a form for editing an entity's annotations. The component also supports supplying just a schema ID,\n * but work to support annotation flows without an entity (i.e. before creating entities) is not yet complete.\n */\nexport function SchemaDrivenAnnotationEditor(\n props: SchemaDrivenAnnotationEditorProps,\n) {\n const {\n entityId,\n schemaId,\n validationSchema: validationSchemaFromProps,\n liveValidate: liveValidateFromProps,\n onSuccess = () => {\n /* no-op */\n },\n onCancel,\n formRef: formRefFromParent,\n onChange = noop,\n hideActions = false,\n } = props\n const localRef = useRef<RJSF>(null)\n const ref = formRefFromParent ?? localRef\n\n // Client-side validation errors\n const [validationError, setValidationError] = useState<\n RJSFValidationError[] | undefined\n >(undefined)\n\n // Errors from the backend response\n const [submissionError, setSubmissionError] = useState<\n SynapseClientError | undefined\n >(undefined)\n const [showSubmissionError, setShowSubmissionError] = useState(false)\n\n const [showConfirmation, setShowConfirmation] = useState(false)\n\n const { data } = useGetJson(\n entityId!,\n undefined,\n // Derived annotations will be precomputed and displayed as placeholders in the form\n false,\n {\n // Metadata is being edited, so don't refetch\n staleTime: Infinity,\n enabled: !!entityId,\n throwOnError: true,\n },\n )\n\n const entityJson = data?.entityMetadata\n const annotations = data?.annotations\n\n // Annotation fields fetched and modified via the form\n const [formData, setFormData] = useState<Record<string, unknown> | undefined>(\n undefined,\n )\n\n // Set initial form data when the entity or its annotations change\n useEffect(() => {\n if (data?.entity) {\n const formData = data.entity\n const hasAnnotations = annotations && Object.keys(annotations).length > 0\n\n const newFormData = !hasAnnotations\n ? { ...formData, newKey: [''] }\n : formData\n\n setFormData(newFormData)\n }\n }, [data?.entity, annotations])\n\n const { data: schema, isLoading: isLoadingBinding } = useGetSchemaBinding(\n entityId!,\n {\n enabled: !!entityId,\n refetchOnWindowFocus: false,\n throwOnError: true,\n },\n )\n\n // The full schema which is bound to the entity\n const { data: fetchedValidationSchema, isLoading: isLoadingSchema } =\n useGetSchema(schemaId ?? schema?.jsonSchemaVersionInfo.$id ?? '', {\n enabled: !!schemaId || !!schema,\n throwOnError: true,\n })\n const validationSchema = validationSchemaFromProps || fetchedValidationSchema\n\n const concreteTypeSchemaId = getSchemaIdForConcreteType(\n entityJson?.concreteType ?? '',\n )\n // The schema for the entity type (e.g. FileEntity, TableEntity, etc.)\n const { data: schemaForEntityType, isLoading: isLoadingEntityTypeSchema } =\n useGetSchema(concreteTypeSchemaId ?? '', {\n enabled: !!concreteTypeSchemaId,\n throwOnError: true,\n })\n\n const entitySchemaBaseProperties: JSONSchema7['properties'] = useMemo(\n () =>\n getPossibleTopLevelPropertiesInObjectSchema(schemaForEntityType ?? {}),\n [schemaForEntityType],\n )\n\n const formSchema = useMemo(\n () => getJsonSchemaForForm(validationSchema, schemaForEntityType),\n [validationSchema, schemaForEntityType],\n )\n\n const uiSchema = useMemo(\n () => getUiSchemaForForm(entitySchemaBaseProperties),\n [entitySchemaBaseProperties],\n )\n\n const isLoading =\n isLoadingBinding || isLoadingSchema || isLoadingEntityTypeSchema\n\n const { mutate, isPending: updateIsPending } = useUpdateViaJson({\n onSuccess: () => {\n onSuccess()\n },\n onError: error => {\n setSubmissionError(error)\n setShowSubmissionError(true)\n },\n })\n\n function submitChangedEntity() {\n mutate({\n ...cleanFormData(formData, true),\n ...entityJson,\n } as EntityJson)\n }\n\n const liveValidate =\n liveValidateFromProps ?? shouldLiveValidate(annotations, validationSchema)\n\n const formDataHasNoAnnotations =\n entityJson &&\n isEmpty(\n omitBy(formData, (_value, key) =>\n Object.keys(entityJson).find(k => k === key),\n ),\n )\n\n const showHasNoAnnotationsAlert = schema === null && formDataHasNoAnnotations\n\n return (\n <div className=\"JsonSchemaFormContainer\">\n {isLoading ? (\n <div className=\"LoadingPlaceholder\">\n <SynapseSpinner size={30} />\n </div>\n ) : (\n <>\n {entityJson && schema && (\n <Alert severity=\"info\" sx={{ mb: 2 }}>\n <b>{entityJson.name}</b> requires scientific annotations specified\n by <b>{schema.jsonSchemaVersionInfo.$id}</b>\n {'. '}\n <b>\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n schema.jsonSchemaVersionInfo.$id\n }`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View required schema (JSON)\n </Link>\n </b>\n </Alert>\n )}\n {showHasNoAnnotationsAlert && (\n <Alert severity=\"info\">\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <Typography variant={'smallText1'}>\n <b>{entityJson.name}</b> has no annotations. Click the{' '}\n </Typography>\n <AddToList />\n <Typography variant={'smallText1'}>\n button to annotate.\n </Typography>\n </Box>\n </Alert>\n )}\n <JsonSchemaForm\n validator={validator}\n liveValidate={liveValidate}\n noHtml5Validate={true}\n formRef={ref}\n disabled={updateIsPending}\n translateString={customTranslateString}\n formContext={{\n showDerivedAnnotationPlaceholder: true,\n descriptionVariant: 'expand',\n descriptionFormat: 'table',\n allowFreeSoloEnum: true,\n }}\n experimental_defaultFormStateBehavior={{\n emptyObjectFields: 'skipDefaults',\n }}\n fields={{\n ObjectField: SynapseAnnotationsRJSFObjectField,\n }}\n templates={{\n ObjectFieldTemplate: ObjectFieldTemplate,\n WrapIfAdditionalTemplate:\n SynapseAnnotationsWrapIfAdditionalTemplate,\n }}\n widgets={{\n TextWidget: TextWidget,\n }}\n schema={formSchema}\n uiSchema={uiSchema}\n transformErrors={transformErrors}\n formData={formData}\n onChange={({ formData }) => {\n onChange(formData)\n setFormData(formData)\n setValidationError(undefined)\n }}\n onBlur={() => {\n setFormData(\n // Clean the formData onBlur to remove null values that we will need to strip before submission\n // This will ensure that the user gets accurate validation information since the data will match what the backend will receive\n cleanFormData(\n formData,\n // Don't remove null values in arrays--the fields will disappear, which the user probably does not want\n false,\n ),\n )\n }}\n onSubmit={({ formData, errors }, event) => {\n event.preventDefault()\n if (errors && errors.length > 0) {\n setValidationError(errors)\n }\n setShowSubmissionError(false)\n setFormData(formData)\n submitChangedEntity()\n }}\n onError={(errors: RJSFValidationError[]) => {\n // invoked when submit is clicked and there are client-side validation errors\n setValidationError(errors)\n if ((validationError || liveValidate) && entityId) {\n setShowConfirmation(true)\n }\n }}\n >\n {submissionError && showSubmissionError && (\n <Alert severity=\"error\" sx={{ my: 2 }}>\n Annotations could not be updated: {submissionError.reason}\n </Alert>\n )}\n {!hideActions && (\n <>\n <Divider sx={{ my: 2 }} />\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gridRowStart: 5,\n }}\n >\n <ConfirmationButtons\n hasCancelButton={onCancel !== undefined}\n onCancel={() => {\n if (onCancel) {\n onCancel()\n }\n }}\n onConfirm={() => {\n ref.current!.formElement.current.requestSubmit()\n }}\n confirmButtonProps={{\n children: entityId ? 'Save' : 'Validate',\n }}\n />\n </Box>\n </>\n )}\n </JsonSchemaForm>\n {showConfirmation && (\n <ConfirmationDialog\n open={true}\n onConfirm={() => {\n submitChangedEntity()\n setShowConfirmation(false)\n }}\n onCancel={() => {\n setShowConfirmation(false)\n }}\n title=\"Update Annotations\"\n content={\n <>\n <div>\n The following errors exist with the annotations you entered:\n </div>\n <div>\n <ul>\n {(validationError ?? []).map(\n (e: RJSFValidationError, index: number) => (\n <li key={index}>\n <b>{`${getFriendlyPropertyName(e)}: `}</b>{' '}\n {`${e.message}`}\n </li>\n ),\n )}\n </ul>\n </div>\n <div>\n Are you sure you want to save the invalid annotations?\n </div>\n </>\n }\n confirmButtonProps={{\n children: 'Save',\n }}\n />\n )}\n </>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SchemaDrivenAnnotationEditor.js","names":[],"sources":["../../../src/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport {\n useGetJson,\n useGetSchema,\n useGetSchemaBinding,\n useUpdateViaJson,\n} from '@/synapse-queries'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { Alert, Box, Divider, Link, Typography } from '@mui/material'\nimport RJSF from '@rjsf/core'\nimport { RJSFValidationError } from '@rjsf/utils'\nimport validator from '@rjsf/validator-ajv8'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { EntityJson } from '@sage-bionetworks/synapse-types'\nimport { JSONSchema7 } from 'json-schema'\nimport { omitBy } from 'lodash-es'\nimport isEmpty from 'lodash-es/isEmpty'\nimport noop from 'lodash-es/noop'\nimport { RefObject, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ConfirmationButtons,\n ConfirmationDialog,\n} from '../ConfirmationDialog/ConfirmationDialog'\nimport { JsonSchemaForm } from '../JsonSchemaForm/JsonSchemaForm'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport {\n dropNullishArrayValues,\n dropNullValues,\n getPossibleTopLevelPropertiesInObjectSchema,\n getFriendlyPropertyName,\n getJsonSchemaForForm,\n getSchemaIdForConcreteType,\n transformErrors,\n getUiSchemaForForm,\n shouldLiveValidate,\n customTranslateString,\n} from './AnnotationEditorUtils'\nimport SynapseAnnotationsRJSFObjectField from './field/SynapseAnnotationsRJSFObjectField'\nimport { ObjectFieldTemplate } from './template/ObjectFieldTemplate'\nimport SynapseAnnotationsWrapIfAdditionalTemplate from './template/SynapseAnnotationsWrapIfAdditionalTemplate'\nimport TextWidget from './widget/TextWidget'\n\nexport type SchemaDrivenAnnotationEditorProps = {\n /** The entity whose annotations should be edited with the form */\n entityId?: string\n /** If no entity ID is supplied, the schema to use for the form */\n schemaId?: string\n /** May be used to directly provide a JSON Schema to use for the form */\n validationSchema?: JSONSchema7\n /** Optionally supply a ref to the form to handle submission externally with `formRef.current.submit()`. */\n formRef?: RefObject<RJSF | null>\n /** Provide live input validation. This can cause performance degradation. By default, liveValidate will be true if an entity with a schema and existing annotations is being edited */\n liveValidate?: boolean\n /** Invoked after a successful form submission */\n onSuccess?: () => void\n /** If defined and formRef is not supplied, shows a 'Cancel' button and runs this effect on click */\n onCancel?: () => void\n /** Passes new form data upon each change to the form */\n onChange?: (annotations: Record<string, unknown>) => void\n /** If true, the editor will not render its own submit UI. */\n hideActions?: boolean\n}\n\n/**\n * Cleans the formData to remove values that are invalid for Synapse Annotations\n * @param formData\n * @param dropNullishValuesInArrays\n */\nfunction cleanFormData(\n formData: Record<string, unknown> | undefined,\n dropNullishValuesInArrays: boolean,\n) {\n let cleanedFormData = dropNullValues(formData)\n if (dropNullishValuesInArrays) {\n cleanedFormData = dropNullishArrayValues(cleanedFormData)\n }\n return cleanedFormData\n}\n\n/**\n * Renders a form for editing an entity's annotations. The component also supports supplying just a schema ID,\n * but work to support annotation flows without an entity (i.e. before creating entities) is not yet complete.\n */\nexport function SchemaDrivenAnnotationEditor(\n props: SchemaDrivenAnnotationEditorProps,\n) {\n const {\n entityId,\n schemaId,\n validationSchema: validationSchemaFromProps,\n liveValidate: liveValidateFromProps,\n onSuccess = () => {\n /* no-op */\n },\n onCancel,\n formRef: formRefFromParent,\n onChange = noop,\n hideActions = false,\n } = props\n const localRef = useRef<RJSF>(null)\n const ref = formRefFromParent ?? localRef\n\n // Client-side validation errors\n const [validationError, setValidationError] = useState<\n RJSFValidationError[] | undefined\n >(undefined)\n\n // Errors from the backend response\n const [submissionError, setSubmissionError] = useState<\n SynapseClientError | undefined\n >(undefined)\n const [showSubmissionError, setShowSubmissionError] = useState(false)\n\n const [showConfirmation, setShowConfirmation] = useState(false)\n\n const { data } = useGetJson(\n entityId!,\n undefined,\n // Derived annotations will be precomputed and displayed as placeholders in the form\n false,\n {\n // Metadata is being edited, so don't refetch\n staleTime: Infinity,\n enabled: !!entityId,\n throwOnError: true,\n },\n )\n\n const entityJson = data?.entityMetadata\n const annotations = data?.annotations\n\n // Annotation fields fetched and modified via the form\n const [formData, setFormData] = useState<Record<string, unknown> | undefined>(\n undefined,\n )\n\n // Set initial form data when the entity or its annotations change\n useEffect(() => {\n if (data?.entity) {\n const formData = data.entity\n const hasAnnotations = annotations && Object.keys(annotations).length > 0\n\n const newFormData = !hasAnnotations\n ? { ...formData, newKey: [''] }\n : formData\n\n setFormData(newFormData)\n }\n }, [data?.entity, annotations])\n\n const { data: schema, isLoading: isLoadingBinding } = useGetSchemaBinding(\n entityId!,\n {\n enabled: !!entityId,\n refetchOnWindowFocus: false,\n throwOnError: true,\n },\n )\n\n // The full schema which is bound to the entity\n const { data: fetchedValidationSchema, isLoading: isLoadingSchema } =\n useGetSchema(schemaId ?? schema?.jsonSchemaVersionInfo.$id ?? '', {\n enabled: !!schemaId || !!schema,\n throwOnError: true,\n })\n const validationSchema = validationSchemaFromProps || fetchedValidationSchema\n\n const concreteTypeSchemaId = getSchemaIdForConcreteType(\n entityJson?.concreteType ?? '',\n )\n // The schema for the entity type (e.g. FileEntity, TableEntity, etc.)\n const { data: schemaForEntityType, isLoading: isLoadingEntityTypeSchema } =\n useGetSchema(concreteTypeSchemaId ?? '', {\n enabled: !!concreteTypeSchemaId,\n throwOnError: true,\n })\n\n const entitySchemaBaseProperties: JSONSchema7['properties'] = useMemo(\n () =>\n getPossibleTopLevelPropertiesInObjectSchema(schemaForEntityType ?? {}),\n [schemaForEntityType],\n )\n\n const formSchema = useMemo(\n () => getJsonSchemaForForm(validationSchema, schemaForEntityType),\n [validationSchema, schemaForEntityType],\n )\n\n const uiSchema = useMemo(\n () => getUiSchemaForForm(entitySchemaBaseProperties),\n [entitySchemaBaseProperties],\n )\n\n const isLoading =\n isLoadingBinding || isLoadingSchema || isLoadingEntityTypeSchema\n\n const { mutate, isPending: updateIsPending } = useUpdateViaJson({\n onSuccess: () => {\n onSuccess()\n },\n onError: error => {\n setSubmissionError(error)\n setShowSubmissionError(true)\n },\n })\n\n function submitChangedEntity() {\n mutate({\n ...cleanFormData(formData, true),\n ...entityJson,\n } as EntityJson)\n }\n\n const liveValidate =\n liveValidateFromProps ?? shouldLiveValidate(annotations, validationSchema)\n\n const formDataHasNoAnnotations =\n entityJson &&\n isEmpty(\n omitBy(formData, (_value, key) =>\n Object.keys(entityJson).find(k => k === key),\n ),\n )\n\n const showHasNoAnnotationsAlert = schema === null && formDataHasNoAnnotations\n\n return (\n <div className=\"JsonSchemaFormContainer\">\n {isLoading ? (\n <div className=\"LoadingPlaceholder\">\n <SynapseSpinner size={30} />\n </div>\n ) : (\n <>\n {entityJson && schema && (\n <Alert severity=\"info\" sx={{ mb: 2 }}>\n <b>{entityJson.name}</b> requires scientific annotations specified\n by <b>{schema.jsonSchemaVersionInfo.$id}</b>\n {'. '}\n <b>\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n schema.jsonSchemaVersionInfo.$id\n }`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View required schema (JSON)\n </Link>\n </b>\n </Alert>\n )}\n {showHasNoAnnotationsAlert && (\n <Alert severity=\"info\">\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <Typography variant={'smallText1'}>\n <b>{entityJson.name}</b> has no annotations. Click the{' '}\n </Typography>\n <AddToList />\n <Typography variant={'smallText1'}>\n button to annotate.\n </Typography>\n </Box>\n </Alert>\n )}\n <JsonSchemaForm\n validator={validator}\n liveValidate={liveValidate}\n noHtml5Validate={true}\n formRef={ref}\n disabled={updateIsPending}\n translateString={customTranslateString}\n formContext={{\n showDerivedAnnotationPlaceholder: true,\n descriptionVariant: 'expand',\n descriptionFormat: 'table',\n allowFreeSoloEnum: true,\n }}\n experimental_defaultFormStateBehavior={{\n emptyObjectFields: 'skipDefaults',\n }}\n fields={{\n ObjectField: SynapseAnnotationsRJSFObjectField,\n }}\n templates={{\n ObjectFieldTemplate: ObjectFieldTemplate,\n WrapIfAdditionalTemplate:\n SynapseAnnotationsWrapIfAdditionalTemplate,\n }}\n widgets={{\n TextWidget: TextWidget,\n }}\n schema={formSchema}\n uiSchema={uiSchema}\n transformErrors={transformErrors}\n formData={formData}\n onChange={({ formData }) => {\n onChange(formData)\n setFormData(formData)\n setValidationError(undefined)\n }}\n onBlur={() => {\n setFormData(\n // Clean the formData onBlur to remove null values that we will need to strip before submission\n // This will ensure that the user gets accurate validation information since the data will match what the backend will receive\n cleanFormData(\n formData,\n // Don't remove null values in arrays--the fields will disappear, which the user probably does not want\n false,\n ),\n )\n }}\n onSubmit={({ formData, errors }, event) => {\n event.preventDefault()\n if (errors && errors.length > 0) {\n setValidationError(errors)\n }\n setShowSubmissionError(false)\n setFormData(formData)\n submitChangedEntity()\n }}\n onError={(errors: RJSFValidationError[]) => {\n // invoked when submit is clicked and there are client-side validation errors\n setValidationError(errors)\n if ((validationError || liveValidate) && entityId) {\n setShowConfirmation(true)\n }\n }}\n >\n {submissionError && showSubmissionError && (\n <Alert severity=\"error\" sx={{ my: 2 }}>\n Annotations could not be updated: {submissionError.reason}\n </Alert>\n )}\n {!hideActions && (\n <>\n <Divider sx={{ my: 2 }} />\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gridRowStart: 5,\n }}\n >\n <ConfirmationButtons\n hasCancelButton={onCancel !== undefined}\n onCancel={() => {\n if (onCancel) {\n onCancel()\n }\n }}\n onConfirm={() => {\n ref.current!.formElement.current.requestSubmit()\n }}\n confirmButtonProps={{\n children: entityId ? 'Save' : 'Validate',\n }}\n />\n </Box>\n </>\n )}\n </JsonSchemaForm>\n {showConfirmation && (\n <ConfirmationDialog\n open={true}\n onConfirm={() => {\n submitChangedEntity()\n setShowConfirmation(false)\n }}\n onCancel={() => {\n setShowConfirmation(false)\n }}\n title=\"Update Annotations\"\n content={\n <>\n <div>\n The following errors exist with the annotations you entered:\n </div>\n <div>\n <ul>\n {(validationError ?? []).map(\n (e: RJSFValidationError, index: number) => (\n <li key={index}>\n <b>{`${getFriendlyPropertyName(e)}: `}</b>{' '}\n {`${e.message}`}\n </li>\n ),\n )}\n </ul>\n </div>\n <div>\n Are you sure you want to save the invalid annotations?\n </div>\n </>\n }\n confirmButtonProps={{\n children: 'Save',\n }}\n />\n )}\n </>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AdditionalPropertiesSchemaField.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.tsx"],"sourcesContent":["import {\n FieldProps,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { isEqual } from 'lodash-es'\nimport { useEffect, useState } from 'react'\nimport FullWidthAlert from '../../FullWidthAlert/FullWidthAlert'\nimport { convertToArray } from '../AnnotationEditorUtils'\nimport { GridLegacy as Grid, InputLabel } from '@mui/material'\nimport { AdditionalPropertyContextProvider } from '../template/AdditionalPropertyContext'\n\n// Matches ####-##-##T##:##:##.###Z, e.g. 1970-01-01T12:00:000Z\nconst ISO_TIMESTAMP_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z/\n\n// Types that correspond to the different input fields that the annotation editor supports\nconst propertyTypeArray = [\n 'String',\n 'Integer',\n 'Float',\n 'Boolean',\n 'Datetime',\n] as const\n\nexport type PropertyType = (typeof propertyTypeArray)[number]\n\nexport function guessPropertyType(list: Array<unknown>): PropertyType {\n if (list.length === 0) {\n // The field was just added, so default to string\n return 'String'\n } else if (\n list.every(\n item => typeof item === 'number' || item === 'NaN', // \"NaN\" is technically a float value\n )\n ) {\n if (list.every(item => Number.isInteger(item))) {\n return 'Integer'\n } else {\n return 'Float'\n }\n } else if (list.every(item => typeof item === 'boolean')) {\n return 'Boolean'\n } else if (\n list.every(item => typeof item === 'string') &&\n list.every((item: string) => !!ISO_TIMESTAMP_REGEX.exec(item))\n ) {\n return 'Datetime'\n }\n // otherwise, default type is 'string'\n return 'String'\n}\n\nexport function transformDataFromPropertyType(\n list: Array<any>,\n propertyType: PropertyType,\n) {\n switch (propertyType) {\n case 'Integer':\n return list.map(item =>\n Number.isNaN(Number(item)) ? 0 : Math.floor(Number(item)),\n )\n\n case 'Float':\n return list.map(item => {\n const asFloat = parseFloat(item as string)\n if (Number.isNaN(asFloat)) {\n return 'NaN'\n } else if (Number.isInteger(asFloat)) {\n return asFloat.toFixed(1)\n } else {\n return asFloat\n }\n })\n case 'Datetime':\n return list.map(item => {\n if (typeof item === 'string' && ISO_TIMESTAMP_REGEX.exec(item)) {\n return item\n } else {\n return new Date().toISOString()\n }\n })\n case 'Boolean':\n return list.map(item => !!item)\n case 'String':\n default:\n return list.map(item => String(item))\n }\n}\n\n/**\n * Maps a Synapse Annotation PropertyType to a JSON Schema that captures the type and format.\n * @param propertyType\n */\nexport function getSchemaForPropertyType(propertyType: PropertyType) {\n switch (propertyType) {\n case 'Datetime':\n return { type: 'string', format: 'datetime' }\n case 'Boolean':\n return { type: 'boolean' }\n case 'Float':\n return { type: 'number' }\n case 'Integer':\n return { type: 'integer' }\n case 'String':\n default:\n return { type: 'string' }\n }\n}\n\n/**\n * react-jsonschema-form SchemaField override for \"additionalProperties\" only. In Synapse these are \"custom annotations\".\n * Modifies the data to provide full compatibility with Synapse annotations features.\n *\n * This component provides these enhancements to the SchemaField:\n * - Supports selecting a type, and changing the input widget appropriately\n * - Identifying the type on mount\n * - Treat all field values as arrays\n * - When the last array value is removed, remove the entire key from the form.\n * @param props\n * @returns\n */\nexport function AdditionalPropertiesSchemaField<\n T extends Array<unknown> = Array<unknown>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(\n props: FieldProps<T, S, F> & {\n onDropPropertyClick: (key: string) => (event: any) => void\n },\n) {\n const {\n formData,\n onChange,\n registry,\n schema,\n name,\n onDropPropertyClick,\n idSchema,\n } = props\n const id = idSchema.$id\n const { ArrayField } = registry.fields\n const { SelectWidget } = registry.widgets\n\n // The type determines which widget we show.\n const [propertyType, setPropertyType] = useState(\n guessPropertyType(convertToArray(formData)),\n )\n\n // If the property type is updated, store it in a new variable where we'll show a warning if data may be lost on coersion\n const [nextPropertyType, setNextPropertyType] = useState(propertyType)\n\n /**\n * This effect is invoked whenever the user attempts to change the datatype of a custom annotation.\n */\n useEffect(() => {\n function onNextPropertyTypeUpdate() {\n if (Array.isArray(formData)) {\n const dataIsEmpty =\n formData.length === 0 ||\n formData.every(item => item == null || item == '')\n const coercedList = transformDataFromPropertyType(\n formData,\n nextPropertyType,\n )\n // if the data is empty or identical after conversion, then just update the property type\n if (dataIsEmpty || nextPropertyType !== propertyType) {\n if (isEqual(formData, coercedList)) {\n setPropertyType(nextPropertyType)\n }\n }\n }\n }\n\n onNextPropertyTypeUpdate()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nextPropertyType])\n\n /**\n * This effect is invoked whenever the propertyType changes.\n */\n useEffect(() => {\n function coerceDataAndUpdateWidget() {\n if (Array.isArray(formData)) {\n if (formData.every(item => item == null)) {\n onDropPropertyClick(name)(new CustomEvent('dropEmptyProperty'))\n } else {\n const coercedList = transformDataFromPropertyType(\n formData,\n nextPropertyType,\n ) as unknown as T\n\n // Data conversion is non-destructive or has been confirmed by the user\n setPropertyType(nextPropertyType)\n // Coerce the data to match the new type\n onChange(coercedList)\n }\n }\n }\n\n coerceDataAndUpdateWidget()\n // Don't add other properties to dependency array because we don't want to automatically coerce input\n // i.e. Only coerce data when the type changes, which should only be on mount or when the user explicitly chooses a new type.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [propertyType])\n\n const itemsSchema = getSchemaForPropertyType(propertyType)\n\n useEffect(() => {\n // If the additional property has not yet been coerced to an array, trigger an update to coerce and render nothing.\n // We must do this because RJSF does not currently batch these kinds of updates\n // See https://github.com/rjsf-team/react-jsonschema-form/issues/3367\n if (!Array.isArray(formData)) {\n onChange(convertToArray(formData) as unknown as T)\n }\n }, [formData, onChange])\n\n if (!Array.isArray(formData)) {\n return <></>\n }\n\n return (\n <AdditionalPropertyContextProvider\n value={{\n dropProperty: e => {\n onDropPropertyClick(name)(e)\n },\n }}\n >\n <Grid item xs={2}>\n <InputLabel htmlFor={`${id}-type`}>Type</InputLabel>\n <SelectWidget\n name={'Type'}\n id={`${id}-type`}\n schema={{} as S}\n options={{\n enumOptions: propertyTypeArray.map(type => ({\n label: type,\n value: type,\n })),\n }}\n value={propertyType}\n onChange={value => {\n setNextPropertyType(value as PropertyType)\n }}\n disabled={props.disabled}\n readOnly={props.readonly}\n required={true}\n isClearable={false}\n onBlur={() => {}}\n onFocus={() => {}}\n registry={registry}\n label={'Type'}\n />\n </Grid>\n <Grid item xs={7}>\n <ArrayField\n {...props}\n uiSchema={{\n ...props.uiSchema,\n 'ui:title': 'Value(s)',\n items: {\n ...props.uiSchema?.items,\n 'ui:placeholder': 'New Value',\n },\n }}\n schema={{\n ...schema,\n items: {\n ...itemsSchema,\n },\n }}\n />\n </Grid>\n {propertyType !== nextPropertyType && (\n <FullWidthAlert\n variant=\"warning\"\n title=\"Data may be lost when converting types\"\n description={`Are you sure you want to convert ${name} from ${propertyType} to ${nextPropertyType}? Current values may be lost on conversion.`}\n primaryButtonConfig={{\n text: 'Convert',\n onClick: () => {\n setPropertyType(nextPropertyType)\n },\n }}\n secondaryButtonConfig={{\n text: 'Cancel',\n onClick: () => {\n setNextPropertyType(propertyType)\n },\n }}\n isGlobal={false}\n />\n )}\n </AdditionalPropertyContextProvider>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdditionalPropertiesSchemaField.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.tsx"],"sourcesContent":["import {\n FieldProps,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { isEqual } from 'lodash-es'\nimport { useEffect, useState } from 'react'\nimport FullWidthAlert from '../../FullWidthAlert/FullWidthAlert'\nimport { convertToArray } from '../AnnotationEditorUtils'\nimport { GridLegacy as Grid, InputLabel } from '@mui/material'\nimport { AdditionalPropertyContextProvider } from '../template/AdditionalPropertyContext'\n\n// Matches ####-##-##T##:##:##.###Z, e.g. 1970-01-01T12:00:000Z\nconst ISO_TIMESTAMP_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z/\n\n// Types that correspond to the different input fields that the annotation editor supports\nconst propertyTypeArray = [\n 'String',\n 'Integer',\n 'Float',\n 'Boolean',\n 'Datetime',\n] as const\n\nexport type PropertyType = (typeof propertyTypeArray)[number]\n\nexport function guessPropertyType(list: Array<unknown>): PropertyType {\n if (list.length === 0) {\n // The field was just added, so default to string\n return 'String'\n } else if (\n list.every(\n item => typeof item === 'number' || item === 'NaN', // \"NaN\" is technically a float value\n )\n ) {\n if (list.every(item => Number.isInteger(item))) {\n return 'Integer'\n } else {\n return 'Float'\n }\n } else if (list.every(item => typeof item === 'boolean')) {\n return 'Boolean'\n } else if (\n list.every(item => typeof item === 'string') &&\n list.every((item: string) => !!ISO_TIMESTAMP_REGEX.exec(item))\n ) {\n return 'Datetime'\n }\n // otherwise, default type is 'string'\n return 'String'\n}\n\nexport function transformDataFromPropertyType(\n list: Array<any>,\n propertyType: PropertyType,\n) {\n switch (propertyType) {\n case 'Integer':\n return list.map(item =>\n Number.isNaN(Number(item)) ? 0 : Math.floor(Number(item)),\n )\n\n case 'Float':\n return list.map(item => {\n const asFloat = parseFloat(item as string)\n if (Number.isNaN(asFloat)) {\n return 'NaN'\n } else if (Number.isInteger(asFloat)) {\n return asFloat.toFixed(1)\n } else {\n return asFloat\n }\n })\n case 'Datetime':\n return list.map(item => {\n if (typeof item === 'string' && ISO_TIMESTAMP_REGEX.exec(item)) {\n return item\n } else {\n return new Date().toISOString()\n }\n })\n case 'Boolean':\n return list.map(item => !!item)\n case 'String':\n default:\n return list.map(item => String(item))\n }\n}\n\n/**\n * Maps a Synapse Annotation PropertyType to a JSON Schema that captures the type and format.\n * @param propertyType\n */\nexport function getSchemaForPropertyType(propertyType: PropertyType) {\n switch (propertyType) {\n case 'Datetime':\n return { type: 'string', format: 'datetime' }\n case 'Boolean':\n return { type: 'boolean' }\n case 'Float':\n return { type: 'number' }\n case 'Integer':\n return { type: 'integer' }\n case 'String':\n default:\n return { type: 'string' }\n }\n}\n\n/**\n * react-jsonschema-form SchemaField override for \"additionalProperties\" only. In Synapse these are \"custom annotations\".\n * Modifies the data to provide full compatibility with Synapse annotations features.\n *\n * This component provides these enhancements to the SchemaField:\n * - Supports selecting a type, and changing the input widget appropriately\n * - Identifying the type on mount\n * - Treat all field values as arrays\n * - When the last array value is removed, remove the entire key from the form.\n * @param props\n * @returns\n */\nexport function AdditionalPropertiesSchemaField<\n T extends Array<unknown> = Array<unknown>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(\n props: FieldProps<T, S, F> & {\n onDropPropertyClick: (key: string) => (event: any) => void\n },\n) {\n const {\n formData,\n onChange,\n registry,\n schema,\n name,\n onDropPropertyClick,\n idSchema,\n } = props\n const id = idSchema.$id\n const { ArrayField } = registry.fields\n const { SelectWidget } = registry.widgets\n\n // The type determines which widget we show.\n const [propertyType, setPropertyType] = useState(\n guessPropertyType(convertToArray(formData)),\n )\n\n // If the property type is updated, store it in a new variable where we'll show a warning if data may be lost on coersion\n const [nextPropertyType, setNextPropertyType] = useState(propertyType)\n\n /**\n * This effect is invoked whenever the user attempts to change the datatype of a custom annotation.\n */\n useEffect(() => {\n function onNextPropertyTypeUpdate() {\n if (Array.isArray(formData)) {\n const dataIsEmpty =\n formData.length === 0 ||\n formData.every(item => item == null || item == '')\n const coercedList = transformDataFromPropertyType(\n formData,\n nextPropertyType,\n )\n // if the data is empty or identical after conversion, then just update the property type\n if (dataIsEmpty || nextPropertyType !== propertyType) {\n if (isEqual(formData, coercedList)) {\n setPropertyType(nextPropertyType)\n }\n }\n }\n }\n\n onNextPropertyTypeUpdate()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nextPropertyType])\n\n /**\n * This effect is invoked whenever the propertyType changes.\n */\n useEffect(() => {\n function coerceDataAndUpdateWidget() {\n if (Array.isArray(formData)) {\n if (formData.every(item => item == null)) {\n onDropPropertyClick(name)(new CustomEvent('dropEmptyProperty'))\n } else {\n const coercedList = transformDataFromPropertyType(\n formData,\n nextPropertyType,\n ) as unknown as T\n\n // Data conversion is non-destructive or has been confirmed by the user\n setPropertyType(nextPropertyType)\n // Coerce the data to match the new type\n onChange(coercedList)\n }\n }\n }\n\n coerceDataAndUpdateWidget()\n // Don't add other properties to dependency array because we don't want to automatically coerce input\n // i.e. Only coerce data when the type changes, which should only be on mount or when the user explicitly chooses a new type.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [propertyType])\n\n const itemsSchema = getSchemaForPropertyType(propertyType)\n\n useEffect(() => {\n // If the additional property has not yet been coerced to an array, trigger an update to coerce and render nothing.\n // We must do this because RJSF does not currently batch these kinds of updates\n // See https://github.com/rjsf-team/react-jsonschema-form/issues/3367\n if (!Array.isArray(formData)) {\n onChange(convertToArray(formData) as unknown as T)\n }\n }, [formData, onChange])\n\n if (!Array.isArray(formData)) {\n return <></>\n }\n\n return (\n <AdditionalPropertyContextProvider\n value={{\n dropProperty: e => {\n onDropPropertyClick(name)(e)\n },\n }}\n >\n <Grid item xs={2}>\n <InputLabel htmlFor={`${id}-type`}>Type</InputLabel>\n <SelectWidget\n name={'Type'}\n id={`${id}-type`}\n schema={{} as S}\n options={{\n enumOptions: propertyTypeArray.map(type => ({\n label: type,\n value: type,\n })),\n }}\n value={propertyType}\n onChange={value => {\n setNextPropertyType(value as PropertyType)\n }}\n disabled={props.disabled}\n readOnly={props.readonly}\n required={true}\n isClearable={false}\n onBlur={() => {}}\n onFocus={() => {}}\n registry={registry}\n label={'Type'}\n />\n </Grid>\n <Grid item xs={7}>\n <ArrayField\n {...props}\n uiSchema={{\n ...props.uiSchema,\n 'ui:title': 'Value(s)',\n items: {\n ...props.uiSchema?.items,\n 'ui:placeholder': 'New Value',\n },\n }}\n schema={{\n ...schema,\n items: {\n ...itemsSchema,\n },\n }}\n />\n </Grid>\n {propertyType !== nextPropertyType && (\n <FullWidthAlert\n variant=\"warning\"\n title=\"Data may be lost when converting types\"\n description={`Are you sure you want to convert ${name} from ${propertyType} to ${nextPropertyType}? Current values may be lost on conversion.`}\n primaryButtonConfig={{\n text: 'Convert',\n onClick: () => {\n setPropertyType(nextPropertyType)\n },\n }}\n secondaryButtonConfig={{\n text: 'Cancel',\n onClick: () => {\n setNextPropertyType(propertyType)\n },\n }}\n isGlobal={false}\n />\n )}\n </AdditionalPropertyContextProvider>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseAnnotationsRJSFObjectField.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.tsx"],"sourcesContent":["import { getDefaultRegistry } from '@rjsf/core'\nimport {\n ADDITIONAL_PROPERTY_FLAG,\n deepEquals,\n FieldProps,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { useEffect } from 'react'\nimport {\n convertToArray,\n getPossibleTopLevelPropertiesInObjectSchema,\n} from '../AnnotationEditorUtils'\n\n/**\n * Extends the @rjsf/core `ObjectField` and just adds a custom hook for Synapse annotation business logic\n */\nexport function SynapseAnnotationsRJSFObjectField<\n T extends Record<string, any> | null | undefined = Record<string, any>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: FieldProps<T, S, F>) {\n const { schema, formData, onChange } = props\n const {\n fields: { ObjectField },\n } = getDefaultRegistry<T, S, F>()\n /**\n * For an object, this will\n * - convert additionalProperties formData to arrays\n * - convert schema-defined formData from an array to a non-array if the schema type is not an array\n * @param props\n */\n useEffect(() => {\n const newFormData: Record<string, any> = { ...formData }\n const allProperties = getPossibleTopLevelPropertiesInObjectSchema(schema)\n if (allProperties) {\n Object.entries(allProperties).forEach(([key, propertySchema]) => {\n // Since the annotations object is flat, we can safely use the property name as the key (no nested properties)\n const data = newFormData[key]\n if (\n (\n propertySchema as JSONSchema7Definition &\n Record<typeof ADDITIONAL_PROPERTY_FLAG, any>\n )[ADDITIONAL_PROPERTY_FLAG]\n ) {\n /**\n * All additional properties should be converted to arrays.\n *\n * We need to convert it right away because the order of items is not stable, and seems to depend on if the item is an array or not\n */\n if (!Array.isArray(data)) {\n newFormData[key] = convertToArray(data)\n }\n } else {\n /**\n * If the schema does not call for an array, but the formData is an array, then this will coerce it to a string.\n *\n * This can occur when a formData value is an additionalProperty, which we always treat as an array, then the key\n * is added to the schema (e.g. conditionally).\n */\n if (\n typeof propertySchema === 'object' &&\n 'type' in propertySchema &&\n propertySchema.type !== 'array' &&\n Array.isArray(data)\n ) {\n newFormData[key] = data.map(v => `${v}`).join(', ')\n }\n }\n })\n if (!deepEquals(formData, newFormData)) {\n onChange(newFormData as T)\n }\n }\n }, [schema, formData, onChange])\n\n return <ObjectField {...props} />\n}\n\nexport default SynapseAnnotationsRJSFObjectField\n"],"mappings":";;;;;;AAmBA,SAAgB,EAId,GAA4B;CAC5B,IAAM,EAAE,WAAQ,aAAU,gBAAa,GACjC,EACJ,QAAQ,EAAE,qBACR,GAA6B;AAmDjC,QA5CA,QAAgB;EACd,IAAM,IAAmC,EAAE,GAAG,GAAU,EAClD,IAAgB,EAA4C,EAAO;AACzE,EAAI,MACF,OAAO,QAAQ,EAAc,CAAC,SAAS,CAAC,GAAK,OAAoB;GAE/D,IAAM,IAAO,EAAY;AACzB,GAEI,EAEA,KAOG,MAAM,QAAQ,EAAK,KACtB,EAAY,KAAO,EAAe,EAAK,IAUvC,OAAO,KAAmB,YAC1B,UAAU,KACV,EAAe,SAAS,WACxB,MAAM,QAAQ,EAAK,KAEnB,EAAY,KAAO,EAAK,KAAI,MAAK,GAAG,IAAI,CAAC,KAAK,KAAK;IAGvD,EACG,EAAW,GAAU,EAAY,IACpC,EAAS,EAAiB;IAG7B;EAAC;EAAQ;EAAU;EAAS,CAAC,EAEzB,kBAAC,GAAD,EAAa,GAAI,GAAS,CAAA"}
1
+ {"version":3,"file":"SynapseAnnotationsRJSFObjectField.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.tsx"],"sourcesContent":["import { getDefaultRegistry } from '@rjsf/core'\nimport {\n ADDITIONAL_PROPERTY_FLAG,\n deepEquals,\n FieldProps,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { useEffect } from 'react'\nimport {\n convertToArray,\n getPossibleTopLevelPropertiesInObjectSchema,\n} from '../AnnotationEditorUtils'\n\n/**\n * Extends the @rjsf/core `ObjectField` and just adds a custom hook for Synapse annotation business logic\n */\nexport function SynapseAnnotationsRJSFObjectField<\n T extends Record<string, any> | null | undefined = Record<string, any>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: FieldProps<T, S, F>) {\n const { schema, formData, onChange } = props\n const {\n fields: { ObjectField },\n } = getDefaultRegistry<T, S, F>()\n /**\n * For an object, this will\n * - convert additionalProperties formData to arrays\n * - convert schema-defined formData from an array to a non-array if the schema type is not an array\n * @param props\n */\n useEffect(() => {\n const newFormData: Record<string, any> = { ...formData }\n const allProperties = getPossibleTopLevelPropertiesInObjectSchema(schema)\n if (allProperties) {\n Object.entries(allProperties).forEach(([key, propertySchema]) => {\n // Since the annotations object is flat, we can safely use the property name as the key (no nested properties)\n const data = newFormData[key]\n if (\n (\n propertySchema as JSONSchema7Definition &\n Record<typeof ADDITIONAL_PROPERTY_FLAG, any>\n )[ADDITIONAL_PROPERTY_FLAG]\n ) {\n /**\n * All additional properties should be converted to arrays.\n *\n * We need to convert it right away because the order of items is not stable, and seems to depend on if the item is an array or not\n */\n if (!Array.isArray(data)) {\n newFormData[key] = convertToArray(data)\n }\n } else {\n /**\n * If the schema does not call for an array, but the formData is an array, then this will coerce it to a string.\n *\n * This can occur when a formData value is an additionalProperty, which we always treat as an array, then the key\n * is added to the schema (e.g. conditionally).\n */\n if (\n typeof propertySchema === 'object' &&\n 'type' in propertySchema &&\n propertySchema.type !== 'array' &&\n Array.isArray(data)\n ) {\n newFormData[key] = data.map(v => `${v}`).join(', ')\n }\n }\n })\n if (!deepEquals(formData, newFormData)) {\n onChange(newFormData as T)\n }\n }\n }, [schema, formData, onChange])\n\n return <ObjectField {...props} />\n}\n\nexport default SynapseAnnotationsRJSFObjectField\n"],"mappings":";;;;;;AAmBA,SAAgB,EAId,GAA4B;CAC5B,IAAM,EAAE,WAAQ,aAAU,gBAAa,GACjC,EACJ,QAAQ,EAAE,qBACR,EAA4B;CAmDhC,OA5CA,QAAgB;EACd,IAAM,IAAmC,EAAE,GAAG,EAAS,GACjD,IAAgB,EAA4C,CAAM;EACxE,AAAI,MACF,OAAO,QAAQ,CAAa,EAAE,SAAS,CAAC,GAAK,OAAoB;GAE/D,IAAM,IAAO,EAAY;GACzB,AAEI,EAEA,KAOG,MAAM,QAAQ,CAAI,MACrB,EAAY,KAAO,EAAe,CAAI,KAUtC,OAAO,KAAmB,YAC1B,UAAU,KACV,EAAe,SAAS,WACxB,MAAM,QAAQ,CAAI,MAElB,EAAY,KAAO,EAAK,KAAI,MAAK,GAAG,GAAG,EAAE,KAAK,IAAI;EAGxD,CAAC,GACI,EAAW,GAAU,CAAW,KACnC,EAAS,CAAgB;CAG/B,GAAG;EAAC;EAAQ;EAAU;CAAQ,CAAC,GAExB,kBAAC,GAAD,EAAa,GAAI,EAAQ,CAAA;AAClC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AdditionalPropertyContext.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.tsx"],"sourcesContent":["import { createContext, PropsWithChildren, useContext } from 'react'\n\nexport type AdditionalPropertyContextType = {\n dropProperty: (event?: any) => void\n}\n\n/**\n * The `AdditionalPropertyContext` is a custom context object used to pass the `dropProperty` handler to the items within\n * a particular additional property.\n *\n * In RJSF, dropping an entire additional property is handled at the `object` level. In the Synapse Annotations UI,\n * we treat all additional properties (a.k.a. custom annotations) as arrays, and render the delete control at the `array`\n * level. RJSF does not normally provide the drop property handler at the `array` level, so we capture it and pass it\n * along using this context.\n */\nexport const AdditionalPropertyContext = createContext<\n AdditionalPropertyContextType | undefined\n>(undefined)\n\nexport type AdditionalPropertyContextProviderProps = PropsWithChildren<{\n value: AdditionalPropertyContextType\n}>\n\nexport function AdditionalPropertyContextProvider(\n props: AdditionalPropertyContextProviderProps,\n) {\n return (\n <AdditionalPropertyContext.Provider value={props.value}>\n {props.children}\n </AdditionalPropertyContext.Provider>\n )\n}\n\nexport const AdditionalPropertyContextConsumer =\n AdditionalPropertyContext.Consumer\n\nexport function useAdditionalPropertyContext():\n | AdditionalPropertyContextType\n | undefined {\n return useContext(AdditionalPropertyContext)\n}\n"],"mappings":";;;AAeA,IAAa,IAA4B,EAEvC,KAAA,EAAU;AAMZ,SAAgB,EACd,GACA;AACA,QACE,kBAAC,EAA0B,UAA3B;EAAoC,OAAO,EAAM;YAC9C,EAAM;EAC4B,CAAA;;AAIzC,IAAa,IACX,EAA0B;AAE5B,SAAgB,IAEF;AACZ,QAAO,EAAW,EAA0B"}
1
+ {"version":3,"file":"AdditionalPropertyContext.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.tsx"],"sourcesContent":["import { createContext, PropsWithChildren, useContext } from 'react'\n\nexport type AdditionalPropertyContextType = {\n dropProperty: (event?: any) => void\n}\n\n/**\n * The `AdditionalPropertyContext` is a custom context object used to pass the `dropProperty` handler to the items within\n * a particular additional property.\n *\n * In RJSF, dropping an entire additional property is handled at the `object` level. In the Synapse Annotations UI,\n * we treat all additional properties (a.k.a. custom annotations) as arrays, and render the delete control at the `array`\n * level. RJSF does not normally provide the drop property handler at the `array` level, so we capture it and pass it\n * along using this context.\n */\nexport const AdditionalPropertyContext = createContext<\n AdditionalPropertyContextType | undefined\n>(undefined)\n\nexport type AdditionalPropertyContextProviderProps = PropsWithChildren<{\n value: AdditionalPropertyContextType\n}>\n\nexport function AdditionalPropertyContextProvider(\n props: AdditionalPropertyContextProviderProps,\n) {\n return (\n <AdditionalPropertyContext.Provider value={props.value}>\n {props.children}\n </AdditionalPropertyContext.Provider>\n )\n}\n\nexport const AdditionalPropertyContextConsumer =\n AdditionalPropertyContext.Consumer\n\nexport function useAdditionalPropertyContext():\n | AdditionalPropertyContextType\n | undefined {\n return useContext(AdditionalPropertyContext)\n}\n"],"mappings":";;;AAeA,IAAa,IAA4B,EAEvC,KAAA,CAAS;AAMX,SAAgB,EACd,GACA;CACA,OACE,kBAAC,EAA0B,UAA3B;EAAoC,OAAO,EAAM;YAC9C,EAAM;CAC2B,CAAA;AAExC;AAEA,IAAa,IACX,EAA0B;AAE5B,SAAgB,IAEF;CACZ,OAAO,EAAW,CAAyB;AAC7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectFieldTemplate.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport { Button, Tooltip } from '@mui/material'\nimport {\n ADDITIONAL_PROPERTY_FLAG,\n canExpand,\n FormContextType,\n getTemplate,\n getUiOptions,\n ObjectFieldTemplatePropertyType,\n ObjectFieldTemplateProps,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { useRef } from 'react'\nimport { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect'\nimport { displayToast } from '../../ToastMessage'\n\n/**\n * Derived from the base ObjectFieldTemplate with annotations-editor-specific changes\n * - Custom button for adding additional properties\n * - Tracks properties to show a toast message if a property is converted to an additionalProperty because it was\n * dropped from the schema (e.g. in a conditional schema)\n *\n * See https://github.com/rjsf-team/react-jsonschema-form/blob/main/packages/mui/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx\n * @param props\n * @returns\n */\nexport function ObjectFieldTemplate<\n T extends Record<string, any> | null | undefined = Record<string, any>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: ObjectFieldTemplateProps<T, S, F>) {\n const {\n description,\n disabled,\n formData,\n idSchema,\n onAddClick,\n properties,\n readonly,\n registry,\n required,\n schema,\n title,\n uiSchema,\n } = props\n\n const options = getUiOptions<T, S, F>(uiSchema)\n const TitleFieldTemplate = getTemplate<'TitleFieldTemplate', T, S, F>(\n 'TitleFieldTemplate',\n registry,\n options,\n )\n const DescriptionFieldTemplate = getTemplate<\n 'DescriptionFieldTemplate',\n T,\n S,\n F\n >('DescriptionFieldTemplate', registry, options)\n\n /*\n Tracks the property keys that were last known to exist in the object.\n */\n const previousSchemaDefinedProperties = useRef<Set<string>>(new Set())\n\n /**\n * We track how the schema changes as the user enters data, causing conditional subschemas to be evaluated.\n *\n * If a property exists in the previous version of the schema and has user data, and then is dropped from the schema due to a data update, then\n * we need to prompt the user whether they want to undo the change, or continue and keep/remove those fields\n *\n * In this component, we can identify when one or more fields with user data are dropped (the field gains the additional property flag in the schema prop).\n * We then use a function provided by the context to report which fields were lost.\n */\n useDeepCompareEffectNoCheck(() => {\n if ('properties' in schema && schema.properties) {\n const propertyKeys = Object.keys(schema.properties)\n // Schema-defined properties are those properties in the schema without the additional property flag.\n const schemaDefinedProperties = new Set<string>(\n propertyKeys.filter(key => {\n const propertyObject = schema.properties![\n key\n ] as JSONSchema7Definition &\n Record<typeof ADDITIONAL_PROPERTY_FLAG, any>\n return !propertyObject[ADDITIONAL_PROPERTY_FLAG]\n }),\n )\n\n if (previousSchemaDefinedProperties.current != null) {\n // Compare the schema defined properties with the previous version to see if any were lost.\n const lostProperties = Array.from(\n previousSchemaDefinedProperties.current,\n ).filter(schemaDefinedProperty => {\n return (\n // Property is no longer in schema\n !schemaDefinedProperties.has(schemaDefinedProperty) &&\n // Form data exists\n !!formData &&\n // Property still exists in form data and is not null\n // if the data is null, then we don't need to worry about it; user data wasn't lost\n formData[schemaDefinedProperty] != null &&\n // Property matches `additionalProperties` requirements: is an array and contains non-null values\n Array.isArray(formData[schemaDefinedProperty]) &&\n (formData[schemaDefinedProperty] as Array<never>).filter(\n item => item != null,\n ).length > 0\n )\n })\n if (lostProperties.length > 0) {\n // Report the converted fields in a toast message\n displayToast(\n `The following annotations are no longer specified by the schema and have been converted to custom fields: ${lostProperties.join(\n ', ',\n )}.`,\n 'warning',\n {\n title: 'Fields No Longer Specified By Schema',\n },\n )\n }\n }\n // Update the last known properties to match the current properties\n previousSchemaDefinedProperties.current = schemaDefinedProperties\n }\n }, [schema.properties])\n\n return (\n <fieldset id={idSchema.$id}>\n {(options.title || title) && (\n <TitleFieldTemplate\n id={`${idSchema.$id}__title`}\n schema={schema}\n title={options.title || title}\n required={required}\n uiSchema={uiSchema}\n registry={registry}\n />\n )}\n {(options.description || description) && (\n <DescriptionFieldTemplate\n id={`${idSchema.$id}__description`}\n description={options.description || description!}\n registry={registry}\n schema={schema}\n />\n )}\n {properties.map((prop: ObjectFieldTemplatePropertyType) => prop.content)}\n\n {canExpand(schema, uiSchema, formData) && (\n <Tooltip title=\"Add a new custom field\" placement=\"top\">\n <Button\n sx={{ my: 2 }}\n variant=\"contained\"\n className=\"rjsf-object-property-expand\"\n onClick={onAddClick(schema)}\n disabled={disabled || readonly}\n aria-label={'Add Custom Field'}\n >\n <AddToList />\n </Button>\n </Tooltip>\n )}\n </fieldset>\n )\n}\n"],"mappings":";;;;;;;;;AA4BA,SAAgB,EAId,GAA0C;CAC1C,IAAM,EACJ,gBACA,aACA,aACA,aACA,eACA,eACA,aACA,aACA,aACA,WACA,UACA,gBACE,GAEE,IAAU,EAAsB,EAAS,EACzC,IAAqB,EACzB,sBACA,GACA,EACD,EACK,IAA2B,EAK/B,4BAA4B,GAAU,EAAQ,EAK1C,IAAkC,kBAAoB,IAAI,KAAK,CAAC;AA+DtE,QApDA,QAAkC;AAChC,MAAI,gBAAgB,KAAU,EAAO,YAAY;GAC/C,IAAM,IAAe,OAAO,KAAK,EAAO,WAAW,EAE7C,IAA0B,IAAI,IAClC,EAAa,QAAO,MAKX,CAJgB,EAAO,WAC5B,GAGqB,GACvB,CACH;AAED,OAAI,EAAgC,WAAW,MAAM;IAEnD,IAAM,IAAiB,MAAM,KAC3B,EAAgC,QACjC,CAAC,QAAO,MAGL,CAAC,EAAwB,IAAI,EAAsB,IAEnD,CAAC,CAAC,KAGF,EAAS,MAA0B,QAEnC,MAAM,QAAQ,EAAS,GAAuB,IAC7C,EAAS,GAAwC,QAChD,MAAQ,KAAQ,KACjB,CAAC,SAAS,EAEb;AACF,IAAI,EAAe,SAAS,KAE1B,EACE,6GAA6G,EAAe,KAC1H,KACD,CAAC,IACF,WACA,EACE,OAAO,wCACR,CACF;;AAIL,KAAgC,UAAU;;IAE3C,CAAC,EAAO,WAAW,CAAC,EAGrB,kBAAC,YAAD;EAAU,IAAI,EAAS;YAAvB;IACI,EAAQ,SAAS,MACjB,kBAAC,GAAD;IACE,IAAI,GAAG,EAAS,IAAI;IACZ;IACR,OAAO,EAAQ,SAAS;IACd;IACA;IACA;IACV,CAAA;IAEF,EAAQ,eAAe,MACvB,kBAAC,GAAD;IACE,IAAI,GAAG,EAAS,IAAI;IACpB,aAAa,EAAQ,eAAe;IAC1B;IACF;IACR,CAAA;GAEH,EAAW,KAAK,MAA0C,EAAK,QAAQ;GAEvE,EAAU,GAAQ,GAAU,EAAS,IACpC,kBAAC,GAAD;IAAS,OAAM;IAAyB,WAAU;cAChD,kBAAC,GAAD;KACE,IAAI,EAAE,IAAI,GAAG;KACb,SAAQ;KACR,WAAU;KACV,SAAS,EAAW,EAAO;KAC3B,UAAU,KAAY;KACtB,cAAY;eAEZ,kBAAC,GAAD,EAAa,CAAA;KACN,CAAA;IACD,CAAA;GAEH"}
1
+ {"version":3,"file":"ObjectFieldTemplate.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport { Button, Tooltip } from '@mui/material'\nimport {\n ADDITIONAL_PROPERTY_FLAG,\n canExpand,\n FormContextType,\n getTemplate,\n getUiOptions,\n ObjectFieldTemplatePropertyType,\n ObjectFieldTemplateProps,\n RJSFSchema,\n StrictRJSFSchema,\n} from '@rjsf/utils'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { useRef } from 'react'\nimport { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect'\nimport { displayToast } from '../../ToastMessage'\n\n/**\n * Derived from the base ObjectFieldTemplate with annotations-editor-specific changes\n * - Custom button for adding additional properties\n * - Tracks properties to show a toast message if a property is converted to an additionalProperty because it was\n * dropped from the schema (e.g. in a conditional schema)\n *\n * See https://github.com/rjsf-team/react-jsonschema-form/blob/main/packages/mui/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx\n * @param props\n * @returns\n */\nexport function ObjectFieldTemplate<\n T extends Record<string, any> | null | undefined = Record<string, any>,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: ObjectFieldTemplateProps<T, S, F>) {\n const {\n description,\n disabled,\n formData,\n idSchema,\n onAddClick,\n properties,\n readonly,\n registry,\n required,\n schema,\n title,\n uiSchema,\n } = props\n\n const options = getUiOptions<T, S, F>(uiSchema)\n const TitleFieldTemplate = getTemplate<'TitleFieldTemplate', T, S, F>(\n 'TitleFieldTemplate',\n registry,\n options,\n )\n const DescriptionFieldTemplate = getTemplate<\n 'DescriptionFieldTemplate',\n T,\n S,\n F\n >('DescriptionFieldTemplate', registry, options)\n\n /*\n Tracks the property keys that were last known to exist in the object.\n */\n const previousSchemaDefinedProperties = useRef<Set<string>>(new Set())\n\n /**\n * We track how the schema changes as the user enters data, causing conditional subschemas to be evaluated.\n *\n * If a property exists in the previous version of the schema and has user data, and then is dropped from the schema due to a data update, then\n * we need to prompt the user whether they want to undo the change, or continue and keep/remove those fields\n *\n * In this component, we can identify when one or more fields with user data are dropped (the field gains the additional property flag in the schema prop).\n * We then use a function provided by the context to report which fields were lost.\n */\n useDeepCompareEffectNoCheck(() => {\n if ('properties' in schema && schema.properties) {\n const propertyKeys = Object.keys(schema.properties)\n // Schema-defined properties are those properties in the schema without the additional property flag.\n const schemaDefinedProperties = new Set<string>(\n propertyKeys.filter(key => {\n const propertyObject = schema.properties![\n key\n ] as JSONSchema7Definition &\n Record<typeof ADDITIONAL_PROPERTY_FLAG, any>\n return !propertyObject[ADDITIONAL_PROPERTY_FLAG]\n }),\n )\n\n if (previousSchemaDefinedProperties.current != null) {\n // Compare the schema defined properties with the previous version to see if any were lost.\n const lostProperties = Array.from(\n previousSchemaDefinedProperties.current,\n ).filter(schemaDefinedProperty => {\n return (\n // Property is no longer in schema\n !schemaDefinedProperties.has(schemaDefinedProperty) &&\n // Form data exists\n !!formData &&\n // Property still exists in form data and is not null\n // if the data is null, then we don't need to worry about it; user data wasn't lost\n formData[schemaDefinedProperty] != null &&\n // Property matches `additionalProperties` requirements: is an array and contains non-null values\n Array.isArray(formData[schemaDefinedProperty]) &&\n (formData[schemaDefinedProperty] as Array<never>).filter(\n item => item != null,\n ).length > 0\n )\n })\n if (lostProperties.length > 0) {\n // Report the converted fields in a toast message\n displayToast(\n `The following annotations are no longer specified by the schema and have been converted to custom fields: ${lostProperties.join(\n ', ',\n )}.`,\n 'warning',\n {\n title: 'Fields No Longer Specified By Schema',\n },\n )\n }\n }\n // Update the last known properties to match the current properties\n previousSchemaDefinedProperties.current = schemaDefinedProperties\n }\n }, [schema.properties])\n\n return (\n <fieldset id={idSchema.$id}>\n {(options.title || title) && (\n <TitleFieldTemplate\n id={`${idSchema.$id}__title`}\n schema={schema}\n title={options.title || title}\n required={required}\n uiSchema={uiSchema}\n registry={registry}\n />\n )}\n {(options.description || description) && (\n <DescriptionFieldTemplate\n id={`${idSchema.$id}__description`}\n description={options.description || description!}\n registry={registry}\n schema={schema}\n />\n )}\n {properties.map((prop: ObjectFieldTemplatePropertyType) => prop.content)}\n\n {canExpand(schema, uiSchema, formData) && (\n <Tooltip title=\"Add a new custom field\" placement=\"top\">\n <Button\n sx={{ my: 2 }}\n variant=\"contained\"\n className=\"rjsf-object-property-expand\"\n onClick={onAddClick(schema)}\n disabled={disabled || readonly}\n aria-label={'Add Custom Field'}\n >\n <AddToList />\n </Button>\n </Tooltip>\n )}\n </fieldset>\n )\n}\n"],"mappings":";;;;;;;;;AA4BA,SAAgB,EAId,GAA0C;CAC1C,IAAM,EACJ,gBACA,aACA,aACA,aACA,eACA,eACA,aACA,aACA,aACA,WACA,UACA,gBACE,GAEE,IAAU,EAAsB,CAAQ,GACxC,IAAqB,EACzB,sBACA,GACA,CACF,GACM,IAA2B,EAK/B,4BAA4B,GAAU,CAAO,GAKzC,IAAkC,kBAAoB,IAAI,IAAI,CAAC;CA+DrE,OApDA,QAAkC;EAChC,IAAI,gBAAgB,KAAU,EAAO,YAAY;GAC/C,IAAM,IAAe,OAAO,KAAK,EAAO,UAAU,GAE5C,IAA0B,IAAI,IAClC,EAAa,QAAO,MAKX,CAJgB,EAAO,WAC5B,GAGqB,EACxB,CACH;GAEA,IAAI,EAAgC,WAAW,MAAM;IAEnD,IAAM,IAAiB,MAAM,KAC3B,EAAgC,OAClC,EAAE,QAAO,MAGL,CAAC,EAAwB,IAAI,CAAqB,KAElD,CAAC,CAAC,KAGF,EAAS,MAA0B,QAEnC,MAAM,QAAQ,EAAS,EAAsB,KAC5C,EAAS,GAAwC,QAChD,MAAQ,KAAQ,IAClB,EAAE,SAAS,CAEd;IACD,AAAI,EAAe,SAAS,KAE1B,EACE,6GAA6G,EAAe,KAC1H,IACF,EAAE,IACF,WACA,EACE,OAAO,uCACT,CACF;GAEJ;GAEA,EAAgC,UAAU;EAC5C;CACF,GAAG,CAAC,EAAO,UAAU,CAAC,GAGpB,kBAAC,YAAD;EAAU,IAAI,EAAS;YAAvB;IACI,EAAQ,SAAS,MACjB,kBAAC,GAAD;IACE,IAAI,GAAG,EAAS,IAAI;IACZ;IACR,OAAO,EAAQ,SAAS;IACd;IACA;IACA;GACX,CAAA;IAED,EAAQ,eAAe,MACvB,kBAAC,GAAD;IACE,IAAI,GAAG,EAAS,IAAI;IACpB,aAAa,EAAQ,eAAe;IAC1B;IACF;GACT,CAAA;GAEF,EAAW,KAAK,MAA0C,EAAK,OAAO;GAEtE,EAAU,GAAQ,GAAU,CAAQ,KACnC,kBAAC,GAAD;IAAS,OAAM;IAAyB,WAAU;cAChD,kBAAC,GAAD;KACE,IAAI,EAAE,IAAI,EAAE;KACZ,SAAQ;KACR,WAAU;KACV,SAAS,EAAW,CAAM;KAC1B,UAAU,KAAY;KACtB,cAAY;eAEZ,kBAAC,GAAD,CAAY,CAAA;IACN,CAAA;GACD,CAAA;EAEH;;AAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseAnnotationsWrapIfAdditionalTemplate.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/template/SynapseAnnotationsWrapIfAdditionalTemplate.tsx"],"sourcesContent":["import {\n ADDITIONAL_PROPERTY_FLAG,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n TranslatableString,\n WrapIfAdditionalTemplateProps,\n} from '@rjsf/utils'\nimport { FocusEventHandler } from 'react'\nimport { GridLegacy as Grid, TextField } from '@mui/material'\n\n/** The `WrapIfAdditional` component is used by the `FieldTemplate` to rename, or remove properties that are\n * part of an `additionalProperties` part of a schema.\n *\n * @param props - The `WrapIfAdditionalProps` for this component\n */\nexport default function SynapseAnnotationsWrapIfAdditionalTemplate<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: WrapIfAdditionalTemplateProps<T, S, F>) {\n const {\n id,\n classNames,\n disabled,\n label,\n onKeyChange,\n readonly,\n required,\n schema,\n children,\n registry,\n } = props\n const { translateString } = registry\n const keyLabel = translateString(TranslatableString.KeyLabel, [''])\n const additional = ADDITIONAL_PROPERTY_FLAG in schema\n\n if (!additional) {\n return <div className={classNames}>{children}</div>\n }\n\n const handleBlur: FocusEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n > = ({ target }) => {\n if (target) onKeyChange(target.value)\n }\n\n return (\n <div className={classNames}>\n <Grid\n container\n columnSpacing={2}\n rowSpacing={0}\n sx={{\n my: 1,\n }}\n >\n <Grid item xs={3}>\n <TextField\n fullWidth={true}\n required={required}\n label={keyLabel}\n defaultValue={label}\n disabled={disabled || readonly}\n id={`${id}-key`}\n name={`${id}-key`}\n onBlur={!readonly ? handleBlur : undefined}\n type=\"text\"\n />\n </Grid>\n {children}\n {/* All additional properties are treated as arrays, so we don't show a remove button here. */}\n {/* To drop the property, drop the last array item. */}\n </Grid>\n </div>\n )\n}\n"],"mappings":";;;;AAgBA,SAAwB,EAItB,GAA+C;CAC/C,IAAM,EACJ,OACA,eACA,aACA,UACA,gBACA,aACA,aACA,WACA,aACA,gBACE,GACE,EAAE,uBAAoB,GACtB,IAAW,EAAgB,EAAmB,UAAU,CAAC,GAAG,CAAC;AAanE,QAZmB,KAA4B,IAa7C,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,GAAD;GACE,WAAA;GACA,eAAe;GACf,YAAY;GACZ,IAAI,EACF,IAAI,GACL;aANH,CAQE,kBAAC,GAAD;IAAM,MAAA;IAAK,IAAI;cACb,kBAAC,GAAD;KACE,WAAW;KACD;KACV,OAAO;KACP,cAAc;KACd,UAAU,KAAY;KACtB,IAAI,GAAG,EAAG;KACV,MAAM,GAAG,EAAG;KACZ,QAAS,IAAwB,KAAA,KAvBtC,EAAE,gBAAa;AAClB,MAAI,KAAQ,EAAY,EAAO,MAAM;;KAuB7B,MAAK;KACL,CAAA;IACG,CAAA,EACN,EAGI;;EACH,CAAA,GApCC,kBAAC,OAAD;EAAK,WAAW;EAAa;EAAe,CAAA"}
1
+ {"version":3,"file":"SynapseAnnotationsWrapIfAdditionalTemplate.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/template/SynapseAnnotationsWrapIfAdditionalTemplate.tsx"],"sourcesContent":["import {\n ADDITIONAL_PROPERTY_FLAG,\n FormContextType,\n RJSFSchema,\n StrictRJSFSchema,\n TranslatableString,\n WrapIfAdditionalTemplateProps,\n} from '@rjsf/utils'\nimport { FocusEventHandler } from 'react'\nimport { GridLegacy as Grid, TextField } from '@mui/material'\n\n/** The `WrapIfAdditional` component is used by the `FieldTemplate` to rename, or remove properties that are\n * part of an `additionalProperties` part of a schema.\n *\n * @param props - The `WrapIfAdditionalProps` for this component\n */\nexport default function SynapseAnnotationsWrapIfAdditionalTemplate<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(props: WrapIfAdditionalTemplateProps<T, S, F>) {\n const {\n id,\n classNames,\n disabled,\n label,\n onKeyChange,\n readonly,\n required,\n schema,\n children,\n registry,\n } = props\n const { translateString } = registry\n const keyLabel = translateString(TranslatableString.KeyLabel, [''])\n const additional = ADDITIONAL_PROPERTY_FLAG in schema\n\n if (!additional) {\n return <div className={classNames}>{children}</div>\n }\n\n const handleBlur: FocusEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n > = ({ target }) => {\n if (target) onKeyChange(target.value)\n }\n\n return (\n <div className={classNames}>\n <Grid\n container\n columnSpacing={2}\n rowSpacing={0}\n sx={{\n my: 1,\n }}\n >\n <Grid item xs={3}>\n <TextField\n fullWidth={true}\n required={required}\n label={keyLabel}\n defaultValue={label}\n disabled={disabled || readonly}\n id={`${id}-key`}\n name={`${id}-key`}\n onBlur={!readonly ? handleBlur : undefined}\n type=\"text\"\n />\n </Grid>\n {children}\n {/* All additional properties are treated as arrays, so we don't show a remove button here. */}\n {/* To drop the property, drop the last array item. */}\n </Grid>\n </div>\n )\n}\n"],"mappings":";;;;AAgBA,SAAwB,EAItB,GAA+C;CAC/C,IAAM,EACJ,OACA,eACA,aACA,UACA,gBACA,aACA,aACA,WACA,aACA,gBACE,GACE,EAAE,uBAAoB,GACtB,IAAW,EAAgB,EAAmB,UAAU,CAAC,EAAE,CAAC;CAalE,OAZmB,KAA4B,IAa7C,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,GAAD;GACE,WAAA;GACA,eAAe;GACf,YAAY;GACZ,IAAI,EACF,IAAI,EACN;aANF,CAQE,kBAAC,GAAD;IAAM,MAAA;IAAK,IAAI;cACb,kBAAC,GAAD;KACE,WAAW;KACD;KACV,OAAO;KACP,cAAc;KACd,UAAU,KAAY;KACtB,IAAI,GAAG,EAAG;KACV,MAAM,GAAG,EAAG;KACZ,QAAS,IAAwB,KAAA,KAvBtC,EAAE,gBAAa;MAClB,AAAI,KAAQ,EAAY,EAAO,KAAK;KACtC;KAsBU,MAAK;IACN,CAAA;GACG,CAAA,GACL,CAGG;;CACH,CAAA,IApCE,kBAAC,OAAD;EAAK,WAAW;EAAa;CAAc,CAAA;AAsCtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextWidget.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/widget/TextWidget.tsx"],"sourcesContent":["import { Widget, WidgetProps } from '@rjsf/utils'\n\n/**\n * This TextWidget is almost identical to the rjsf TextWidget, except we handle numbers like strings to prevent issues if\n * the actual annotation data is not a string.\n */\nexport const TextWidget: Widget = (props: WidgetProps) => {\n const { BaseInputTemplate } = props.registry.templates\n\n // options.inputType will override the input type determined via schema\n let inputType: string | undefined = undefined\n if (props.schema.type === 'number' || props.schema.type === 'integer') {\n inputType = 'text'\n }\n\n return (\n <BaseInputTemplate\n {...props}\n options={{ ...props.options, inputType: inputType }}\n />\n )\n}\n\nexport default TextWidget\n"],"mappings":";;AAMA,IAAa,KAAsB,MAAuB;CACxD,IAAM,EAAE,yBAAsB,EAAM,SAAS,WAGzC;AAKJ,SAJI,EAAM,OAAO,SAAS,YAAY,EAAM,OAAO,SAAS,eAC1D,IAAY,SAIZ,kBAAC,GAAD;EACE,GAAI;EACJ,SAAS;GAAE,GAAG,EAAM;GAAoB;GAAW;EACnD,CAAA"}
1
+ {"version":3,"file":"TextWidget.js","names":[],"sources":["../../../../src/components/SchemaDrivenAnnotationEditor/widget/TextWidget.tsx"],"sourcesContent":["import { Widget, WidgetProps } from '@rjsf/utils'\n\n/**\n * This TextWidget is almost identical to the rjsf TextWidget, except we handle numbers like strings to prevent issues if\n * the actual annotation data is not a string.\n */\nexport const TextWidget: Widget = (props: WidgetProps) => {\n const { BaseInputTemplate } = props.registry.templates\n\n // options.inputType will override the input type determined via schema\n let inputType: string | undefined = undefined\n if (props.schema.type === 'number' || props.schema.type === 'integer') {\n inputType = 'text'\n }\n\n return (\n <BaseInputTemplate\n {...props}\n options={{ ...props.options, inputType: inputType }}\n />\n )\n}\n\nexport default TextWidget\n"],"mappings":";;AAMA,IAAa,KAAsB,MAAuB;CACxD,IAAM,EAAE,yBAAsB,EAAM,SAAS,WAGzC;CAKJ,QAJI,EAAM,OAAO,SAAS,YAAY,EAAM,OAAO,SAAS,eAC1D,IAAY,SAIZ,kBAAC,GAAD;EACE,GAAI;EACJ,SAAS;GAAE,GAAG,EAAM;GAAoB;EAAU;CACnD,CAAA;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQueryUseQueryOptions.js","names":[],"sources":["../../../src/components/SearchQueryWrapper/SearchQueryUseQueryOptions.ts"],"sourcesContent":["import * as SynapseClient from '@/synapse-client/SynapseClient'\nimport { tableQueryUseQueryDefaults } from '@/synapse-queries'\nimport { useGetEntityBundle } from '@/synapse-queries/entity/useEntityBundle'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n AsynchronousJobStatus,\n ColumnModel,\n FACET_COLUMN_RANGE_REQUEST_CONCRETE_TYPE_VALUE,\n FacetColumnRangeRequest,\n FacetColumnResultRange,\n FACET_COLUMN_VALUES_REQUEST_CONCRETE_TYPE_VALUE,\n FacetColumnValuesRequest,\n QueryBundleRequest,\n QueryResultBundle,\n RowSet,\n SortItem,\n TEXT_MATCHES_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n TextMatchesQueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport type {\n FacetRequest,\n KeyValues,\n SearchIndexQuery,\n SearchKeyRange,\n SearchQueryResults,\n SearchSearchQuery,\n SearchSortField,\n SynapseClientError,\n} from '@sage-bionetworks/synapse-client'\nimport {\n FacetRequestSortDirectionEnum as FacetRequestSortDirectionEnumValues,\n FacetRequestSortFieldEnum as FacetRequestSortFieldEnumValues,\n} from '@sage-bionetworks/synapse-client'\nimport {\n InfiniteData,\n QueryKey,\n UseInfiniteQueryOptions,\n UseSuspenseQueryOptions,\n} from '@tanstack/react-query'\nimport { omit } from 'lodash-es'\nimport dayjs from 'dayjs'\nimport { useCallback, useMemo } from 'react'\nimport { KeyFactory } from '@/synapse-queries/KeyFactory'\n\n/**\n * TanStack Query options for the SearchQueryServicesApi, mirroring TableQueryUseQueryOptions\n * but parameterised over SearchIndexQuery rather than QueryBundleRequest. This eliminates\n * `as unknown as` casts inside the implementation. A single cast to TableQueryUseQueryOptions\n * is still required at the boundary where SearchQueryWrapper assigns these into QueryContextType.\n */\nexport type SearchTableQueryUseQueryOptions = {\n rowDataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n RowSet | undefined\n >\n rowDataInfiniteQueryOptions: UseInfiniteQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n InfiniteData<AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>>,\n QueryKey,\n string | number | undefined\n >\n queryMetadataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n Omit<QueryResultBundle, 'queryResult'>\n >\n}\n\n/**\n * Converts a QueryBundleRequest (used internally for state management) into a SearchIndexQuery\n * that can be sent to the SearchQueryServicesApi.\n *\n * Mapping:\n * - columnModels (facetType defined) → facetRequests (columns to aggregate as facets, with optional sort config)\n * - query.selectedFacets (enumeration) → termsFilters (IN-clause filters)\n * - query.selectedFacets (range) → rangeFilters (range filters)\n * - query.sort → sort (SortItem { column, direction } → SearchSortField { columnName, direction })\n * - query.limit → limit\n * - query.offset → offset\n * - partMask → dropped (SearchIndexQuery has no bitmask concept)\n */\nexport function toSearchIndexQuery(\n queryBundleRequest: QueryBundleRequest,\n searchIndexId: string,\n columnModels?: ColumnModel[],\n): SearchIndexQuery {\n // Build facetRequests from ColumnModels that have a facetType of 'enumeration'.\n // Range columns are excluded: the Search API's FacetRequest only supports terms aggregations\n // and cannot produce the min/max stats needed for FacetColumnResultRange.\n const facetRequests: FacetRequest[] | undefined = columnModels\n ?.filter(cm => cm.facetType === 'enumeration')\n .map(cm => {\n const facetReq: FacetRequest = { columnName: cm.name, maxValueCount: 100 }\n if (cm.facetSortConfig) {\n // Map FacetColumnSortProperty ('FREQUENCY'|'VALUE') → FacetRequestSortFieldEnum ('COUNT'|'KEY')\n if (cm.facetSortConfig.property != null) {\n facetReq.sortField =\n cm.facetSortConfig.property === 'VALUE'\n ? FacetRequestSortFieldEnumValues.KEY\n : FacetRequestSortFieldEnumValues.COUNT\n }\n if (cm.facetSortConfig.direction != null) {\n facetReq.sortDirection =\n cm.facetSortConfig.direction === 'ASC'\n ? FacetRequestSortDirectionEnumValues.ASC\n : FacetRequestSortDirectionEnumValues.DESC\n }\n }\n return facetReq\n })\n\n // Build termsFilters from enumeration selectedFacets\n const termsFilters: KeyValues[] | undefined =\n queryBundleRequest.query.selectedFacets\n ?.filter(\n (f): f is FacetColumnValuesRequest =>\n f.concreteType === FACET_COLUMN_VALUES_REQUEST_CONCRETE_TYPE_VALUE,\n )\n .map(f => ({ key: f.columnName, values: f.facetValues }))\n\n // Build rangeFilters from range selectedFacets.\n // DATE columns: the Range UI component emits formatted dates (\"YYYY-MM-DD\") but the\n // Search API (OpenSearch) expects unix millisecond timestamps. Convert here.\n const rangeFilters: SearchKeyRange[] | undefined =\n queryBundleRequest.query.selectedFacets\n ?.filter(\n (f): f is FacetColumnRangeRequest =>\n f.concreteType === FACET_COLUMN_RANGE_REQUEST_CONCRETE_TYPE_VALUE,\n )\n .map(f => {\n const columnType = columnModels?.find(\n cm => cm.name === f.columnName,\n )?.columnType\n const toApiValue = (v: string | undefined): string | undefined => {\n if (!v || columnType !== 'DATE') return v\n // Convert \"YYYY-MM-DD\" → unix ms; leave already-numeric values untouched\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) {\n return String(dayjs(v).valueOf())\n }\n return v\n }\n return {\n key: f.columnName,\n min: toApiValue(f.min),\n max: toApiValue(f.max),\n }\n })\n\n // Extract queryText by concatenating all TextMatchesQueryFilter searchExpression values\n const textMatchesExpressions = queryBundleRequest.query.additionalFilters\n ?.filter(\n (f): f is TextMatchesQueryFilter =>\n f.concreteType === TEXT_MATCHES_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n )\n .map(f => f.searchExpression)\n .filter((expr): expr is string => expr != null && expr.length > 0)\n const queryText =\n textMatchesExpressions && textMatchesExpressions.length > 0\n ? textMatchesExpressions.join(' ')\n : undefined\n\n // Map SortItem[] (column + direction) → SearchSortField[] (columnName + direction),\n // filtering out entries with no direction (which mean \"remove sort\").\n const sort: SearchSortField[] | undefined = queryBundleRequest.query.sort\n ?.filter(\n (s): s is SortItem & { direction: 'ASC' | 'DESC' } =>\n s.direction === 'ASC' || s.direction === 'DESC',\n )\n .map(s => ({ columnName: s.column, direction: s.direction }))\n\n const searchQuery: SearchSearchQuery = {\n facetRequests: facetRequests?.length ? facetRequests : undefined,\n termsFilters: termsFilters?.length ? termsFilters : undefined,\n rangeFilters: rangeFilters?.length ? rangeFilters : undefined,\n queryText,\n queryType: 'MULTI_MATCH',\n fuzziness: 'AUTO',\n sort: sort?.length ? sort : undefined,\n limit: queryBundleRequest.query.limit,\n offset: queryBundleRequest.query.offset,\n }\n\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.search.table.SearchIndexQuery' as const,\n searchIndexId,\n searchQuery,\n }\n}\n\n/**\n * Converts a SearchQueryResults (the actual API response) into a QueryResultBundle\n * so that existing subcomponents (FacetFilterControls, RowSetView, etc.) work unchanged.\n *\n * Mapping:\n * - totalHits → queryCount\n * - hits → queryResult.queryResults (rows derived from hit.rowId/rowVersion/fields)\n * - facets → facets (same FacetColumnResult type)\n */\nexport function searchQueryResultsToQueryResultBundle(\n results: SearchQueryResults | undefined,\n query: SearchIndexQuery,\n columnModels?: ColumnModel[],\n): QueryResultBundle {\n if (!results) {\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResultBundle',\n }\n }\n\n // Derive column names from the server-returned selectColumns. Both the row data\n // query and the metadata query request SELECT_COLUMNS, so this is always present.\n const fieldNames: string[] =\n results.selectColumns\n ?.map(col => col.name)\n .filter((n): n is string => !!n) ?? []\n\n const headers = fieldNames.map(name => ({\n name,\n columnType:\n columnModels?.find(cm => cm.name === name)?.columnType ??\n ('STRING' as const),\n }))\n\n const rows = (results.hits ?? []).map(hit => ({\n rowId: hit.rowId,\n versionNumber: hit.rowVersion,\n values: fieldNames.map(name => {\n return hit.fields?.find(f => f.name === name)?.value ?? null\n }),\n }))\n\n const queryResult =\n headers.length > 0 || rows.length > 0\n ? {\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryResult' as const,\n queryResults: {\n concreteType:\n 'org.sagebionetworks.repo.model.table.RowSet' as const,\n tableId: query.searchIndexId ?? '',\n etag: '',\n headers,\n rows,\n },\n }\n : undefined\n\n const rawFacets = results.facets as QueryResultBundle['facets']\n\n // Synthesize FacetColumnResultRange for range-type DATE/DOUBLE/INTEGER columns. The Search API's\n // FacetRequest only produces terms aggregations and cannot return min/max stats, so these\n // entries will never appear in results.facets. columnMin/columnMax are empty strings\n // (unavailable from the server); selectedMin/selectedMax are derived from the query's\n // rangeFilters so any applied range filter is still reflected in the UI.\n // Note: for INTEGER columns the RangeSlider requires real bounds, so the UI falls back to a\n // plain Range number input when columnMin/columnMax are absent.\n const syntheticRangeFacets: FacetColumnResultRange[] = (columnModels ?? [])\n .filter(\n cm =>\n cm.facetType === 'range' &&\n (cm.columnType === 'DATE' ||\n cm.columnType === 'DOUBLE' ||\n cm.columnType === 'INTEGER') &&\n !(rawFacets ?? []).some(f => f.columnName === cm.name),\n )\n .map(cm => {\n const rangeFilter = query.searchQuery?.rangeFilters?.find(\n rf => rf.key === cm.name,\n )\n // rangeFilters carry unix ms for DATE columns (converted in toSearchIndexQuery).\n // Convert back to \"YYYY-MM-DD\" so the Range UI component can display them.\n const toDisplayValue = (v: string | undefined): string | undefined => {\n if (!v || cm.columnType !== 'DATE') return v\n if (/^\\d+$/.test(v)) {\n return dayjs(parseInt(v)).format('YYYY-MM-DD')\n }\n return v\n }\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnResultRange' as const,\n facetType: 'range' as const,\n columnName: cm.name,\n columnMin: '',\n columnMax: '',\n selectedMin: toDisplayValue(rangeFilter?.min),\n selectedMax: toDisplayValue(rangeFilter?.max),\n }\n })\n\n const allFacets: NonNullable<QueryResultBundle['facets']> = [\n ...(rawFacets ?? []),\n ...syntheticRangeFacets,\n ]\n\n // Reorder all facets to match the columnModels order so downstream components\n // (e.g. FacetFilterControls) render facets in the expected column order.\n const orderedFacets: QueryResultBundle['facets'] = columnModels\n ? [\n ...allFacets\n .filter(f => columnModels.some(cm => cm.name === f.columnName))\n .sort(\n (a, b) =>\n columnModels.findIndex(cm => cm.name === a.columnName) -\n columnModels.findIndex(cm => cm.name === b.columnName),\n ),\n ...allFacets.filter(\n f => !columnModels.some(cm => cm.name === f.columnName),\n ),\n ]\n : allFacets\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResultBundle',\n queryCount: results.totalHits,\n selectColumns: headers,\n queryResult,\n facets: orderedFacets,\n }\n}\n\nexport function getSearchQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n keyFactory: KeyFactory,\n accessToken: string | undefined,\n searchIndexId: string,\n columnModels?: ColumnModel[],\n): SearchTableQueryUseQueryOptions {\n const baseQuery: SearchIndexQuery = toSearchIndexQuery(\n queryBundleRequest,\n searchIndexId,\n columnModels,\n )\n const rowDataQuery: SearchIndexQuery = {\n ...baseQuery,\n searchQuery: {\n ...baseQuery.searchQuery,\n // Omit facetRequests from the row data query: facet aggregations are only needed\n // in the metadata query (which requests FACETS). Removing facetRequests here keeps\n // the row data query key stable while column models are loading, preventing an\n // unnecessary re-fetch (and a brief loading flash) when column models first arrive.\n facetRequests: undefined,\n },\n // Request SELECT_COLUMNS so headers are available for row rendering.\n // HITS is returned by default even when responseParts is specified.\n responseParts: new Set(['HITS', 'SELECT_COLUMNS'] as const),\n }\n const metadataQuery: SearchIndexQuery = {\n ...baseQuery,\n // Request all opt-in parts needed for the metadata response:\n // TOTAL_HITS → queryCount (drives tab count / spinner resolution)\n // SELECT_COLUMNS → column headers for the table\n // FACETS → facet aggregations for FacetFilterControls / plots\n responseParts: new Set(['TOTAL_HITS', 'SELECT_COLUMNS', 'FACETS'] as const),\n }\n\n // Convert responseParts Set → sorted array for query key building.\n // JSON.stringify(new Set([...])) === '{}', so two queries whose only difference is\n // their responseParts would hash to the same key and share a cache entry.\n // Using a sorted array gives each query a distinct, stable key.\n const toKeyShape = (query: SearchIndexQuery) => ({\n ...query,\n responseParts: query.responseParts\n ? [...query.responseParts].sort()\n : undefined,\n })\n\n // Fetches from the SearchQueryServicesApi and converts the SearchQueryResults responseBody\n // into QueryResultBundle shape. This allows all downstream shared components\n // (UseRowSet, QueryVisualizationWrapper, etc.) to access data.responseBody.*\n // using the same patterns as regular table queries (queryResult.queryResults, selectColumns, etc.).\n const fetchAndConvert = async (query: SearchIndexQuery) => {\n const asyncStatus = await SynapseClient.getSearchQueryAsyncJobResults(\n query,\n accessToken,\n )\n return {\n ...asyncStatus,\n responseBody: searchQueryResultsToQueryResultBundle(\n asyncStatus.responseBody,\n query,\n columnModels,\n ),\n }\n }\n\n // `as unknown as` is necessary because SearchIndexQuery.responseParts is a Set but\n // toKeyShape converts it to a sorted string[] for stable cache key serialisation.\n const rowDataQueryOptions: SearchTableQueryUseQueryOptions['rowDataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getSearchQueryResultWithAsyncStatusQueryKey(\n toKeyShape(rowDataQuery) as unknown as SearchIndexQuery,\n false,\n ),\n queryFn: () => fetchAndConvert(rowDataQuery),\n select: (\n data: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n ): RowSet | undefined => data.responseBody?.queryResult?.queryResults,\n }\n\n const rowDataInfiniteQueryOptions: SearchTableQueryUseQueryOptions['rowDataInfiniteQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getSearchQueryResultWithAsyncStatusQueryKey(\n toKeyShape(rowDataQuery) as unknown as SearchIndexQuery,\n true,\n ),\n initialPageParam: 0 as number | string | undefined,\n getNextPageParam: (\n lastPage: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n allPages: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>[],\n ): number | string | undefined => {\n const totalRows = lastPage.responseBody?.queryCount\n const fetchedRows = allPages.reduce(\n (acc, page) =>\n acc +\n (page.responseBody?.queryResult?.queryResults.rows?.length ?? 0),\n 0,\n )\n if (totalRows != null && fetchedRows >= totalRows) {\n return undefined\n }\n return fetchedRows\n },\n queryFn: (context: { pageParam?: number | string }) => {\n const offset =\n typeof context.pageParam === 'string'\n ? parseInt(context.pageParam)\n : (context.pageParam ?? 0)\n const requestForPage: SearchIndexQuery = {\n ...rowDataQuery,\n searchQuery: {\n ...rowDataQuery.searchQuery,\n offset,\n },\n }\n return fetchAndConvert(requestForPage)\n },\n select: (\n data: InfiniteData<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>\n >,\n ) => data,\n }\n\n const queryMetadataQueryOptions: SearchTableQueryUseQueryOptions['queryMetadataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getSearchQueryResultWithAsyncStatusQueryKey(\n toKeyShape(metadataQuery) as unknown as SearchIndexQuery,\n false,\n ),\n queryFn: () => fetchAndConvert(metadataQuery),\n select: (\n data: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n ): Omit<QueryResultBundle, 'queryResult'> => {\n const result = omit(data.responseBody ?? {}, 'queryResult') as Omit<\n QueryResultBundle,\n 'queryResult'\n >\n return columnModels ? { ...result, columnModels } : result\n },\n }\n\n return {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n }\n}\n\n/**\n * Returns a stable callback that fetches autocomplete suggestions for a search input\n * using the synchronous `POST /search/autocomplete` endpoint.\n *\n * The query is built from the current `searchIndexId` and `autocompleteFieldName`:\n * - `searchQuery.queryText` is set to the user-entered search text\n * - `searchQuery.queryFields` is set to `[autocompleteFieldName]` so the server\n * only returns values for that single field\n *\n * When `autocompleteFieldName` is undefined, the returned callback immediately returns `[]`.\n */\nexport function useGetSuggestionsForSearchIndex(\n searchIndexId: string,\n autocompleteFieldName: string | undefined,\n): (searchText: string) => Promise<string[]> {\n const { synapseClient } = useSynapseContext()\n\n return useCallback(\n async (searchText: string): Promise<string[]> => {\n if (!autocompleteFieldName) return []\n const trimmed = searchText.trim()\n if (!trimmed) return []\n const results =\n await synapseClient.searchManagementServicesClient.postRepoV1SearchAutocomplete(\n {\n searchIndexQuery: {\n concreteType:\n 'org.sagebionetworks.repo.model.search.table.SearchIndexQuery' as const,\n searchIndexId,\n searchQuery: {\n queryText: trimmed,\n queryFields: [autocompleteFieldName],\n returnFields: [autocompleteFieldName],\n },\n },\n },\n )\n const suggestions: string[] = []\n for (const hit of results.hits ?? []) {\n for (const field of hit.fields ?? []) {\n if (field.value) {\n suggestions.push(field.value)\n }\n }\n }\n return suggestions\n },\n [synapseClient, searchIndexId, autocompleteFieldName],\n )\n}\n\n/**\n * Returns TanStack Query options that call the SearchQueryServicesApi (instead of the\n * standard Table Query API) but return data in the same QueryResultBundle format, allowing\n * all existing subcomponents (FacetFilterControls, RowSetView, etc.) to work unchanged.\n */\nexport function useSearchQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n searchIndexId: string,\n synapseId?: string,\n): SearchTableQueryUseQueryOptions {\n const { keyFactory, accessToken } = useSynapseContext()\n\n const { data: entityBundle } = useGetEntityBundle(synapseId, undefined, {\n includeTableBundle: true,\n })\n const columnModels = entityBundle?.tableBundle?.columnModels\n\n return useMemo(\n () =>\n getSearchQueryUseQueryOptions(\n queryBundleRequest,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ),\n [keyFactory, accessToken, queryBundleRequest, searchIndexId, columnModels],\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SearchQueryUseQueryOptions.js","names":[],"sources":["../../../src/components/SearchQueryWrapper/SearchQueryUseQueryOptions.ts"],"sourcesContent":["import * as SynapseClient from '@/synapse-client/SynapseClient'\nimport { tableQueryUseQueryDefaults } from '@/synapse-queries'\nimport { useGetEntityBundle } from '@/synapse-queries/entity/useEntityBundle'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n AsynchronousJobStatus,\n ColumnModel,\n FACET_COLUMN_RANGE_REQUEST_CONCRETE_TYPE_VALUE,\n FacetColumnRangeRequest,\n FacetColumnResultRange,\n FACET_COLUMN_VALUES_REQUEST_CONCRETE_TYPE_VALUE,\n FacetColumnValuesRequest,\n QueryBundleRequest,\n QueryResultBundle,\n RowSet,\n SortItem,\n TEXT_MATCHES_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n TextMatchesQueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport type {\n FacetRequest,\n KeyValues,\n SearchIndexQuery,\n SearchKeyRange,\n SearchQueryResults,\n SearchSearchQuery,\n SearchSortField,\n SynapseClientError,\n} from '@sage-bionetworks/synapse-client'\nimport {\n FacetRequestSortDirectionEnum as FacetRequestSortDirectionEnumValues,\n FacetRequestSortFieldEnum as FacetRequestSortFieldEnumValues,\n} from '@sage-bionetworks/synapse-client'\nimport {\n InfiniteData,\n QueryKey,\n UseInfiniteQueryOptions,\n UseSuspenseQueryOptions,\n} from '@tanstack/react-query'\nimport { omit } from 'lodash-es'\nimport dayjs from 'dayjs'\nimport { useCallback, useMemo } from 'react'\nimport { KeyFactory } from '@/synapse-queries/KeyFactory'\n\n/**\n * TanStack Query options for the SearchQueryServicesApi, mirroring TableQueryUseQueryOptions\n * but parameterised over SearchIndexQuery rather than QueryBundleRequest. This eliminates\n * `as unknown as` casts inside the implementation. A single cast to TableQueryUseQueryOptions\n * is still required at the boundary where SearchQueryWrapper assigns these into QueryContextType.\n */\nexport type SearchTableQueryUseQueryOptions = {\n rowDataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n RowSet | undefined\n >\n rowDataInfiniteQueryOptions: UseInfiniteQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n InfiniteData<AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>>,\n QueryKey,\n string | number | undefined\n >\n queryMetadataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n Omit<QueryResultBundle, 'queryResult'>\n >\n}\n\n/**\n * Converts a QueryBundleRequest (used internally for state management) into a SearchIndexQuery\n * that can be sent to the SearchQueryServicesApi.\n *\n * Mapping:\n * - columnModels (facetType defined) → facetRequests (columns to aggregate as facets, with optional sort config)\n * - query.selectedFacets (enumeration) → termsFilters (IN-clause filters)\n * - query.selectedFacets (range) → rangeFilters (range filters)\n * - query.sort → sort (SortItem { column, direction } → SearchSortField { columnName, direction })\n * - query.limit → limit\n * - query.offset → offset\n * - partMask → dropped (SearchIndexQuery has no bitmask concept)\n */\nexport function toSearchIndexQuery(\n queryBundleRequest: QueryBundleRequest,\n searchIndexId: string,\n columnModels?: ColumnModel[],\n): SearchIndexQuery {\n // Build facetRequests from ColumnModels that have a facetType of 'enumeration'.\n // Range columns are excluded: the Search API's FacetRequest only supports terms aggregations\n // and cannot produce the min/max stats needed for FacetColumnResultRange.\n const facetRequests: FacetRequest[] | undefined = columnModels\n ?.filter(cm => cm.facetType === 'enumeration')\n .map(cm => {\n const facetReq: FacetRequest = { columnName: cm.name, maxValueCount: 100 }\n if (cm.facetSortConfig) {\n // Map FacetColumnSortProperty ('FREQUENCY'|'VALUE') → FacetRequestSortFieldEnum ('COUNT'|'KEY')\n if (cm.facetSortConfig.property != null) {\n facetReq.sortField =\n cm.facetSortConfig.property === 'VALUE'\n ? FacetRequestSortFieldEnumValues.KEY\n : FacetRequestSortFieldEnumValues.COUNT\n }\n if (cm.facetSortConfig.direction != null) {\n facetReq.sortDirection =\n cm.facetSortConfig.direction === 'ASC'\n ? FacetRequestSortDirectionEnumValues.ASC\n : FacetRequestSortDirectionEnumValues.DESC\n }\n }\n return facetReq\n })\n\n // Build termsFilters from enumeration selectedFacets\n const termsFilters: KeyValues[] | undefined =\n queryBundleRequest.query.selectedFacets\n ?.filter(\n (f): f is FacetColumnValuesRequest =>\n f.concreteType === FACET_COLUMN_VALUES_REQUEST_CONCRETE_TYPE_VALUE,\n )\n .map(f => ({ key: f.columnName, values: f.facetValues }))\n\n // Build rangeFilters from range selectedFacets.\n // DATE columns: the Range UI component emits formatted dates (\"YYYY-MM-DD\") but the\n // Search API (OpenSearch) expects unix millisecond timestamps. Convert here.\n const rangeFilters: SearchKeyRange[] | undefined =\n queryBundleRequest.query.selectedFacets\n ?.filter(\n (f): f is FacetColumnRangeRequest =>\n f.concreteType === FACET_COLUMN_RANGE_REQUEST_CONCRETE_TYPE_VALUE,\n )\n .map(f => {\n const columnType = columnModels?.find(\n cm => cm.name === f.columnName,\n )?.columnType\n const toApiValue = (v: string | undefined): string | undefined => {\n if (!v || columnType !== 'DATE') return v\n // Convert \"YYYY-MM-DD\" → unix ms; leave already-numeric values untouched\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) {\n return String(dayjs(v).valueOf())\n }\n return v\n }\n return {\n key: f.columnName,\n min: toApiValue(f.min),\n max: toApiValue(f.max),\n }\n })\n\n // Extract queryText by concatenating all TextMatchesQueryFilter searchExpression values\n const textMatchesExpressions = queryBundleRequest.query.additionalFilters\n ?.filter(\n (f): f is TextMatchesQueryFilter =>\n f.concreteType === TEXT_MATCHES_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n )\n .map(f => f.searchExpression)\n .filter((expr): expr is string => expr != null && expr.length > 0)\n const queryText =\n textMatchesExpressions && textMatchesExpressions.length > 0\n ? textMatchesExpressions.join(' ')\n : undefined\n\n // Map SortItem[] (column + direction) → SearchSortField[] (columnName + direction),\n // filtering out entries with no direction (which mean \"remove sort\").\n const sort: SearchSortField[] | undefined = queryBundleRequest.query.sort\n ?.filter(\n (s): s is SortItem & { direction: 'ASC' | 'DESC' } =>\n s.direction === 'ASC' || s.direction === 'DESC',\n )\n .map(s => ({ columnName: s.column, direction: s.direction }))\n\n const searchQuery: SearchSearchQuery = {\n facetRequests: facetRequests?.length ? facetRequests : undefined,\n termsFilters: termsFilters?.length ? termsFilters : undefined,\n rangeFilters: rangeFilters?.length ? rangeFilters : undefined,\n queryText,\n queryType: 'MULTI_MATCH',\n fuzziness: 'AUTO',\n sort: sort?.length ? sort : undefined,\n limit: queryBundleRequest.query.limit,\n offset: queryBundleRequest.query.offset,\n }\n\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.search.table.SearchIndexQuery' as const,\n searchIndexId,\n searchQuery,\n }\n}\n\n/**\n * Converts a SearchQueryResults (the actual API response) into a QueryResultBundle\n * so that existing subcomponents (FacetFilterControls, RowSetView, etc.) work unchanged.\n *\n * Mapping:\n * - totalHits → queryCount\n * - hits → queryResult.queryResults (rows derived from hit.rowId/rowVersion/fields)\n * - facets → facets (same FacetColumnResult type)\n */\nexport function searchQueryResultsToQueryResultBundle(\n results: SearchQueryResults | undefined,\n query: SearchIndexQuery,\n columnModels?: ColumnModel[],\n): QueryResultBundle {\n if (!results) {\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResultBundle',\n }\n }\n\n // Derive column names from the server-returned selectColumns. Both the row data\n // query and the metadata query request SELECT_COLUMNS, so this is always present.\n const fieldNames: string[] =\n results.selectColumns\n ?.map(col => col.name)\n .filter((n): n is string => !!n) ?? []\n\n const headers = fieldNames.map(name => ({\n name,\n columnType:\n columnModels?.find(cm => cm.name === name)?.columnType ??\n ('STRING' as const),\n }))\n\n const rows = (results.hits ?? []).map(hit => ({\n rowId: hit.rowId,\n versionNumber: hit.rowVersion,\n values: fieldNames.map(name => {\n return hit.fields?.find(f => f.name === name)?.value ?? null\n }),\n }))\n\n const queryResult =\n headers.length > 0 || rows.length > 0\n ? {\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryResult' as const,\n queryResults: {\n concreteType:\n 'org.sagebionetworks.repo.model.table.RowSet' as const,\n tableId: query.searchIndexId ?? '',\n etag: '',\n headers,\n rows,\n },\n }\n : undefined\n\n const rawFacets = results.facets as QueryResultBundle['facets']\n\n // Synthesize FacetColumnResultRange for range-type DATE/DOUBLE/INTEGER columns. The Search API's\n // FacetRequest only produces terms aggregations and cannot return min/max stats, so these\n // entries will never appear in results.facets. columnMin/columnMax are empty strings\n // (unavailable from the server); selectedMin/selectedMax are derived from the query's\n // rangeFilters so any applied range filter is still reflected in the UI.\n // Note: for INTEGER columns the RangeSlider requires real bounds, so the UI falls back to a\n // plain Range number input when columnMin/columnMax are absent.\n const syntheticRangeFacets: FacetColumnResultRange[] = (columnModels ?? [])\n .filter(\n cm =>\n cm.facetType === 'range' &&\n (cm.columnType === 'DATE' ||\n cm.columnType === 'DOUBLE' ||\n cm.columnType === 'INTEGER') &&\n !(rawFacets ?? []).some(f => f.columnName === cm.name),\n )\n .map(cm => {\n const rangeFilter = query.searchQuery?.rangeFilters?.find(\n rf => rf.key === cm.name,\n )\n // rangeFilters carry unix ms for DATE columns (converted in toSearchIndexQuery).\n // Convert back to \"YYYY-MM-DD\" so the Range UI component can display them.\n const toDisplayValue = (v: string | undefined): string | undefined => {\n if (!v || cm.columnType !== 'DATE') return v\n if (/^\\d+$/.test(v)) {\n return dayjs(parseInt(v)).format('YYYY-MM-DD')\n }\n return v\n }\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnResultRange' as const,\n facetType: 'range' as const,\n columnName: cm.name,\n columnMin: '',\n columnMax: '',\n selectedMin: toDisplayValue(rangeFilter?.min),\n selectedMax: toDisplayValue(rangeFilter?.max),\n }\n })\n\n const allFacets: NonNullable<QueryResultBundle['facets']> = [\n ...(rawFacets ?? []),\n ...syntheticRangeFacets,\n ]\n\n // Reorder all facets to match the columnModels order so downstream components\n // (e.g. FacetFilterControls) render facets in the expected column order.\n const orderedFacets: QueryResultBundle['facets'] = columnModels\n ? [\n ...allFacets\n .filter(f => columnModels.some(cm => cm.name === f.columnName))\n .sort(\n (a, b) =>\n columnModels.findIndex(cm => cm.name === a.columnName) -\n columnModels.findIndex(cm => cm.name === b.columnName),\n ),\n ...allFacets.filter(\n f => !columnModels.some(cm => cm.name === f.columnName),\n ),\n ]\n : allFacets\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResultBundle',\n queryCount: results.totalHits,\n selectColumns: headers,\n queryResult,\n facets: orderedFacets,\n }\n}\n\nexport function getSearchQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n keyFactory: KeyFactory,\n accessToken: string | undefined,\n searchIndexId: string,\n columnModels?: ColumnModel[],\n): SearchTableQueryUseQueryOptions {\n const baseQuery: SearchIndexQuery = toSearchIndexQuery(\n queryBundleRequest,\n searchIndexId,\n columnModels,\n )\n const rowDataQuery: SearchIndexQuery = {\n ...baseQuery,\n searchQuery: {\n ...baseQuery.searchQuery,\n // Omit facetRequests from the row data query: facet aggregations are only needed\n // in the metadata query (which requests FACETS). Removing facetRequests here keeps\n // the row data query key stable while column models are loading, preventing an\n // unnecessary re-fetch (and a brief loading flash) when column models first arrive.\n facetRequests: undefined,\n },\n // Request SELECT_COLUMNS so headers are available for row rendering.\n // HITS is returned by default even when responseParts is specified.\n responseParts: new Set(['HITS', 'SELECT_COLUMNS'] as const),\n }\n const metadataQuery: SearchIndexQuery = {\n ...baseQuery,\n // Request all opt-in parts needed for the metadata response:\n // TOTAL_HITS → queryCount (drives tab count / spinner resolution)\n // SELECT_COLUMNS → column headers for the table\n // FACETS → facet aggregations for FacetFilterControls / plots\n responseParts: new Set(['TOTAL_HITS', 'SELECT_COLUMNS', 'FACETS'] as const),\n }\n\n // Convert responseParts Set → sorted array for query key building.\n // JSON.stringify(new Set([...])) === '{}', so two queries whose only difference is\n // their responseParts would hash to the same key and share a cache entry.\n // Using a sorted array gives each query a distinct, stable key.\n const toKeyShape = (query: SearchIndexQuery) => ({\n ...query,\n responseParts: query.responseParts\n ? [...query.responseParts].sort()\n : undefined,\n })\n\n // Fetches from the SearchQueryServicesApi and converts the SearchQueryResults responseBody\n // into QueryResultBundle shape. This allows all downstream shared components\n // (UseRowSet, QueryVisualizationWrapper, etc.) to access data.responseBody.*\n // using the same patterns as regular table queries (queryResult.queryResults, selectColumns, etc.).\n const fetchAndConvert = async (query: SearchIndexQuery) => {\n const asyncStatus = await SynapseClient.getSearchQueryAsyncJobResults(\n query,\n accessToken,\n )\n return {\n ...asyncStatus,\n responseBody: searchQueryResultsToQueryResultBundle(\n asyncStatus.responseBody,\n query,\n columnModels,\n ),\n }\n }\n\n // `as unknown as` is necessary because SearchIndexQuery.responseParts is a Set but\n // toKeyShape converts it to a sorted string[] for stable cache key serialisation.\n const rowDataQueryOptions: SearchTableQueryUseQueryOptions['rowDataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getSearchQueryResultWithAsyncStatusQueryKey(\n toKeyShape(rowDataQuery) as unknown as SearchIndexQuery,\n false,\n ),\n queryFn: () => fetchAndConvert(rowDataQuery),\n select: (\n data: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n ): RowSet | undefined => data.responseBody?.queryResult?.queryResults,\n }\n\n const rowDataInfiniteQueryOptions: SearchTableQueryUseQueryOptions['rowDataInfiniteQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getSearchQueryResultWithAsyncStatusQueryKey(\n toKeyShape(rowDataQuery) as unknown as SearchIndexQuery,\n true,\n ),\n initialPageParam: 0 as number | string | undefined,\n getNextPageParam: (\n lastPage: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n allPages: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>[],\n ): number | string | undefined => {\n const totalRows = lastPage.responseBody?.queryCount\n const fetchedRows = allPages.reduce(\n (acc, page) =>\n acc +\n (page.responseBody?.queryResult?.queryResults.rows?.length ?? 0),\n 0,\n )\n if (totalRows != null && fetchedRows >= totalRows) {\n return undefined\n }\n return fetchedRows\n },\n queryFn: (context: { pageParam?: number | string }) => {\n const offset =\n typeof context.pageParam === 'string'\n ? parseInt(context.pageParam)\n : (context.pageParam ?? 0)\n const requestForPage: SearchIndexQuery = {\n ...rowDataQuery,\n searchQuery: {\n ...rowDataQuery.searchQuery,\n offset,\n },\n }\n return fetchAndConvert(requestForPage)\n },\n select: (\n data: InfiniteData<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>\n >,\n ) => data,\n }\n\n const queryMetadataQueryOptions: SearchTableQueryUseQueryOptions['queryMetadataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getSearchQueryResultWithAsyncStatusQueryKey(\n toKeyShape(metadataQuery) as unknown as SearchIndexQuery,\n false,\n ),\n queryFn: () => fetchAndConvert(metadataQuery),\n select: (\n data: AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n ): Omit<QueryResultBundle, 'queryResult'> => {\n const result = omit(data.responseBody ?? {}, 'queryResult') as Omit<\n QueryResultBundle,\n 'queryResult'\n >\n return columnModels ? { ...result, columnModels } : result\n },\n }\n\n return {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n }\n}\n\n/**\n * Returns a stable callback that fetches autocomplete suggestions for a search input\n * using the synchronous `POST /search/autocomplete` endpoint.\n *\n * The query is built from the current `searchIndexId` and `autocompleteFieldName`:\n * - `searchQuery.queryText` is set to the user-entered search text\n * - `searchQuery.queryFields` is set to `[autocompleteFieldName]` so the server\n * only returns values for that single field\n *\n * When `autocompleteFieldName` is undefined, the returned callback immediately returns `[]`.\n */\nexport function useGetSuggestionsForSearchIndex(\n searchIndexId: string,\n autocompleteFieldName: string | undefined,\n): (searchText: string) => Promise<string[]> {\n const { synapseClient } = useSynapseContext()\n\n return useCallback(\n async (searchText: string): Promise<string[]> => {\n if (!autocompleteFieldName) return []\n const trimmed = searchText.trim()\n if (!trimmed) return []\n const results =\n await synapseClient.searchManagementServicesClient.postRepoV1SearchAutocomplete(\n {\n searchIndexQuery: {\n concreteType:\n 'org.sagebionetworks.repo.model.search.table.SearchIndexQuery' as const,\n searchIndexId,\n searchQuery: {\n queryText: trimmed,\n queryFields: [autocompleteFieldName],\n returnFields: [autocompleteFieldName],\n },\n },\n },\n )\n const suggestions: string[] = []\n for (const hit of results.hits ?? []) {\n for (const field of hit.fields ?? []) {\n if (field.value) {\n suggestions.push(field.value)\n }\n }\n }\n return suggestions\n },\n [synapseClient, searchIndexId, autocompleteFieldName],\n )\n}\n\n/**\n * Returns TanStack Query options that call the SearchQueryServicesApi (instead of the\n * standard Table Query API) but return data in the same QueryResultBundle format, allowing\n * all existing subcomponents (FacetFilterControls, RowSetView, etc.) to work unchanged.\n */\nexport function useSearchQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n searchIndexId: string,\n synapseId?: string,\n): SearchTableQueryUseQueryOptions {\n const { keyFactory, accessToken } = useSynapseContext()\n\n const { data: entityBundle } = useGetEntityBundle(synapseId, undefined, {\n includeTableBundle: true,\n })\n const columnModels = entityBundle?.tableBundle?.columnModels\n\n return useMemo(\n () =>\n getSearchQueryUseQueryOptions(\n queryBundleRequest,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ),\n [keyFactory, accessToken, queryBundleRequest, searchIndexId, columnModels],\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQueryWrapper.js","names":[],"sources":["../../../src/components/SearchQueryWrapper/SearchQueryWrapper.tsx"],"sourcesContent":["import { hasResettableFilters as hasResettableFiltersUtil } from '@/utils/functions/queryUtils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions/SqlFunctions'\nimport useImmutableTableQuery from '@/utils/hooks/useImmutableTableQuery/useImmutableTableQuery'\nimport { goToPage as transformQueryToGoToPage } from '@/utils/hooks/useImmutableTableQuery/TableQueryReducerActions'\nimport {\n AsynchronousJobStatus,\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport { Provider } from 'jotai'\nimport {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport {\n QueryContextProvider,\n QueryContextType,\n useQueryContext,\n} from '../QueryContext/QueryContext'\nimport {\n getSearchQueryUseQueryOptions,\n useSearchQueryUseQueryOptions,\n} from './SearchQueryUseQueryOptions'\nimport { TableQueryUseQueryOptions } from '../QueryWrapper/TableQueryUseQueryOptions'\nimport useHasFacetedSelectColumn from '../QueryWrapper/useHasFacetedSelectColumn'\nimport { SessionInitializedGuard } from '@/utils/AppUtils/session/SessionInitializedGuard'\nimport { useGetEntity, useGetEntityBundle } from '@/synapse-queries'\nimport type {\n SearchIndexQuery,\n SynapseClientError,\n} from '@sage-bionetworks/synapse-client'\nimport { SearchIndex } from '@sage-bionetworks/synapse-client'\nimport { useQuery, UseQueryOptions } from '@tanstack/react-query'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { cloneDeep } from 'lodash-es'\n\n/**\n * The initQueryRequest used internally within SearchQueryWrapper. It uses a synthetic entity ID\n * and SQL so we can reuse useImmutableTableQuery for facet/pagination state management, even though\n * the actual data is fetched from the SearchQueryServicesApi (not a table entity).\n */\nexport const SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID = 'search'\nexport const SEARCH_QUERY_WRAPPER_SYNTHETIC_SQL = `SELECT * FROM ${SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID}`\n\nexport type SearchQueryWrapperProps = PropsWithChildren<{\n /**\n * The ID of the SearchIndex entity to query.\n */\n searchIndexId: string\n /**\n * The initial query request. Only `query.selectedFacets`, `query.additionalFilters`,\n * `query.limit`, and `query.offset` are used; the `entityId` and `sql` fields are\n * overridden with synthetic values. The `partMask` controls which parts of the response\n * bundle to request.\n */\n initQueryRequest: {\n concreteType?: QueryBundleRequest['concreteType']\n partMask?: QueryBundleRequest['partMask']\n query?: Partial<QueryBundleRequest['query']>\n }\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, it will be called whenever the query result bundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n isInfinite?: boolean\n /** Whether the URL should update when the query is modified (deep linking). */\n shouldDeepLink?: boolean\n}>\n\n/**\n * Internal component that reads the current query metadata from QueryContext and fires\n * onQueryResultBundleChange whenever the data changes. Must be rendered as a child of\n * QueryContextProvider (i.e. inside SearchQueryWrapper).\n */\nfunction SearchQueryResultBundleChangeNotifier({\n onQueryResultBundleChange,\n}: {\n onQueryResultBundleChange: (json: string) => void\n}) {\n const { queryMetadataQueryOptions } = useQueryContext()\n // queryMetadataQueryOptions is UseSuspenseQueryOptions; cast to UseQueryOptions so we can use\n // regular (non-suspense) `useQuery` here — the same cache key is shared, so no extra request is made.\n const queryOpts = queryMetadataQueryOptions as UseQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n Omit<QueryResultBundle, 'queryResult'>\n >\n const { data } = useQuery(queryOpts)\n // Use a ref so we always call the latest callback without including it in the\n // effect dependency array. Including a frequently-recreated callback in deps\n // causes the effect to re-fire on every render, creating an infinite loop when\n // the parent updates state inside the callback.\n const onQueryResultBundleChangeRef = useRef(onQueryResultBundleChange)\n onQueryResultBundleChangeRef.current = onQueryResultBundleChange\n useEffect(() => {\n if (data) {\n onQueryResultBundleChangeRef.current(JSON.stringify(data))\n }\n }, [data])\n return null\n}\n\nfunction SearchQueryWrapperInternal(props: SearchQueryWrapperProps) {\n return (\n <SessionInitializedGuard>\n <SearchQueryWrapperInternalWithSession {...props} />\n </SessionInitializedGuard>\n )\n}\n\nfunction SearchQueryWrapperInternalWithSession(props: SearchQueryWrapperProps) {\n const {\n initQueryRequest: initQueryRequestFromProps,\n onQueryChange,\n onQueryResultBundleChange,\n isInfinite = false,\n searchIndexId,\n shouldDeepLink = false,\n } = props\n\n const { keyFactory, accessToken } = useSynapseContext()\n\n const { data: searchIndexEntityData } = useGetEntity(\n searchIndexId,\n undefined,\n {\n throwOnError: true,\n },\n )\n const searchIndexEntity = searchIndexEntityData as SearchIndex | undefined\n\n const synapseId = searchIndexEntity?.definingSQL\n ? parseEntityIdFromSqlStatement(searchIndexEntity.definingSQL)\n : undefined\n\n const { data: entityBundle } = useGetEntityBundle(\n synapseId,\n undefined,\n { includeTableBundle: true },\n { throwOnError: true },\n )\n const columnModels = entityBundle?.tableBundle?.columnModels\n\n // Build a full synthetic QueryBundleRequest so we can reuse useImmutableTableQuery.\n // The entityId and sql are placeholders; only selectedFacets, limit, offset, and partMask\n // are passed through to the actual SearchQueryServicesApi call.\n const initQueryRequest = useDeepCompareMemoize({\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryBundleRequest' as const,\n entityId: SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID,\n partMask: initQueryRequestFromProps.partMask ?? 0,\n query: {\n sql: SEARCH_QUERY_WRAPPER_SYNTHETIC_SQL,\n selectedFacets: initQueryRequestFromProps.query?.selectedFacets,\n additionalFilters: initQueryRequestFromProps.query?.additionalFilters,\n limit: initQueryRequestFromProps.query?.limit,\n offset: initQueryRequestFromProps.query?.offset,\n },\n }) as QueryBundleRequest\n\n const immutableTableQueryResult = useImmutableTableQuery({\n initQueryRequest,\n onQueryChange,\n shouldDeepLink,\n })\n\n const {\n getInitQueryRequest,\n getCurrentQueryRequest,\n setQuery,\n resetQuery,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n removeQueryFilter,\n removeValueFromQueryFilter,\n nextQueryRequest,\n currentQueryRequest,\n addValueToSelectedFacet,\n setRangeFacetValue,\n resetDebounceTimer,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n } = immutableTableQueryResult\n\n // SearchTableQueryUseQueryOptions uses SearchIndexQuery generics rather than QueryBundleRequest.\n // QueryContextType (and all downstream consumers) expect TableQueryUseQueryOptions. The runtime\n // shapes are identical — only the TypeScript generics differ — so a single cast is made here at\n // the architectural boundary rather than scattering `as unknown as` across the implementation.\n const {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n } = useSearchQueryUseQueryOptions(\n currentQueryRequest as QueryBundleRequest,\n searchIndexId,\n synapseId,\n ) as unknown as TableQueryUseQueryOptions\n\n const hasFacetedSelectColumn = useHasFacetedSelectColumn(\n queryMetadataQueryOptions,\n )\n\n const hasResettableFilters = useMemo(() => {\n const request = getCurrentQueryRequest()\n return hasResettableFiltersUtil(request.query, undefined)\n }, [getCurrentQueryRequest])\n\n // Provides page-specific row query options using the search API, so components like\n // usePrefetchTableRows don't accidentally call the standard table query API with the\n // synthetic entity ID.\n const getRowDataQueryOptionsForPage = useCallback(\n (pageNumber: number) => {\n const queryWithUpdatedPage = transformQueryToGoToPage(\n { type: 'goToPage', pageNumber },\n cloneDeep(getCurrentQueryRequest()),\n )\n return (\n getSearchQueryUseQueryOptions(\n queryWithUpdatedPage,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ) as unknown as TableQueryUseQueryOptions\n ).rowDataQueryOptions\n },\n [\n getCurrentQueryRequest,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ],\n )\n\n // TODO: useDeepCompareMemoize cannot meaningfully compare functions — it falls back to\n // reference equality for them. The callbacks below (getCurrentQueryRequest, removeSelectedFacet,\n // getRowDataQueryOptionsForPage, etc.) behave identically to a shallow useMemo dep.\n // The correct fix is to deep-compare only serializable data fields and use a plain useMemo for\n // the full context object. QueryWrapper.tsx has the same issue; fix both together in a follow-up.\n const context: QueryContextType = useDeepCompareMemoize({\n isInfinite,\n entityId: synapseId,\n versionNumber: undefined,\n nextQueryRequest,\n currentQueryRequest,\n getCurrentQueryRequest,\n getInitQueryRequest,\n executeQueryRequest: setQuery,\n hasFacetedSelectColumn,\n hasResettableFilters,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n resetQuery,\n removeQueryFilter,\n removeValueFromQueryFilter,\n onViewSharingSettingsClicked: undefined,\n addValueToSelectedFacet,\n combineRangeFacetConfig: undefined,\n setRangeFacetValue,\n resetDebounceTimer,\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n lockedColumn: undefined,\n fileIdColumnName: undefined,\n fileVersionColumnName: undefined,\n fileNameColumnName: undefined,\n getRowDataQueryOptionsForPage,\n })\n\n return (\n <QueryContextProvider queryContext={context}>\n {onQueryResultBundleChange && (\n <SearchQueryResultBundleChangeNotifier\n onQueryResultBundleChange={onQueryResultBundleChange}\n />\n )}\n {props.children}\n </QueryContextProvider>\n )\n}\n\n/**\n * Provides a QueryContext populated by results from the SearchQueryServicesApi rather than\n * the standard Table Query Services. All subcomponents that consume QueryContext can be\n * used unchanged within a SearchQueryWrapper tree.\n */\nexport function SearchQueryWrapper(props: SearchQueryWrapperProps) {\n return (\n <Provider>\n <SearchQueryWrapperInternal {...props} />\n </Provider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA6CA,IAAa,IAA2C,UAC3C,IAAqC,iBAAiB;AAgCnE,SAAS,EAAsC,EAC7C,gCAGC;CACD,IAAM,EAAE,iCAA8B,GAAiB,EAQjD,EAAE,YAAS,EAAS,EAAU,EAK9B,IAA+B,EAAO,EAA0B;AAOtE,QANA,EAA6B,UAAU,GACvC,QAAgB;AACd,EAAI,KACF,EAA6B,QAAQ,KAAK,UAAU,EAAK,CAAC;IAE3D,CAAC,EAAK,CAAC,EACH;;AAGT,SAAS,EAA2B,GAAgC;AAClE,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAuC,GAAI,GAAS,CAAA,EAC5B,CAAA;;AAI9B,SAAS,EAAsC,GAAgC;CAC7E,IAAM,EACJ,kBAAkB,GAClB,kBACA,8BACA,gBAAa,IACb,kBACA,oBAAiB,OACf,GAEE,EAAE,eAAY,mBAAgB,GAAmB,EAEjD,EAAE,MAAM,MAA0B,EACtC,GACA,KAAA,GACA,EACE,cAAc,IACf,CACF,EACK,IAAoB,GAEpB,IAAY,GAAmB,cACjC,EAA8B,EAAkB,YAAY,GAC5D,KAAA,GAEE,EAAE,MAAM,MAAiB,EAC7B,GACA,KAAA,GACA,EAAE,oBAAoB,IAAM,EAC5B,EAAE,cAAc,IAAM,CACvB,EACK,IAAe,GAAc,aAAa,cAyB1C,EACJ,wBACA,2BACA,aACA,eACA,wBACA,iCACA,sBACA,+BACA,qBACA,wBACA,4BACA,uBACA,uBACA,gBACA,UAAA,GACA,aACA,mBAvBgC,EAAuB;EACvD,kBAfuB,EAAsB;GAC7C,cACE;GACF,UAAU;GACV,UAAU,EAA0B,YAAY;GAChD,OAAO;IACL,KAAK;IACL,gBAAgB,EAA0B,OAAO;IACjD,mBAAmB,EAA0B,OAAO;IACpD,OAAO,EAA0B,OAAO;IACxC,QAAQ,EAA0B,OAAO;IAC1C;GACF,CAGC;EACA;EACA;EACD,CAoBG,EAME,EACJ,wBACA,gCACA,iCACE,EACF,GACA,GACA,EACD;AA+ED,QACE,kBAAC,GAAD;EAAsB,cApCU,EAAsB;GACtD;GACA,UAAU;GACV,eAAe,KAAA;GACf;GACA;GACA;GACA;GACA,qBAAqB;GACrB,wBAnD6B,EAC7B,EAkDA;GACA,sBAhD2B,QAEpB,EADS,GACgB,CAAQ,OAAO,KAAA,EAAU,EACxD,CAAC,EAAuB,CA6CzB;GACA;GACA;GACA;GACA;GACA;GACA,8BAA8B,KAAA;GAC9B;GACA,yBAAyB,KAAA;GACzB;GACA;GACA;GACA;GACA;GACA;GACA,UAAA;GACA;GACA;GACA,cAAc,KAAA;GACd,kBAAkB,KAAA;GAClB,uBAAuB,KAAA;GACvB,oBAAoB,KAAA;GACpB,+BA9DoC,GACnC,MAMG,EAL2B,EAC3B;IAAE,MAAM;IAAY;IAAY,EAChC,EAAU,GAAwB,CAAC,CAIjC,EACA,GACA,GACA,GACA,EACD,CACD,qBAEJ;IACE;IACA;IACA;IACA;IACA;IACD,CAwCD;GACD,CAGqC;YAApC,CACG,KACC,kBAAC,GAAD,EAC6B,8BAC3B,CAAA,EAEH,EAAM,SACc;;;AAS3B,SAAgB,EAAmB,GAAgC;AACjE,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAA4B,GAAI,GAAS,CAAA,EAChC,CAAA"}
1
+ {"version":3,"file":"SearchQueryWrapper.js","names":[],"sources":["../../../src/components/SearchQueryWrapper/SearchQueryWrapper.tsx"],"sourcesContent":["import { hasResettableFilters as hasResettableFiltersUtil } from '@/utils/functions/queryUtils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions/SqlFunctions'\nimport useImmutableTableQuery from '@/utils/hooks/useImmutableTableQuery/useImmutableTableQuery'\nimport { goToPage as transformQueryToGoToPage } from '@/utils/hooks/useImmutableTableQuery/TableQueryReducerActions'\nimport {\n AsynchronousJobStatus,\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport { Provider } from 'jotai'\nimport {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport {\n QueryContextProvider,\n QueryContextType,\n useQueryContext,\n} from '../QueryContext/QueryContext'\nimport {\n getSearchQueryUseQueryOptions,\n useSearchQueryUseQueryOptions,\n} from './SearchQueryUseQueryOptions'\nimport { TableQueryUseQueryOptions } from '../QueryWrapper/TableQueryUseQueryOptions'\nimport useHasFacetedSelectColumn from '../QueryWrapper/useHasFacetedSelectColumn'\nimport { SessionInitializedGuard } from '@/utils/AppUtils/session/SessionInitializedGuard'\nimport { useGetEntity, useGetEntityBundle } from '@/synapse-queries'\nimport type {\n SearchIndexQuery,\n SynapseClientError,\n} from '@sage-bionetworks/synapse-client'\nimport { SearchIndex } from '@sage-bionetworks/synapse-client'\nimport { useQuery, UseQueryOptions } from '@tanstack/react-query'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { cloneDeep } from 'lodash-es'\n\n/**\n * The initQueryRequest used internally within SearchQueryWrapper. It uses a synthetic entity ID\n * and SQL so we can reuse useImmutableTableQuery for facet/pagination state management, even though\n * the actual data is fetched from the SearchQueryServicesApi (not a table entity).\n */\nexport const SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID = 'search'\nexport const SEARCH_QUERY_WRAPPER_SYNTHETIC_SQL = `SELECT * FROM ${SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID}`\n\nexport type SearchQueryWrapperProps = PropsWithChildren<{\n /**\n * The ID of the SearchIndex entity to query.\n */\n searchIndexId: string\n /**\n * The initial query request. Only `query.selectedFacets`, `query.additionalFilters`,\n * `query.limit`, and `query.offset` are used; the `entityId` and `sql` fields are\n * overridden with synthetic values. The `partMask` controls which parts of the response\n * bundle to request.\n */\n initQueryRequest: {\n concreteType?: QueryBundleRequest['concreteType']\n partMask?: QueryBundleRequest['partMask']\n query?: Partial<QueryBundleRequest['query']>\n }\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, it will be called whenever the query result bundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n isInfinite?: boolean\n /** Whether the URL should update when the query is modified (deep linking). */\n shouldDeepLink?: boolean\n}>\n\n/**\n * Internal component that reads the current query metadata from QueryContext and fires\n * onQueryResultBundleChange whenever the data changes. Must be rendered as a child of\n * QueryContextProvider (i.e. inside SearchQueryWrapper).\n */\nfunction SearchQueryResultBundleChangeNotifier({\n onQueryResultBundleChange,\n}: {\n onQueryResultBundleChange: (json: string) => void\n}) {\n const { queryMetadataQueryOptions } = useQueryContext()\n // queryMetadataQueryOptions is UseSuspenseQueryOptions; cast to UseQueryOptions so we can use\n // regular (non-suspense) `useQuery` here — the same cache key is shared, so no extra request is made.\n const queryOpts = queryMetadataQueryOptions as UseQueryOptions<\n AsynchronousJobStatus<SearchIndexQuery, QueryResultBundle>,\n SynapseClientError,\n Omit<QueryResultBundle, 'queryResult'>\n >\n const { data } = useQuery(queryOpts)\n // Use a ref so we always call the latest callback without including it in the\n // effect dependency array. Including a frequently-recreated callback in deps\n // causes the effect to re-fire on every render, creating an infinite loop when\n // the parent updates state inside the callback.\n const onQueryResultBundleChangeRef = useRef(onQueryResultBundleChange)\n onQueryResultBundleChangeRef.current = onQueryResultBundleChange\n useEffect(() => {\n if (data) {\n onQueryResultBundleChangeRef.current(JSON.stringify(data))\n }\n }, [data])\n return null\n}\n\nfunction SearchQueryWrapperInternal(props: SearchQueryWrapperProps) {\n return (\n <SessionInitializedGuard>\n <SearchQueryWrapperInternalWithSession {...props} />\n </SessionInitializedGuard>\n )\n}\n\nfunction SearchQueryWrapperInternalWithSession(props: SearchQueryWrapperProps) {\n const {\n initQueryRequest: initQueryRequestFromProps,\n onQueryChange,\n onQueryResultBundleChange,\n isInfinite = false,\n searchIndexId,\n shouldDeepLink = false,\n } = props\n\n const { keyFactory, accessToken } = useSynapseContext()\n\n const { data: searchIndexEntityData } = useGetEntity(\n searchIndexId,\n undefined,\n {\n throwOnError: true,\n },\n )\n const searchIndexEntity = searchIndexEntityData as SearchIndex | undefined\n\n const synapseId = searchIndexEntity?.definingSQL\n ? parseEntityIdFromSqlStatement(searchIndexEntity.definingSQL)\n : undefined\n\n const { data: entityBundle } = useGetEntityBundle(\n synapseId,\n undefined,\n { includeTableBundle: true },\n { throwOnError: true },\n )\n const columnModels = entityBundle?.tableBundle?.columnModels\n\n // Build a full synthetic QueryBundleRequest so we can reuse useImmutableTableQuery.\n // The entityId and sql are placeholders; only selectedFacets, limit, offset, and partMask\n // are passed through to the actual SearchQueryServicesApi call.\n const initQueryRequest = useDeepCompareMemoize({\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryBundleRequest' as const,\n entityId: SEARCH_QUERY_WRAPPER_SYNTHETIC_ENTITY_ID,\n partMask: initQueryRequestFromProps.partMask ?? 0,\n query: {\n sql: SEARCH_QUERY_WRAPPER_SYNTHETIC_SQL,\n selectedFacets: initQueryRequestFromProps.query?.selectedFacets,\n additionalFilters: initQueryRequestFromProps.query?.additionalFilters,\n limit: initQueryRequestFromProps.query?.limit,\n offset: initQueryRequestFromProps.query?.offset,\n },\n }) as QueryBundleRequest\n\n const immutableTableQueryResult = useImmutableTableQuery({\n initQueryRequest,\n onQueryChange,\n shouldDeepLink,\n })\n\n const {\n getInitQueryRequest,\n getCurrentQueryRequest,\n setQuery,\n resetQuery,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n removeQueryFilter,\n removeValueFromQueryFilter,\n nextQueryRequest,\n currentQueryRequest,\n addValueToSelectedFacet,\n setRangeFacetValue,\n resetDebounceTimer,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n } = immutableTableQueryResult\n\n // SearchTableQueryUseQueryOptions uses SearchIndexQuery generics rather than QueryBundleRequest.\n // QueryContextType (and all downstream consumers) expect TableQueryUseQueryOptions. The runtime\n // shapes are identical — only the TypeScript generics differ — so a single cast is made here at\n // the architectural boundary rather than scattering `as unknown as` across the implementation.\n const {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n } = useSearchQueryUseQueryOptions(\n currentQueryRequest as QueryBundleRequest,\n searchIndexId,\n synapseId,\n ) as unknown as TableQueryUseQueryOptions\n\n const hasFacetedSelectColumn = useHasFacetedSelectColumn(\n queryMetadataQueryOptions,\n )\n\n const hasResettableFilters = useMemo(() => {\n const request = getCurrentQueryRequest()\n return hasResettableFiltersUtil(request.query, undefined)\n }, [getCurrentQueryRequest])\n\n // Provides page-specific row query options using the search API, so components like\n // usePrefetchTableRows don't accidentally call the standard table query API with the\n // synthetic entity ID.\n const getRowDataQueryOptionsForPage = useCallback(\n (pageNumber: number) => {\n const queryWithUpdatedPage = transformQueryToGoToPage(\n { type: 'goToPage', pageNumber },\n cloneDeep(getCurrentQueryRequest()),\n )\n return (\n getSearchQueryUseQueryOptions(\n queryWithUpdatedPage,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ) as unknown as TableQueryUseQueryOptions\n ).rowDataQueryOptions\n },\n [\n getCurrentQueryRequest,\n keyFactory,\n accessToken,\n searchIndexId,\n columnModels,\n ],\n )\n\n // TODO: useDeepCompareMemoize cannot meaningfully compare functions — it falls back to\n // reference equality for them. The callbacks below (getCurrentQueryRequest, removeSelectedFacet,\n // getRowDataQueryOptionsForPage, etc.) behave identically to a shallow useMemo dep.\n // The correct fix is to deep-compare only serializable data fields and use a plain useMemo for\n // the full context object. QueryWrapper.tsx has the same issue; fix both together in a follow-up.\n const context: QueryContextType = useDeepCompareMemoize({\n isInfinite,\n entityId: synapseId,\n versionNumber: undefined,\n nextQueryRequest,\n currentQueryRequest,\n getCurrentQueryRequest,\n getInitQueryRequest,\n executeQueryRequest: setQuery,\n hasFacetedSelectColumn,\n hasResettableFilters,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n resetQuery,\n removeQueryFilter,\n removeValueFromQueryFilter,\n onViewSharingSettingsClicked: undefined,\n addValueToSelectedFacet,\n combineRangeFacetConfig: undefined,\n setRangeFacetValue,\n resetDebounceTimer,\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n lockedColumn: undefined,\n fileIdColumnName: undefined,\n fileVersionColumnName: undefined,\n fileNameColumnName: undefined,\n getRowDataQueryOptionsForPage,\n })\n\n return (\n <QueryContextProvider queryContext={context}>\n {onQueryResultBundleChange && (\n <SearchQueryResultBundleChangeNotifier\n onQueryResultBundleChange={onQueryResultBundleChange}\n />\n )}\n {props.children}\n </QueryContextProvider>\n )\n}\n\n/**\n * Provides a QueryContext populated by results from the SearchQueryServicesApi rather than\n * the standard Table Query Services. All subcomponents that consume QueryContext can be\n * used unchanged within a SearchQueryWrapper tree.\n */\nexport function SearchQueryWrapper(props: SearchQueryWrapperProps) {\n return (\n <Provider>\n <SearchQueryWrapperInternal {...props} />\n </Provider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA6CA,IAAa,IAA2C,UAC3C,IAAqC,iBAAiB;AAgCnE,SAAS,EAAsC,EAC7C,gCAGC;CACD,IAAM,EAAE,iCAA8B,EAAgB,GAQhD,EAAE,YAAS,EAAS,CAAS,GAK7B,IAA+B,EAAO,CAAyB;CAOrE,OANA,EAA6B,UAAU,GACvC,QAAgB;EACd,AAAI,KACF,EAA6B,QAAQ,KAAK,UAAU,CAAI,CAAC;CAE7D,GAAG,CAAC,CAAI,CAAC,GACF;AACT;AAEA,SAAS,EAA2B,GAAgC;CAClE,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAuC,GAAI,EAAQ,CAAA,EAC5B,CAAA;AAE7B;AAEA,SAAS,EAAsC,GAAgC;CAC7E,IAAM,EACJ,kBAAkB,GAClB,kBACA,8BACA,gBAAa,IACb,kBACA,oBAAiB,OACf,GAEE,EAAE,eAAY,mBAAgB,EAAkB,GAEhD,EAAE,MAAM,MAA0B,EACtC,GACA,KAAA,GACA,EACE,cAAc,GAChB,CACF,GACM,IAAoB,GAEpB,IAAY,GAAmB,cACjC,EAA8B,EAAkB,WAAW,IAC3D,KAAA,GAEE,EAAE,MAAM,MAAiB,EAC7B,GACA,KAAA,GACA,EAAE,oBAAoB,GAAK,GAC3B,EAAE,cAAc,GAAK,CACvB,GACM,IAAe,GAAc,aAAa,cAyB1C,EACJ,wBACA,2BACA,aACA,eACA,wBACA,iCACA,sBACA,+BACA,qBACA,wBACA,4BACA,uBACA,uBACA,gBACA,UAAA,GACA,aACA,mBAvBgC,EAAuB;EACvD,kBAfuB,EAAsB;GAC7C,cACE;GACF,UAAU;GACV,UAAU,EAA0B,YAAY;GAChD,OAAO;IACL,KAAK;IACL,gBAAgB,EAA0B,OAAO;IACjD,mBAAmB,EAA0B,OAAO;IACpD,OAAO,EAA0B,OAAO;IACxC,QAAQ,EAA0B,OAAO;GAC3C;EACF,CAGE;EACA;EACA;CACF,CAoBI,GAME,EACJ,wBACA,gCACA,iCACE,EACF,GACA,GACA,CACF;CA+EA,OACE,kBAAC,GAAD;EAAsB,cApCU,EAAsB;GACtD;GACA,UAAU;GACV,eAAe,KAAA;GACf;GACA;GACA;GACA;GACA,qBAAqB;GACrB,wBAnD6B,EAC7B,CAkDA;GACA,sBAhD2B,QAEpB,EADS,EACgB,EAAQ,OAAO,KAAA,CAAS,GACvD,CAAC,CAAsB,CA6CxB;GACA;GACA;GACA;GACA;GACA;GACA,8BAA8B,KAAA;GAC9B;GACA,yBAAyB,KAAA;GACzB;GACA;GACA;GACA;GACA;GACA;GACA,UAAA;GACA;GACA;GACA,cAAc,KAAA;GACd,kBAAkB,KAAA;GAClB,uBAAuB,KAAA;GACvB,oBAAoB,KAAA;GACpB,+BA9DoC,GACnC,MAMG,EAL2B,EAC3B;IAAE,MAAM;IAAY;GAAW,GAC/B,EAAU,EAAuB,CAAC,CAIhC,GACA,GACA,GACA,GACA,CACF,EACA,qBAEJ;IACE;IACA;IACA;IACA;IACA;GACF,CAwCA;EACF,CAGsC;YAApC,CACG,KACC,kBAAC,GAAD,EAC6B,6BAC5B,CAAA,GAEF,EAAM,QACa;;AAE1B;AAOA,SAAgB,EAAmB,GAAgC;CACjE,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAA4B,GAAI,EAAQ,CAAA,EAChC,CAAA;AAEd"}
@@ -24,7 +24,7 @@ type SearchQueryWrapperPlotNavOwnProps = {
24
24
  initialLimit?: number;
25
25
  hideTopLevelControls?: boolean;
26
26
  };
27
- export type SearchQueryWrapperPlotNavProps = SearchQueryWrapperPlotNavOwnProps & PlotsContainerProps & Pick<QueryVisualizationWrapperProps, 'defaultShowPlots' | 'visibleColumnCount' | 'columnAliases' | 'rgbIndex' | 'showLastUpdatedOn' | 'noContentPlaceholderType' | 'unitDescription' | 'helpConfiguration' | 'hideCopyToClipboard' | 'hideVisualizationsControl' | 'lockTextMatchesQueryFilterPill' | 'hideSearchBarControl' | 'defaultShowSearchBar'> & Pick<TopLevelControlsProps, 'name' | 'hideQueryCount'> & {
27
+ export type SearchQueryWrapperPlotNavProps = SearchQueryWrapperPlotNavOwnProps & PlotsContainerProps & Pick<QueryVisualizationWrapperProps, 'defaultShowPlots' | 'visibleColumnCount' | 'hiddenColumns' | 'columnAliases' | 'rgbIndex' | 'showLastUpdatedOn' | 'noContentPlaceholderType' | 'unitDescription' | 'helpConfiguration' | 'hideCopyToClipboard' | 'hideVisualizationsControl' | 'lockTextMatchesQueryFilterPill' | 'hideSearchBarControl' | 'defaultShowSearchBar'> & Pick<TopLevelControlsProps, 'name' | 'hideQueryCount'> & {
28
28
  /** Optional initial query parameters. Only selectedFacets, additionalFilters, limit, and offset are used. */
29
29
  initQueryRequest?: SearchQueryWrapperProps['initQueryRequest'];
30
30
  /** Called when the query result bundle changes (e.g. to report result counts to a parent). */
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQueryWrapperPlotNav.d.ts","sourceRoot":"","sources":["../../../src/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAEL,8BAA8B,EAC/B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAA;AACtF,OAAO,EAEL,uBAAuB,EACxB,MAAM,0CAA0C,CAAA;AAIjD,KAAK,iCAAiC,GAAG;IACvC,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,2HAA2H;IAC3H,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,CAAC,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAA;IAC7D,4BAA4B,CAAC,EAAE,wBAAwB,CAAC,8BAA8B,CAAC,CAAA;IACvF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAI/B,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,iCAAiC,GAC5E,mBAAmB,GACnB,IAAI,CACF,8BAA8B,EAC5B,kBAAkB,GAClB,oBAAoB,GACpB,eAAe,GACf,UAAU,GACV,mBAAmB,GACnB,0BAA0B,GAC1B,iBAAiB,GACjB,mBAAmB,GACnB,qBAAqB,GACrB,2BAA2B,GAC3B,gCAAgC,GAChC,sBAAsB,GACtB,sBAAsB,CACzB,GACD,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG;IACvD,6GAA6G;IAC7G,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;IAC9D,8FAA8F;IAC9F,yBAAyB,CAAC,EAAE,uBAAuB,CAAC,2BAA2B,CAAC,CAAA;IAChF,+EAA+E;IAC/E,cAAc,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAA;CAC3D,CAAA;AAEH;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,GAAG,MAAM,IAAI,8BAA8B,CAE3C;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,KAAK,EAAE,8BAA8B,2CAoGtC"}
1
+ {"version":3,"file":"SearchQueryWrapperPlotNav.d.ts","sourceRoot":"","sources":["../../../src/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAEL,8BAA8B,EAC/B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAA;AACtF,OAAO,EAEL,uBAAuB,EACxB,MAAM,0CAA0C,CAAA;AAIjD,KAAK,iCAAiC,GAAG;IACvC,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,2HAA2H;IAC3H,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,CAAC,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,CAAA;IAC7D,4BAA4B,CAAC,EAAE,wBAAwB,CAAC,8BAA8B,CAAC,CAAA;IACvF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAI/B,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,iCAAiC,GAC5E,mBAAmB,GACnB,IAAI,CACF,8BAA8B,EAC5B,kBAAkB,GAClB,oBAAoB,GACpB,eAAe,GACf,eAAe,GACf,UAAU,GACV,mBAAmB,GACnB,0BAA0B,GAC1B,iBAAiB,GACjB,mBAAmB,GACnB,qBAAqB,GACrB,2BAA2B,GAC3B,gCAAgC,GAChC,sBAAsB,GACtB,sBAAsB,CACzB,GACD,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG;IACvD,6GAA6G;IAC7G,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;IAC9D,8FAA8F;IAC9F,yBAAyB,CAAC,EAAE,uBAAuB,CAAC,2BAA2B,CAAC,CAAA;IAChF,+EAA+E;IAC/E,cAAc,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAA;CAC3D,CAAA;AAEH;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,GAAG,MAAM,IAAI,8BAA8B,CAE3C;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,KAAK,EAAE,8BAA8B,2CAqGtC"}
@@ -37,6 +37,7 @@ function d(u) {
37
37
  columnAliases: u.columnAliases,
38
38
  helpConfiguration: m,
39
39
  visibleColumnCount: u.visibleColumnCount,
40
+ hiddenColumns: u.hiddenColumns,
40
41
  defaultShowPlots: u.defaultShowPlots,
41
42
  hideCopyToClipboard: u.hideCopyToClipboard,
42
43
  hideSearchBarControl: u.hideSearchBarControl ?? !1,
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.tsx"],"sourcesContent":["import { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Suspense, useRef } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport {\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport { TopLevelControlsProps } from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { PlotsContainerProps } from '../widgets/facet-nav/PlotsContainer'\nimport { FacetFilterControlsProps } from '../widgets/query-filter/FacetFilterControls'\nimport {\n SearchQueryWrapper,\n SearchQueryWrapperProps,\n} from '../SearchQueryWrapper/SearchQueryWrapper'\nimport { QueryWrapperPlotNavContents } from '../QueryWrapperPlotNav/QueryWrapperPlotNav'\nimport { useGetSuggestionsForSearchIndex } from '../SearchQueryWrapper/SearchQueryUseQueryOptions'\n\ntype SearchQueryWrapperPlotNavOwnProps = {\n /** The ID of the SearchIndex entity to query. */\n searchIndexId: string\n /**\n * The name of the field to use for autocomplete suggestions.\n * When provided, the search bar will show a dropdown of suggestions as the user types,\n * populated by querying the search index with this field restricted via POST /search/autocomplete.\n */\n autocompleteFieldName?: string\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n initialLimit?: number\n hideTopLevelControls?: boolean\n // Note: hideDownload, hideSqlEditorControl are intentionally\n // excluded — they are hardcoded to true because these controls are not applicable to the\n // SearchQueryServicesApi (no file download, no SQL editing).\n}\n\nexport type SearchQueryWrapperPlotNavProps = SearchQueryWrapperPlotNavOwnProps &\n PlotsContainerProps &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'columnAliases'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideVisualizationsControl'\n | 'lockTextMatchesQueryFilterPill'\n | 'hideSearchBarControl'\n | 'defaultShowSearchBar'\n > &\n Pick<TopLevelControlsProps, 'name' | 'hideQueryCount'> & {\n /** Optional initial query parameters. Only selectedFacets, additionalFilters, limit, and offset are used. */\n initQueryRequest?: SearchQueryWrapperProps['initQueryRequest']\n /** Called when the query result bundle changes (e.g. to report result counts to a parent). */\n onQueryResultBundleChange?: SearchQueryWrapperProps['onQueryResultBundleChange']\n /** Whether the URL should update when the query is modified (deep linking). */\n shouldDeepLink?: SearchQueryWrapperProps['shouldDeepLink']\n }\n\n/**\n * Type guard that identifies a SearchQueryWrapperPlotNavProps from the union\n * `QueryWrapperPlotNavProps | SearchQueryWrapperPlotNavProps`.\n *\n * Two conditions are checked to be robust against future API changes:\n * 1. The config has `searchIndexId` (present only on SearchQueryWrapperPlotNavProps).\n * 2. The config does NOT have `sql` (always present on QueryWrapperPlotNavProps via\n * QueryOrDeprecatedSearchParams), so that if QueryWrapperPlotNavProps ever gains a\n * `searchIndexId` field the guard remains correct.\n */\nexport function isSearchQueryWrapperPlotNavProps(config: {\n searchIndexId?: unknown\n sql?: unknown\n}): config is SearchQueryWrapperPlotNavProps {\n return 'searchIndexId' in config && !('sql' in config)\n}\n\n/**\n * A component similar to QueryWrapperPlotNav that sources its data from the SearchQueryServicesApi\n * rather than the standard Synapse Table Services. Facets, table/card rendering, and plots are\n * all reused from the existing component library.\n */\nexport default function SearchQueryWrapperPlotNav(\n props: SearchQueryWrapperPlotNavProps,\n) {\n const {\n tableConfiguration,\n isInfinite = !tableConfiguration,\n unitDescription,\n helpConfiguration,\n initQueryRequest: initQueryRequestFromProps,\n onQueryResultBundleChange,\n searchIndexId,\n autocompleteFieldName,\n shouldDeepLink,\n } = props\n\n const getSuggestions = useGetSuggestionsForSearchIndex(\n searchIndexId,\n autocompleteFieldName,\n )\n\n const initQueryRequest: SearchQueryWrapperProps['initQueryRequest'] =\n useDeepCompareMemoize({\n partMask: initQueryRequestFromProps?.partMask ?? 0,\n query: {\n selectedFacets: initQueryRequestFromProps?.query?.selectedFacets,\n additionalFilters: initQueryRequestFromProps?.query?.additionalFilters,\n limit: initQueryRequestFromProps?.query?.limit ?? DEFAULT_PAGE_SIZE,\n offset: initQueryRequestFromProps?.query?.offset ?? 0,\n },\n })\n\n // Remount SearchQueryWrapper when initQueryRequest content changes.\n // useDeepCompareMemoize returns the same reference when content is equal, so reference\n // comparison is sufficient here. A counter is used rather than JSON.stringify to avoid\n // serializing the object on every render.\n const mountKeyRef = useRef(0)\n const prevInitQueryRef = useRef(initQueryRequest)\n if (prevInitQueryRef.current !== initQueryRequest) {\n mountKeyRef.current += 1\n prevInitQueryRef.current = initQueryRequest\n }\n\n return (\n <SearchQueryWrapper\n key={mountKeyRef.current}\n searchIndexId={searchIndexId}\n initQueryRequest={initQueryRequest}\n isInfinite={isInfinite}\n onQueryResultBundleChange={onQueryResultBundleChange}\n shouldDeepLink={shouldDeepLink}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n hideSearchBarControl={props.hideSearchBarControl ?? false}\n lockTextMatchesQueryFilterPill={props.lockTextMatchesQueryFilterPill}\n defaultShowSearchBar={props.defaultShowSearchBar ?? true}\n showLastUpdatedOn={props.showLastUpdatedOn}\n noContentPlaceholderType={\n props.noContentPlaceholderType ??\n NoContentPlaceholderType.INTERACTIVE\n }\n >\n <QueryWrapperPlotNavContents\n tableConfiguration={tableConfiguration}\n name={props.name}\n cardConfiguration={props.cardConfiguration}\n facetsToPlot={props.facetsToPlot}\n availableFacets={props.availableFacets}\n initialExpandedFacetControls={props.initialExpandedFacetControls}\n hideDownload={true}\n hideQueryCount={props.hideQueryCount ?? false}\n hideSqlEditorControl={true}\n hideVisualizationsControl={props.hideVisualizationsControl}\n initialLimit={props.initialLimit}\n initialPlotTypeByFacetColumnName={\n props.initialPlotTypeByFacetColumnName\n }\n hideTopLevelControls={props.hideTopLevelControls}\n isFullTextSearchEnabled={true}\n searchConfiguration={{\n ftsConfig: {\n textMatchesMode: 'NATURAL_LANGUAGE',\n minSearchQueryLength: 1,\n replaceExistingFilter: true,\n getSuggestions: autocompleteFieldName\n ? getSuggestions\n : undefined,\n },\n }}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </SearchQueryWrapper>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAiFA,SAAgB,EAAiC,GAGJ;AAC3C,QAAO,mBAAmB,KAAU,EAAE,SAAS;;AAQjD,SAAwB,EACtB,GACA;CACA,IAAM,EACJ,uBACA,gBAAa,CAAC,GACd,oBACA,sBACA,kBAAkB,GAClB,8BACA,kBACA,0BACA,sBACE,GAEE,IAAiB,EACrB,GACA,EACD,EAEK,IACJ,EAAsB;EACpB,UAAU,GAA2B,YAAY;EACjD,OAAO;GACL,gBAAgB,GAA2B,OAAO;GAClD,mBAAmB,GAA2B,OAAO;GACrD,OAAO,GAA2B,OAAO,SAAA;GACzC,QAAQ,GAA2B,OAAO,UAAU;GACrD;EACF,CAAC,EAME,IAAc,EAAO,EAAE,EACvB,IAAmB,EAAO,EAAiB;AAMjD,QALI,EAAiB,YAAY,MAC/B,EAAY,WAAW,GACvB,EAAiB,UAAU,IAI3B,kBAAC,GAAD;EAEiB;EACG;EACN;EACe;EACX;YAEhB,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,EAA6B,CAAA;aAC/C,kBAAC,GAAD;IACmB;IACjB,UAAU,EAAM;IAChB,eAAe,EAAM;IACF;IACnB,oBAAoB,EAAM;IAC1B,kBAAkB,EAAM;IACxB,qBAAqB,EAAM;IAC3B,sBAAsB,EAAM,wBAAwB;IACpD,gCAAgC,EAAM;IACtC,sBAAsB,EAAM,wBAAwB;IACpD,mBAAmB,EAAM;IACzB,0BACE,EAAM,4BACN,EAAyB;cAG3B,kBAAC,GAAD;KACsB;KACpB,MAAM,EAAM;KACZ,mBAAmB,EAAM;KACzB,cAAc,EAAM;KACpB,iBAAiB,EAAM;KACvB,8BAA8B,EAAM;KACpC,cAAc;KACd,gBAAgB,EAAM,kBAAkB;KACxC,sBAAsB;KACtB,2BAA2B,EAAM;KACjC,cAAc,EAAM;KACpB,kCACE,EAAM;KAER,sBAAsB,EAAM;KAC5B,yBAAyB;KACzB,qBAAqB,EACnB,WAAW;MACT,iBAAiB;MACjB,sBAAsB;MACtB,uBAAuB;MACvB,gBAAgB,IACZ,IACA,KAAA;MACL,EACF;KACD,CAAA;IACwB,CAAA;GACnB,CAAA;EACQ,EAvDd,EAAY,QAuDE"}
1
+ {"version":3,"file":"SearchQueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.tsx"],"sourcesContent":["import { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Suspense, useRef } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport {\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport { TopLevelControlsProps } from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { PlotsContainerProps } from '../widgets/facet-nav/PlotsContainer'\nimport { FacetFilterControlsProps } from '../widgets/query-filter/FacetFilterControls'\nimport {\n SearchQueryWrapper,\n SearchQueryWrapperProps,\n} from '../SearchQueryWrapper/SearchQueryWrapper'\nimport { QueryWrapperPlotNavContents } from '../QueryWrapperPlotNav/QueryWrapperPlotNav'\nimport { useGetSuggestionsForSearchIndex } from '../SearchQueryWrapper/SearchQueryUseQueryOptions'\n\ntype SearchQueryWrapperPlotNavOwnProps = {\n /** The ID of the SearchIndex entity to query. */\n searchIndexId: string\n /**\n * The name of the field to use for autocomplete suggestions.\n * When provided, the search bar will show a dropdown of suggestions as the user types,\n * populated by querying the search index with this field restricted via POST /search/autocomplete.\n */\n autocompleteFieldName?: string\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n initialLimit?: number\n hideTopLevelControls?: boolean\n // Note: hideDownload, hideSqlEditorControl are intentionally\n // excluded — they are hardcoded to true because these controls are not applicable to the\n // SearchQueryServicesApi (no file download, no SQL editing).\n}\n\nexport type SearchQueryWrapperPlotNavProps = SearchQueryWrapperPlotNavOwnProps &\n PlotsContainerProps &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'hiddenColumns'\n | 'columnAliases'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideVisualizationsControl'\n | 'lockTextMatchesQueryFilterPill'\n | 'hideSearchBarControl'\n | 'defaultShowSearchBar'\n > &\n Pick<TopLevelControlsProps, 'name' | 'hideQueryCount'> & {\n /** Optional initial query parameters. Only selectedFacets, additionalFilters, limit, and offset are used. */\n initQueryRequest?: SearchQueryWrapperProps['initQueryRequest']\n /** Called when the query result bundle changes (e.g. to report result counts to a parent). */\n onQueryResultBundleChange?: SearchQueryWrapperProps['onQueryResultBundleChange']\n /** Whether the URL should update when the query is modified (deep linking). */\n shouldDeepLink?: SearchQueryWrapperProps['shouldDeepLink']\n }\n\n/**\n * Type guard that identifies a SearchQueryWrapperPlotNavProps from the union\n * `QueryWrapperPlotNavProps | SearchQueryWrapperPlotNavProps`.\n *\n * Two conditions are checked to be robust against future API changes:\n * 1. The config has `searchIndexId` (present only on SearchQueryWrapperPlotNavProps).\n * 2. The config does NOT have `sql` (always present on QueryWrapperPlotNavProps via\n * QueryOrDeprecatedSearchParams), so that if QueryWrapperPlotNavProps ever gains a\n * `searchIndexId` field the guard remains correct.\n */\nexport function isSearchQueryWrapperPlotNavProps(config: {\n searchIndexId?: unknown\n sql?: unknown\n}): config is SearchQueryWrapperPlotNavProps {\n return 'searchIndexId' in config && !('sql' in config)\n}\n\n/**\n * A component similar to QueryWrapperPlotNav that sources its data from the SearchQueryServicesApi\n * rather than the standard Synapse Table Services. Facets, table/card rendering, and plots are\n * all reused from the existing component library.\n */\nexport default function SearchQueryWrapperPlotNav(\n props: SearchQueryWrapperPlotNavProps,\n) {\n const {\n tableConfiguration,\n isInfinite = !tableConfiguration,\n unitDescription,\n helpConfiguration,\n initQueryRequest: initQueryRequestFromProps,\n onQueryResultBundleChange,\n searchIndexId,\n autocompleteFieldName,\n shouldDeepLink,\n } = props\n\n const getSuggestions = useGetSuggestionsForSearchIndex(\n searchIndexId,\n autocompleteFieldName,\n )\n\n const initQueryRequest: SearchQueryWrapperProps['initQueryRequest'] =\n useDeepCompareMemoize({\n partMask: initQueryRequestFromProps?.partMask ?? 0,\n query: {\n selectedFacets: initQueryRequestFromProps?.query?.selectedFacets,\n additionalFilters: initQueryRequestFromProps?.query?.additionalFilters,\n limit: initQueryRequestFromProps?.query?.limit ?? DEFAULT_PAGE_SIZE,\n offset: initQueryRequestFromProps?.query?.offset ?? 0,\n },\n })\n\n // Remount SearchQueryWrapper when initQueryRequest content changes.\n // useDeepCompareMemoize returns the same reference when content is equal, so reference\n // comparison is sufficient here. A counter is used rather than JSON.stringify to avoid\n // serializing the object on every render.\n const mountKeyRef = useRef(0)\n const prevInitQueryRef = useRef(initQueryRequest)\n if (prevInitQueryRef.current !== initQueryRequest) {\n mountKeyRef.current += 1\n prevInitQueryRef.current = initQueryRequest\n }\n\n return (\n <SearchQueryWrapper\n key={mountKeyRef.current}\n searchIndexId={searchIndexId}\n initQueryRequest={initQueryRequest}\n isInfinite={isInfinite}\n onQueryResultBundleChange={onQueryResultBundleChange}\n shouldDeepLink={shouldDeepLink}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n hiddenColumns={props.hiddenColumns}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n hideSearchBarControl={props.hideSearchBarControl ?? false}\n lockTextMatchesQueryFilterPill={props.lockTextMatchesQueryFilterPill}\n defaultShowSearchBar={props.defaultShowSearchBar ?? true}\n showLastUpdatedOn={props.showLastUpdatedOn}\n noContentPlaceholderType={\n props.noContentPlaceholderType ??\n NoContentPlaceholderType.INTERACTIVE\n }\n >\n <QueryWrapperPlotNavContents\n tableConfiguration={tableConfiguration}\n name={props.name}\n cardConfiguration={props.cardConfiguration}\n facetsToPlot={props.facetsToPlot}\n availableFacets={props.availableFacets}\n initialExpandedFacetControls={props.initialExpandedFacetControls}\n hideDownload={true}\n hideQueryCount={props.hideQueryCount ?? false}\n hideSqlEditorControl={true}\n hideVisualizationsControl={props.hideVisualizationsControl}\n initialLimit={props.initialLimit}\n initialPlotTypeByFacetColumnName={\n props.initialPlotTypeByFacetColumnName\n }\n hideTopLevelControls={props.hideTopLevelControls}\n isFullTextSearchEnabled={true}\n searchConfiguration={{\n ftsConfig: {\n textMatchesMode: 'NATURAL_LANGUAGE',\n minSearchQueryLength: 1,\n replaceExistingFilter: true,\n getSuggestions: autocompleteFieldName\n ? getSuggestions\n : undefined,\n },\n }}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </SearchQueryWrapper>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAkFA,SAAgB,EAAiC,GAGJ;CAC3C,OAAO,mBAAmB,KAAU,EAAE,SAAS;AACjD;AAOA,SAAwB,EACtB,GACA;CACA,IAAM,EACJ,uBACA,gBAAa,CAAC,GACd,oBACA,sBACA,kBAAkB,GAClB,8BACA,kBACA,0BACA,sBACE,GAEE,IAAiB,EACrB,GACA,CACF,GAEM,IACJ,EAAsB;EACpB,UAAU,GAA2B,YAAY;EACjD,OAAO;GACL,gBAAgB,GAA2B,OAAO;GAClD,mBAAmB,GAA2B,OAAO;GACrD,OAAO,GAA2B,OAAO,SAAA;GACzC,QAAQ,GAA2B,OAAO,UAAU;EACtD;CACF,CAAC,GAMG,IAAc,EAAO,CAAC,GACtB,IAAmB,EAAO,CAAgB;CAMhD,OALI,EAAiB,YAAY,MAC/B,EAAY,WAAW,GACvB,EAAiB,UAAU,IAI3B,kBAAC,GAAD;EAEiB;EACG;EACN;EACe;EACX;YAEhB,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,CAA4B,CAAA;aAC9C,kBAAC,GAAD;IACmB;IACjB,UAAU,EAAM;IAChB,eAAe,EAAM;IACF;IACnB,oBAAoB,EAAM;IAC1B,eAAe,EAAM;IACrB,kBAAkB,EAAM;IACxB,qBAAqB,EAAM;IAC3B,sBAAsB,EAAM,wBAAwB;IACpD,gCAAgC,EAAM;IACtC,sBAAsB,EAAM,wBAAwB;IACpD,mBAAmB,EAAM;IACzB,0BACE,EAAM,4BACN,EAAyB;cAG3B,kBAAC,GAAD;KACsB;KACpB,MAAM,EAAM;KACZ,mBAAmB,EAAM;KACzB,cAAc,EAAM;KACpB,iBAAiB,EAAM;KACvB,8BAA8B,EAAM;KACpC,cAAc;KACd,gBAAgB,EAAM,kBAAkB;KACxC,sBAAsB;KACtB,2BAA2B,EAAM;KACjC,cAAc,EAAM;KACpB,kCACE,EAAM;KAER,sBAAsB,EAAM;KAC5B,yBAAyB;KACzB,qBAAqB,EACnB,WAAW;MACT,iBAAiB;MACjB,sBAAsB;MACtB,uBAAuB;MACvB,gBAAgB,IACZ,IACA,KAAA;KACN,EACF;IACD,CAAA;GACwB,CAAA;EACnB,CAAA;CACQ,GAxDb,EAAY,OAwDC;AAExB"}