synapse-react-client 4.0.38 → 4.0.40

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 (222) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/useAridhiaQuery.d.ts +6 -2
  3. package/dist/aridhia-queries/useAridhiaQuery.d.ts.map +1 -1
  4. package/dist/aridhia-queries/useAridhiaQuery.js +3 -0
  5. package/dist/aridhia-queries/useAridhiaQuery.js.map +1 -1
  6. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts +2 -1
  7. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  8. package/dist/components/Aridhia/AridhiaAccessStatus.js +60 -37
  9. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  10. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +12 -0
  11. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -0
  12. package/dist/components/Aridhia/AridhiaDarStatusPopover.js +56 -0
  13. package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -0
  14. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.d.ts.map +1 -1
  15. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js +38 -30
  16. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js.map +1 -1
  17. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js +15 -14
  18. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js.map +1 -1
  19. package/dist/components/Aridhia/RdcaDapEligibilityDialog.d.ts +11 -0
  20. package/dist/components/Aridhia/RdcaDapEligibilityDialog.d.ts.map +1 -0
  21. package/dist/components/Aridhia/RdcaDapEligibilityDialog.js +37 -0
  22. package/dist/components/Aridhia/RdcaDapEligibilityDialog.js.map +1 -0
  23. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +2 -2
  24. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
  25. package/dist/components/Aridhia/aridhiaFairPortalUrls.d.ts +10 -0
  26. package/dist/components/Aridhia/aridhiaFairPortalUrls.d.ts.map +1 -0
  27. package/dist/components/Aridhia/aridhiaFairPortalUrls.js +11 -0
  28. package/dist/components/Aridhia/aridhiaFairPortalUrls.js.map +1 -0
  29. package/dist/components/Aridhia/rdcaDapConstants.d.ts +3 -0
  30. package/dist/components/Aridhia/rdcaDapConstants.d.ts.map +1 -0
  31. package/dist/components/Aridhia/rdcaDapConstants.js +6 -0
  32. package/dist/components/Aridhia/rdcaDapConstants.js.map +1 -0
  33. package/dist/components/DataExplorer/DataExplorer.css +1 -1
  34. package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
  35. package/dist/components/DataExplorer/DataExplorer.js +50 -50
  36. package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
  37. package/dist/components/DataExplorer/DataExplorer.module.js +16 -16
  38. package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -1
  39. package/dist/components/DataExplorer/DataExplorer.module.scss +29 -6
  40. package/dist/components/DataGrid/columns/DateTimeColumn.d.ts +16 -7
  41. package/dist/components/DataGrid/columns/DateTimeColumn.d.ts.map +1 -1
  42. package/dist/components/DataGrid/columns/DateTimeColumn.js +79 -57
  43. package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
  44. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  45. package/dist/components/DataGrid/utils/columnFactory.js +11 -8
  46. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  47. package/dist/components/DatePicker/DatePicker.d.ts +10 -0
  48. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
  49. package/dist/components/DatePicker/DatePicker.js +18 -0
  50. package/dist/components/DatePicker/DatePicker.js.map +1 -0
  51. package/dist/components/EntityCitation/EntityCitation.d.ts.map +1 -1
  52. package/dist/components/EntityCitation/EntityCitation.js +8 -5
  53. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  54. package/dist/components/HasAccess/AccessIcon.d.ts +3 -1
  55. package/dist/components/HasAccess/AccessIcon.d.ts.map +1 -1
  56. package/dist/components/HasAccess/AccessIcon.js +11 -1
  57. package/dist/components/HasAccess/AccessIcon.js.map +1 -1
  58. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts +2 -1
  59. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts.map +1 -1
  60. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js +81 -53
  61. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
  62. package/dist/components/ProjectInfo/ProjectInfo.d.ts.map +1 -1
  63. package/dist/components/ProjectInfo/ProjectInfo.js +3 -2
  64. package/dist/components/ProjectInfo/ProjectInfo.js.map +1 -1
  65. package/dist/components/QueryBuilder/FilterConditionRow.css +1 -0
  66. package/dist/components/QueryBuilder/FilterConditionRow.d.ts +6 -0
  67. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -0
  68. package/dist/components/QueryBuilder/FilterConditionRow.js +257 -0
  69. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -0
  70. package/dist/components/QueryBuilder/FilterConditionRow.module.js +17 -0
  71. package/dist/components/QueryBuilder/FilterConditionRow.module.js.map +1 -0
  72. package/dist/components/QueryBuilder/FilterConditionRow.module.scss +106 -0
  73. package/dist/components/QueryBuilder/FilterGroupNode.css +1 -0
  74. package/dist/components/QueryBuilder/FilterGroupNode.d.ts +7 -0
  75. package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -0
  76. package/dist/components/QueryBuilder/FilterGroupNode.js +100 -0
  77. package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -0
  78. package/dist/components/QueryBuilder/FilterGroupNode.module.js +15 -0
  79. package/dist/components/QueryBuilder/FilterGroupNode.module.js.map +1 -0
  80. package/dist/components/QueryBuilder/FilterGroupNode.module.scss +83 -0
  81. package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -0
  82. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts +21 -0
  83. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -0
  84. package/dist/components/QueryBuilder/QueryBuilderControls.js +138 -0
  85. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -0
  86. package/dist/components/QueryBuilder/QueryBuilderControls.module.js +17 -0
  87. package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -0
  88. package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +79 -0
  89. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +39 -0
  90. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -0
  91. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js +19 -0
  92. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -0
  93. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts +14 -0
  94. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts.map +1 -0
  95. package/dist/components/QueryBuilder/qbTreeToReadable.js +89 -0
  96. package/dist/components/QueryBuilder/qbTreeToReadable.js.map +1 -0
  97. package/dist/components/QueryBuilder/queryBuilderId.d.ts +2 -0
  98. package/dist/components/QueryBuilder/queryBuilderId.d.ts.map +1 -0
  99. package/dist/components/QueryBuilder/queryBuilderId.js +9 -0
  100. package/dist/components/QueryBuilder/queryBuilderId.js.map +1 -0
  101. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +24 -0
  102. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -0
  103. package/dist/components/QueryBuilder/queryBuilderMetadata.js +91 -0
  104. package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -0
  105. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts +58 -0
  106. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts.map +1 -0
  107. package/dist/components/QueryBuilder/queryBuilderOperations.js +200 -0
  108. package/dist/components/QueryBuilder/queryBuilderOperations.js.map +1 -0
  109. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +3 -2
  110. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
  111. package/dist/components/QueryBuilder/queryBuilderTranslation.js +82 -84
  112. package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
  113. package/dist/components/QueryBuilder/useQBCombinedSql.d.ts +11 -0
  114. package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -0
  115. package/dist/components/QueryBuilder/useQBCombinedSql.js +29 -0
  116. package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -0
  117. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.d.ts +18 -0
  118. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.d.ts.map +1 -0
  119. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.js +27 -0
  120. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.js.map +1 -0
  121. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +14 -1
  122. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  123. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +185 -120
  124. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  125. package/dist/components/RssFeedCards/RssFeedCards.d.ts +1 -0
  126. package/dist/components/RssFeedCards/RssFeedCards.d.ts.map +1 -1
  127. package/dist/components/RssFeedCards/RssFeedCards.js +11 -11
  128. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  129. package/dist/components/SynapseChat/SynapseChat.d.ts +7 -1
  130. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  131. package/dist/components/SynapseChat/SynapseChat.js +76 -71
  132. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  133. package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts +3 -1
  134. package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts.map +1 -1
  135. package/dist/components/SynapseChat/SynapsePortalChatDialog.js +24 -13
  136. package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -1
  137. package/dist/components/SynapseChat/portalChatSessionStorage.d.ts +23 -0
  138. package/dist/components/SynapseChat/portalChatSessionStorage.d.ts.map +1 -0
  139. package/dist/components/SynapseChat/portalChatSessionStorage.js +29 -0
  140. package/dist/components/SynapseChat/portalChatSessionStorage.js.map +1 -0
  141. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts +6 -0
  142. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
  143. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +92 -79
  144. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
  145. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts +3 -4
  146. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
  147. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +2 -2
  148. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
  149. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js +1 -1
  150. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
  151. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
  152. package/dist/components/entity/page/action_menu/EntityActionMenu.js +9 -2
  153. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  154. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +1 -1
  155. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  156. package/dist/components/menu/ComplexMenu.js +1 -1
  157. package/dist/components/menu/ComplexMenu.js.map +1 -1
  158. package/dist/components/menu/DropdownMenu.d.ts.map +1 -1
  159. package/dist/components/menu/DropdownMenu.js +4 -0
  160. package/dist/components/menu/DropdownMenu.js.map +1 -1
  161. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.d.ts +10 -0
  162. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.d.ts.map +1 -0
  163. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.js +20 -0
  164. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.js.map +1 -0
  165. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
  166. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +29 -20
  167. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
  168. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts +16 -0
  169. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts.map +1 -0
  170. package/dist/mocks/accessRequirement/mockFormTemplates.js +70 -0
  171. package/dist/mocks/accessRequirement/mockFormTemplates.js.map +1 -0
  172. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts +7 -0
  173. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts.map +1 -0
  174. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js +47 -0
  175. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js.map +1 -0
  176. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts +24 -0
  177. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts.map +1 -0
  178. package/dist/mocks/accessRequirement/mockJsonSchemas.js +62 -0
  179. package/dist/mocks/accessRequirement/mockJsonSchemas.js.map +1 -0
  180. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +18 -1
  181. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
  182. package/dist/mocks/msw/handlers/aridhiaHandlers.js +39 -33
  183. package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
  184. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts +5 -0
  185. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts.map +1 -0
  186. package/dist/mocks/msw/handlers/formTemplateHandlers.js +65 -0
  187. package/dist/mocks/msw/handlers/formTemplateHandlers.js.map +1 -0
  188. package/dist/mocks/msw/handlers.d.ts.map +1 -1
  189. package/dist/mocks/msw/handlers.js +49 -47
  190. package/dist/mocks/msw/handlers.js.map +1 -1
  191. package/dist/style/abstracts/_cssVariables.scss +7 -0
  192. package/dist/style/components/_query-wrapper-plot-nav.scss +9 -0
  193. package/dist/style/main.css +1 -1
  194. package/dist/synapse-queries/KeyFactory.d.ts +6 -1
  195. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  196. package/dist/synapse-queries/KeyFactory.js +17 -2
  197. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  198. package/dist/synapse-queries/chat/useChat.d.ts.map +1 -1
  199. package/dist/synapse-queries/chat/useChat.js +2 -4
  200. package/dist/synapse-queries/chat/useChat.js.map +1 -1
  201. package/dist/synapse-queries/dataaccess/index.d.ts +2 -0
  202. package/dist/synapse-queries/dataaccess/index.d.ts.map +1 -1
  203. package/dist/synapse-queries/dataaccess/index.js +5 -3
  204. package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts +41 -0
  205. package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts.map +1 -0
  206. package/dist/synapse-queries/dataaccess/useFormTemplate.js +63 -0
  207. package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -0
  208. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts +21 -0
  209. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts.map +1 -0
  210. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js +34 -0
  211. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js.map +1 -0
  212. package/dist/synapse-queries/index.js +190 -180
  213. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  214. package/dist/tsconfig.build.tsbuildinfo +1 -1
  215. package/dist/utils/featureflag/FeatureFlags.d.ts +0 -1
  216. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  217. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  218. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  219. package/dist/utils/jsonschema/getType.d.ts.map +1 -1
  220. package/dist/utils/jsonschema/getType.js +4 -1
  221. package/dist/utils/jsonschema/getType.js.map +1 -1
  222. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"AridhiaDarWizard.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/AridhiaDarWizard.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useState } from 'react'\nimport { Alert, Box, Button, Link, Skeleton } from '@mui/material'\nimport { RJSFSchema } from '@rjsf/utils'\nimport { useGetAridhiaDatasetSettings } from '@/aridhia-queries/useGetAridhiaDatasetSettings'\nimport { useGetAridhiaWorkflow } from '@/aridhia-queries/useGetAridhiaWorkflow'\nimport { useGetAridhiaDictionaries } from '@/aridhia-queries/useGetAridhiaDictionaries'\nimport { useGetAridhiaWorkspaces } from '@/aridhia-queries/useGetAridhiaWorkspaces'\nimport { useGetAridhiaWorkspaceRequestForm } from '@/aridhia-queries/useGetAridhiaWorkspaceRequestForm'\nimport { useSubmitAridhiaDar } from '@/aridhia-queries/useSubmitAridhiaDar'\nimport { TransferType } from '@/aridhia-queries/TransferType'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport {\n fairSectionToRjsf,\n FairField,\n FairFormPayload,\n parseFairFormSections,\n summarizeFormAnswers,\n} from '@/components/Aridhia/fairFormToRjsf'\nimport { useDarDraft } from './useDarDraft'\nimport { DarDestinationStep } from './DarDestinationStep'\nimport { DarWorkspaceStep } from './DarWorkspaceStep'\nimport { DarAboutStep } from './DarAboutStep'\nimport { DarProjectStep } from './DarProjectStep'\nimport { DarCompleteStep } from './DarCompleteStep'\nimport { DarSubmittedPanel } from './DarSubmittedPanel'\n\nexport type { TransferType }\n\nexport type AridhiaDarWizardProps = {\n datasetCode: string\n /** Display name for headings; falls back to the FAIR catalogue title. */\n datasetName?: string\n onSubmitted?: (requestCode: string) => void\n}\n\n// `DatasetSettings.allow_{type}` (e.g. `allow_clear`) gates each `TransferType` value below.\n// See Aridhia docs here: https://knowledgebase.aridhia.io/fair-data-services/managing-data/dataset-administration/available-data-delivery-formats/\n// NOTE: For the AMP-ALS integration, the published datasets support 'clear' only.\nconst TRANSFER_TYPE_PRIORITY: TransferType[] = [\n 'clear',\n 'pseudonymised',\n 'manual',\n]\n\ntype StepKey = 'destination' | 'workspace' | 'project' | 'about' | 'complete'\n\n/** Sage's general-purpose issue portal; RDCA-DAP/ALSKP has no dedicated service desk. */\nconst SUPPORT_PORTAL_URL =\n 'https://sagebionetworks.jira.com/servicedesk/customer/portal/9'\n\nfunction isSectionComplete(\n schema: RJSFSchema,\n values: Record<string, unknown>,\n): boolean {\n return (schema.required ?? []).every(key => {\n const value = values[key]\n return value !== undefined && value !== null && value !== ''\n })\n}\n\nfunction useFairSection(data: FairFormPayload | null | undefined, key: string) {\n return useMemo(() => {\n const section = parseFairFormSections(data).find(s => s.key === key)\n return section ? fairSectionToRjsf(section) : undefined\n }, [data, key])\n}\n\n/**\n * Five-step (four when no new workspace is requested) DAR wizard: Destination, Workspace\n * (conditional), About, Project, Review & Submit.\n */\nfunction useAridhiaDarWizardParts(\n props: AridhiaDarWizardProps,\n options?: {\n enabled?: boolean\n /** Dialog-hosted callers only: renders a \"Close\" action on the post-submission screen. */\n onClose?: () => void\n },\n): {\n content: ReactNode\n actions?: ReactNode\n} {\n const { datasetCode, datasetName, onSubmitted } = props\n // Callers that only conditionally show this wizard (e.g. a closed dialog) pass `enabled:\n // false` so its network requests, and the \"editing\" flag below, stay dormant until shown.\n const enabled = options?.enabled ?? true\n const { draft, setDraft, clearDraft } = useDarDraft(datasetCode)\n const [submitted, setSubmitted] = useState<{\n code: string\n status?: string\n }>()\n\n // Once submitted the draft is cleared and there's nothing left to lose, so don't treat the\n // wizard as \"editing\" anymore — callers (e.g. a hosting dialog) can let the user close freely.\n const isDirty =\n enabled &&\n !submitted &&\n (draft.step > 0 ||\n draft.selectedDictionaryCodes.length > 0 ||\n draft.workspaceRequested ||\n draft.termsAccepted ||\n Object.keys(draft.values).length > 0)\n const { setIsEditing } = useGlobalIsEditingContext()\n useEffect(() => {\n setIsEditing(isDirty)\n return () => setIsEditing(false)\n }, [isDirty, setIsEditing])\n\n const settingsQuery = useGetAridhiaDatasetSettings(datasetCode, { enabled })\n const workflowKey = settingsQuery.data?.workflow_key\n const workflowQuery = useGetAridhiaWorkflow(workflowKey)\n const workspaceFormQuery = useGetAridhiaWorkspaceRequestForm({\n enabled: draft.workspaceRequested && enabled,\n })\n const dictionariesQuery = useGetAridhiaDictionaries(datasetCode, {\n enabled,\n })\n const workspacesQuery = useGetAridhiaWorkspaces(\n datasetCode,\n draft.workspaceLocation,\n { enabled },\n )\n\n const allowedTransferTypes = useMemo<TransferType[]>(() => {\n const settings = settingsQuery.data\n if (!settings) return []\n return TRANSFER_TYPE_PRIORITY.filter(\n type => settings[`allow_${type}` as const] === true,\n )\n }, [settingsQuery.data])\n\n // Default transfer_type to the first allowed option once settings load.\n useEffect(() => {\n if (!draft.transferType && allowedTransferTypes.length > 0) {\n setDraft(previous => ({\n ...previous,\n transferType: allowedTransferTypes[0],\n }))\n }\n }, [allowedTransferTypes, draft.transferType, setDraft])\n\n const aboutRjsf = useFairSection(workflowQuery.data, 'about')\n const projectRjsf = useFairSection(workflowQuery.data, 'project')\n const workspaceRjsf = useFairSection(workspaceFormQuery.data, 'workspace')\n\n const unsupportedFields: FairField[] = useMemo(() => {\n return [\n ...(aboutRjsf?.unsupported ?? []),\n ...(projectRjsf?.unsupported ?? []),\n ...(draft.workspaceRequested ? (workspaceRjsf?.unsupported ?? []) : []),\n ]\n }, [aboutRjsf, projectRjsf, workspaceRjsf, draft.workspaceRequested])\n\n const submitMutation = useSubmitAridhiaDar({\n onSuccess: data => {\n clearDraft()\n const code = data.code ?? draft.code\n setSubmitted({ code, status: data.status })\n onSubmitted?.(code)\n },\n })\n\n if (settingsQuery.isLoading) {\n return { content: <Skeleton height={400} /> }\n }\n\n if (settingsQuery.isError || !settingsQuery.data) {\n return {\n content: (\n <Alert severity=\"error\">\n Unable to load this dataset&apos;s access settings. Please try again\n later.\n </Alert>\n ),\n }\n }\n\n if (allowedTransferTypes.length === 0) {\n return {\n content: (\n <Alert severity=\"error\">\n This dataset cannot currently be requested.\n </Alert>\n ),\n }\n }\n\n if (submitted) {\n return {\n content: (\n <DarSubmittedPanel\n requestCode={submitted.code}\n status={submitted.status}\n />\n ),\n actions: options?.onClose && (\n <Button variant=\"contained\" onClick={options.onClose}>\n Close\n </Button>\n ),\n }\n }\n\n const stepKeys: readonly StepKey[] = draft.workspaceRequested\n ? ['destination', 'workspace', 'project', 'about', 'complete']\n : ['destination', 'project', 'about', 'complete']\n const currentStepKey: StepKey =\n stepKeys[Math.min(draft.step, stepKeys.length - 1)]\n\n // Matches RDCA-DAP's own UI: selecting no tables is equivalent to selecting every table.\n const allDictionaries = (dictionariesQuery.data?.items ?? []).filter(\n (d): d is { code: string; name: string } => !!d.code,\n )\n const selectedDictionaries =\n draft.selectedDictionaryCodes.length > 0\n ? allDictionaries.filter(d =>\n draft.selectedDictionaryCodes.includes(d.code),\n )\n : allDictionaries\n const workspaceName = (workspacesQuery.data?.items ?? []).find(\n w => w.uuid === draft.workspaceUuid,\n )?.name\n // The Destination step only asks the user to pick a transfer type when there's more than\n // one allowed option — don't show a value on the review step for a question never asked.\n const showTransferType = allowedTransferTypes.length > 1\n const aboutAnswers = aboutRjsf\n ? summarizeFormAnswers(aboutRjsf.schema, draft.values)\n : []\n const projectAnswers = projectRjsf\n ? summarizeFormAnswers(projectRjsf.schema, draft.values)\n : []\n\n function canAdvanceFrom(stepKey: StepKey): boolean {\n switch (stepKey) {\n case 'destination':\n return (\n !!draft.transferType &&\n (draft.workspaceRequested || !!draft.workspaceUuid)\n )\n case 'workspace':\n return (\n !workspaceFormQuery.isLoading &&\n !!draft.workspaceReference?.trim() &&\n (!workspaceRjsf ||\n isSectionComplete(workspaceRjsf.schema, draft.values))\n )\n case 'about':\n return (\n !workflowQuery.isLoading &&\n (!aboutRjsf || isSectionComplete(aboutRjsf.schema, draft.values))\n )\n case 'project':\n return (\n !workflowQuery.isLoading &&\n (!projectRjsf || isSectionComplete(projectRjsf.schema, draft.values))\n )\n case 'complete':\n return draft.termsAccepted\n }\n }\n\n function goToStep(index: number) {\n setDraft(previous => ({ ...previous, step: index }))\n }\n\n function mergeValues(next: Record<string, unknown>) {\n setDraft(previous => ({\n ...previous,\n values: { ...previous.values, ...next },\n }))\n }\n\n function handleSubmit() {\n const { name, code: _formCode, ...fields } = draft.values\n submitMutation.mutate({\n code: draft.code,\n name: (name as string) ?? '',\n fields,\n transferType: draft.transferType!,\n workspaceRequested: draft.workspaceRequested,\n workspaceUuid: draft.workspaceUuid,\n workspaceReference: draft.workspaceReference,\n selectedDictionaries,\n })\n }\n\n const stepIndex = stepKeys.indexOf(currentStepKey)\n const canAdvance = canAdvanceFrom(currentStepKey)\n\n const content = (\n <>\n {unsupportedFields.length > 0 && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n This request form includes field types the portal cannot render yet (\n {unsupportedFields.map(f => f.name).join(', ')}). Please{' '}\n <Link\n href={SUPPORT_PORTAL_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n contact support\n </Link>{' '}\n — submission is disabled until this is resolved.\n </Alert>\n )}\n {currentStepKey === 'destination' && (\n <DarDestinationStep\n datasetCode={datasetCode}\n allowedTransferTypes={allowedTransferTypes}\n selectedDictionaryCodes={draft.selectedDictionaryCodes}\n onSelectedDictionaryCodesChange={codes =>\n setDraft(previous => ({\n ...previous,\n selectedDictionaryCodes: codes,\n }))\n }\n workspaceRequested={draft.workspaceRequested}\n workspaceLocation={draft.workspaceLocation}\n workspaceUuid={draft.workspaceUuid}\n onWorkspaceChange={change =>\n setDraft(previous => {\n const next = { ...previous, ...change }\n if (previous.workspaceRequested && !change.workspaceRequested) {\n // Switching from \"request a new workspace\" back to an existing one: drop\n // whatever was entered into the new-workspace form so it isn't submitted\n // against the existing-workspace's schema (that form's fields aren't valid\n // there). RDCA-DAP's workspace form re-asks some fields already collected by\n // the About/Project steps (e.g. `project_name`) — those answers still belong\n // to their own step and must survive, so only drop fields unique to the\n // workspace form.\n const sharedFieldNames = new Set([\n ...Object.keys(aboutRjsf?.schema.properties ?? {}),\n ...Object.keys(projectRjsf?.schema.properties ?? {}),\n ])\n const workspaceOnlyFieldNames = Object.keys(\n workspaceRjsf?.schema.properties ?? {},\n ).filter(name => !sharedFieldNames.has(name))\n next.values = Object.fromEntries(\n Object.entries(previous.values).filter(\n ([key]) => !workspaceOnlyFieldNames.includes(key),\n ),\n )\n next.workspaceReference = undefined\n }\n return next\n })\n }\n transferType={draft.transferType ?? allowedTransferTypes[0]}\n onTransferTypeChange={transferType =>\n setDraft(previous => ({ ...previous, transferType }))\n }\n />\n )}\n\n {currentStepKey === 'workspace' &&\n (workspaceFormQuery.isLoading ? (\n <Skeleton height={200} />\n ) : workspaceRjsf ? (\n <DarWorkspaceStep\n schema={workspaceRjsf.schema}\n uiSchema={workspaceRjsf.uiSchema}\n formData={draft.values}\n onChange={mergeValues}\n reference={draft.workspaceReference ?? ''}\n onReferenceChange={reference =>\n setDraft(previous => ({\n ...previous,\n workspaceReference: reference,\n }))\n }\n />\n ) : (\n <Alert severity=\"error\">\n Unable to load the new-workspace request form. Please try again\n later.\n </Alert>\n ))}\n\n {currentStepKey === 'project' &&\n (workflowQuery.isLoading ? (\n <Skeleton height={200} />\n ) : projectRjsf ? (\n <DarProjectStep\n schema={projectRjsf.schema}\n uiSchema={projectRjsf.uiSchema}\n formData={draft.values}\n onChange={mergeValues}\n />\n ) : (\n <Alert severity=\"error\">\n Unable to load the project section of this request form. Please try\n again later.\n </Alert>\n ))}\n\n {currentStepKey === 'about' &&\n (workflowQuery.isLoading ? (\n <Skeleton height={200} />\n ) : aboutRjsf ? (\n <DarAboutStep\n schema={aboutRjsf.schema}\n uiSchema={aboutRjsf.uiSchema}\n formData={draft.values}\n onChange={mergeValues}\n />\n ) : (\n <Alert severity=\"error\">\n Unable to load the &quot;about you&quot; section of this request\n form. Please try again later.\n </Alert>\n ))}\n\n {currentStepKey === 'complete' && (\n <DarCompleteStep\n datasetCode={datasetCode}\n datasetName={datasetName}\n selectedDictionaryNames={selectedDictionaries.map(\n d => d.name ?? d.code,\n )}\n allTablesSelected={draft.selectedDictionaryCodes.length === 0}\n workspaceRequested={draft.workspaceRequested}\n workspaceName={workspaceName}\n workspaceReference={draft.workspaceReference}\n showTransferType={showTransferType}\n transferType={draft.transferType ?? allowedTransferTypes[0]}\n aboutAnswers={aboutAnswers}\n projectAnswers={projectAnswers}\n termsAccepted={draft.termsAccepted}\n onTermsAcceptedChange={accepted =>\n setDraft(previous => ({ ...previous, termsAccepted: accepted }))\n }\n />\n )}\n\n {submitMutation.isError && (\n <Alert\n severity=\"error\"\n sx={{ mt: 2 }}\n action={\n (submitMutation.error?.httpStatus ?? 0) >= 500 ||\n !submitMutation.error?.httpStatus ? (\n <Button color=\"inherit\" size=\"small\" onClick={handleSubmit}>\n Retry\n </Button>\n ) : undefined\n }\n >\n {submitMutation.error?.message ??\n 'The request could not be submitted.'}\n </Alert>\n )}\n </>\n )\n\n const actions = (\n <>\n <Button\n disabled={stepIndex === 0}\n onClick={() => goToStep(stepIndex - 1)}\n >\n Back\n </Button>\n {currentStepKey === 'complete' ? (\n <Button\n variant=\"contained\"\n disabled={\n !canAdvance ||\n unsupportedFields.length > 0 ||\n submitMutation.isPending\n }\n onClick={handleSubmit}\n >\n Submit request\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n disabled={!canAdvance || unsupportedFields.length > 0}\n onClick={() => goToStep(stepIndex + 1)}\n >\n Next\n </Button>\n )}\n </>\n )\n\n return { content, actions }\n}\n\n/**\n * Full-page/standalone entry point for the DAR wizard: renders the step content and its\n * Back/Next/Submit navigation inline in a single scrolling column.\n *\n * Dialog-hosted callers (e.g. `AridhiaAccessStatus`) should use `useAridhiaDarWizardParts`\n * directly instead, so the navigation buttons can be placed in a real MUI `DialogActions`\n * footer rather than nested inside the scrollable dialog content.\n */\nexport function AridhiaDarWizard(props: AridhiaDarWizardProps) {\n const { content, actions } = useAridhiaDarWizardParts(props)\n return (\n <Box sx={{ width: '100%' }}>\n {content}\n {actions && (\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mt: 3 }}>\n {actions}\n </Box>\n )}\n </Box>\n )\n}\n\nexport { useAridhiaDarWizardParts }\n"],"mappings":"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"}
1
+ {"version":3,"file":"AridhiaDarWizard.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/AridhiaDarWizard.tsx"],"sourcesContent":["import { ReactNode, useEffect, useMemo, useState } from 'react'\nimport { Alert, Box, Button, Link, Skeleton } from '@mui/material'\nimport { RJSFSchema } from '@rjsf/utils'\nimport { useGetAridhiaDatasetSettings } from '@/aridhia-queries/useGetAridhiaDatasetSettings'\nimport { useGetAridhiaWorkflow } from '@/aridhia-queries/useGetAridhiaWorkflow'\nimport { useGetAridhiaDictionaries } from '@/aridhia-queries/useGetAridhiaDictionaries'\nimport { useGetAridhiaWorkspaces } from '@/aridhia-queries/useGetAridhiaWorkspaces'\nimport { useGetAridhiaWorkspaceRequestForm } from '@/aridhia-queries/useGetAridhiaWorkspaceRequestForm'\nimport { useSubmitAridhiaDar } from '@/aridhia-queries/useSubmitAridhiaDar'\nimport { TransferType } from '@/aridhia-queries/TransferType'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport {\n fairSectionToRjsf,\n FairField,\n FairFormPayload,\n parseFairFormSections,\n summarizeFormAnswers,\n} from '@/components/Aridhia/fairFormToRjsf'\nimport { RdcaDapEligibilityExplainer } from '@/components/Aridhia/RdcaDapEligibilityDialog'\nimport { useDarDraft } from './useDarDraft'\nimport { DarDestinationStep } from './DarDestinationStep'\nimport { DarWorkspaceStep } from './DarWorkspaceStep'\nimport { DarAboutStep } from './DarAboutStep'\nimport { DarProjectStep } from './DarProjectStep'\nimport { DarCompleteStep } from './DarCompleteStep'\nimport { DarSubmittedPanel } from './DarSubmittedPanel'\n\nexport type { TransferType }\n\nexport type AridhiaDarWizardProps = {\n datasetCode: string\n /** Display name for headings; falls back to the FAIR catalogue title. */\n datasetName?: string\n onSubmitted?: (requestCode: string) => void\n}\n\n// `DatasetSettings.allow_{type}` (e.g. `allow_clear`) gates each `TransferType` value below.\n// See Aridhia docs here: https://knowledgebase.aridhia.io/fair-data-services/managing-data/dataset-administration/available-data-delivery-formats/\n// NOTE: For the AMP-ALS integration, the published datasets support 'clear' only.\nconst TRANSFER_TYPE_PRIORITY: TransferType[] = [\n 'clear',\n 'pseudonymised',\n 'manual',\n]\n\ntype StepKey = 'destination' | 'workspace' | 'project' | 'about' | 'complete'\n\n/** Sage's general-purpose issue portal; RDCA-DAP/ALSKP has no dedicated service desk. */\nconst SUPPORT_PORTAL_URL =\n 'https://sagebionetworks.jira.com/servicedesk/customer/portal/9'\n\nfunction isSectionComplete(\n schema: RJSFSchema,\n values: Record<string, unknown>,\n): boolean {\n return (schema.required ?? []).every(key => {\n const value = values[key]\n return value !== undefined && value !== null && value !== ''\n })\n}\n\nfunction useFairSection(data: FairFormPayload | null | undefined, key: string) {\n return useMemo(() => {\n const section = parseFairFormSections(data).find(s => s.key === key)\n return section ? fairSectionToRjsf(section) : undefined\n }, [data, key])\n}\n\n/**\n * Five-step (four when no new workspace is requested) DAR wizard: Destination, Workspace\n * (conditional), About, Project, Review & Submit.\n */\nfunction useAridhiaDarWizardParts(\n props: AridhiaDarWizardProps,\n options?: {\n enabled?: boolean\n /** Dialog-hosted callers only: renders a \"Close\" action on the post-submission screen. */\n onClose?: () => void\n },\n): {\n content: ReactNode\n actions?: ReactNode\n} {\n const { datasetCode, datasetName, onSubmitted } = props\n // Callers that only conditionally show this wizard (e.g. a closed dialog) pass `enabled:\n // false` so its network requests, and the \"editing\" flag below, stay dormant until shown.\n const enabled = options?.enabled ?? true\n const { draft, setDraft, clearDraft } = useDarDraft(datasetCode)\n const [submitted, setSubmitted] = useState<{\n code: string\n status?: string\n }>()\n\n // Once submitted the draft is cleared and there's nothing left to lose, so don't treat the\n // wizard as \"editing\" anymore — callers (e.g. a hosting dialog) can let the user close freely.\n const isDirty =\n enabled &&\n !submitted &&\n (draft.step > 0 ||\n draft.selectedDictionaryCodes.length > 0 ||\n draft.workspaceRequested ||\n draft.termsAccepted ||\n Object.keys(draft.values).length > 0)\n const { setIsEditing } = useGlobalIsEditingContext()\n useEffect(() => {\n setIsEditing(isDirty)\n return () => setIsEditing(false)\n }, [isDirty, setIsEditing])\n\n const settingsQuery = useGetAridhiaDatasetSettings(datasetCode, { enabled })\n const workflowKey = settingsQuery.data?.workflow_key\n const workflowQuery = useGetAridhiaWorkflow(workflowKey)\n const workspaceFormQuery = useGetAridhiaWorkspaceRequestForm({\n enabled: draft.workspaceRequested && enabled,\n })\n const dictionariesQuery = useGetAridhiaDictionaries(datasetCode, {\n enabled,\n })\n const workspacesQuery = useGetAridhiaWorkspaces(\n datasetCode,\n draft.workspaceLocation,\n { enabled },\n )\n\n const allowedTransferTypes = useMemo<TransferType[]>(() => {\n const settings = settingsQuery.data\n if (!settings) return []\n return TRANSFER_TYPE_PRIORITY.filter(\n type => settings[`allow_${type}` as const] === true,\n )\n }, [settingsQuery.data])\n\n // Default transfer_type to the first allowed option once settings load.\n useEffect(() => {\n if (!draft.transferType && allowedTransferTypes.length > 0) {\n setDraft(previous => ({\n ...previous,\n transferType: allowedTransferTypes[0],\n }))\n }\n }, [allowedTransferTypes, draft.transferType, setDraft])\n\n const aboutRjsf = useFairSection(workflowQuery.data, 'about')\n const projectRjsf = useFairSection(workflowQuery.data, 'project')\n const workspaceRjsf = useFairSection(workspaceFormQuery.data, 'workspace')\n\n const unsupportedFields: FairField[] = useMemo(() => {\n return [\n ...(aboutRjsf?.unsupported ?? []),\n ...(projectRjsf?.unsupported ?? []),\n ...(draft.workspaceRequested ? (workspaceRjsf?.unsupported ?? []) : []),\n ]\n }, [aboutRjsf, projectRjsf, workspaceRjsf, draft.workspaceRequested])\n\n const submitMutation = useSubmitAridhiaDar({\n onSuccess: data => {\n clearDraft()\n const code = data.code ?? draft.code\n setSubmitted({ code, status: data.status })\n onSubmitted?.(code)\n },\n })\n\n const eligibilityError = [\n settingsQuery.error,\n workflowQuery.error,\n dictionariesQuery.error,\n submitMutation.error,\n ].find(error => error?.isEligibilityFailure)\n\n if (eligibilityError) {\n return { content: <RdcaDapEligibilityExplainer /> }\n }\n\n if (settingsQuery.isLoading) {\n return { content: <Skeleton height={400} /> }\n }\n\n if (settingsQuery.isError || !settingsQuery.data) {\n return {\n content: (\n <Alert severity=\"error\">\n Unable to load this dataset&apos;s access settings. Please try again\n later.\n </Alert>\n ),\n }\n }\n\n if (allowedTransferTypes.length === 0) {\n return {\n content: (\n <Alert severity=\"error\">\n This dataset cannot currently be requested.\n </Alert>\n ),\n }\n }\n\n if (submitted) {\n return {\n content: (\n <DarSubmittedPanel\n requestCode={submitted.code}\n status={submitted.status}\n />\n ),\n actions: options?.onClose && (\n <Button variant=\"contained\" onClick={options.onClose}>\n Close\n </Button>\n ),\n }\n }\n\n const stepKeys: readonly StepKey[] = draft.workspaceRequested\n ? ['destination', 'workspace', 'project', 'about', 'complete']\n : ['destination', 'project', 'about', 'complete']\n const currentStepKey: StepKey =\n stepKeys[Math.min(draft.step, stepKeys.length - 1)]\n\n // Matches RDCA-DAP's own UI: selecting no tables is equivalent to selecting every table.\n const allDictionaries = (dictionariesQuery.data?.items ?? []).filter(\n (d): d is { code: string; name: string } => !!d.code,\n )\n const selectedDictionaries =\n draft.selectedDictionaryCodes.length > 0\n ? allDictionaries.filter(d =>\n draft.selectedDictionaryCodes.includes(d.code),\n )\n : allDictionaries\n const workspaceName = (workspacesQuery.data?.items ?? []).find(\n w => w.uuid === draft.workspaceUuid,\n )?.name\n // The Destination step only asks the user to pick a transfer type when there's more than\n // one allowed option — don't show a value on the review step for a question never asked.\n const showTransferType = allowedTransferTypes.length > 1\n const aboutAnswers = aboutRjsf\n ? summarizeFormAnswers(aboutRjsf.schema, draft.values)\n : []\n const projectAnswers = projectRjsf\n ? summarizeFormAnswers(projectRjsf.schema, draft.values)\n : []\n\n function canAdvanceFrom(stepKey: StepKey): boolean {\n switch (stepKey) {\n case 'destination':\n return (\n !!draft.transferType &&\n (draft.workspaceRequested || !!draft.workspaceUuid)\n )\n case 'workspace':\n return (\n !workspaceFormQuery.isLoading &&\n !!draft.workspaceReference?.trim() &&\n (!workspaceRjsf ||\n isSectionComplete(workspaceRjsf.schema, draft.values))\n )\n case 'about':\n return (\n !workflowQuery.isLoading &&\n (!aboutRjsf || isSectionComplete(aboutRjsf.schema, draft.values))\n )\n case 'project':\n return (\n !workflowQuery.isLoading &&\n (!projectRjsf || isSectionComplete(projectRjsf.schema, draft.values))\n )\n case 'complete':\n return draft.termsAccepted\n }\n }\n\n function goToStep(index: number) {\n setDraft(previous => ({ ...previous, step: index }))\n }\n\n function mergeValues(next: Record<string, unknown>) {\n setDraft(previous => ({\n ...previous,\n values: { ...previous.values, ...next },\n }))\n }\n\n function handleSubmit() {\n const { name, code: _formCode, ...fields } = draft.values\n submitMutation.mutate({\n code: draft.code,\n name: (name as string) ?? '',\n fields,\n transferType: draft.transferType!,\n workspaceRequested: draft.workspaceRequested,\n workspaceUuid: draft.workspaceUuid,\n workspaceReference: draft.workspaceReference,\n selectedDictionaries,\n })\n }\n\n const stepIndex = stepKeys.indexOf(currentStepKey)\n const canAdvance = canAdvanceFrom(currentStepKey)\n\n const content = (\n <>\n {unsupportedFields.length > 0 && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n This request form includes field types the portal cannot render yet (\n {unsupportedFields.map(f => f.name).join(', ')}). Please{' '}\n <Link\n href={SUPPORT_PORTAL_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n contact support\n </Link>{' '}\n — submission is disabled until this is resolved.\n </Alert>\n )}\n {currentStepKey === 'destination' && (\n <DarDestinationStep\n datasetCode={datasetCode}\n allowedTransferTypes={allowedTransferTypes}\n selectedDictionaryCodes={draft.selectedDictionaryCodes}\n onSelectedDictionaryCodesChange={codes =>\n setDraft(previous => ({\n ...previous,\n selectedDictionaryCodes: codes,\n }))\n }\n workspaceRequested={draft.workspaceRequested}\n workspaceLocation={draft.workspaceLocation}\n workspaceUuid={draft.workspaceUuid}\n onWorkspaceChange={change =>\n setDraft(previous => {\n const next = { ...previous, ...change }\n if (previous.workspaceRequested && !change.workspaceRequested) {\n // Switching from \"request a new workspace\" back to an existing one: drop\n // whatever was entered into the new-workspace form so it isn't submitted\n // against the existing-workspace's schema (that form's fields aren't valid\n // there). RDCA-DAP's workspace form re-asks some fields already collected by\n // the About/Project steps (e.g. `project_name`) — those answers still belong\n // to their own step and must survive, so only drop fields unique to the\n // workspace form.\n const sharedFieldNames = new Set([\n ...Object.keys(aboutRjsf?.schema.properties ?? {}),\n ...Object.keys(projectRjsf?.schema.properties ?? {}),\n ])\n const workspaceOnlyFieldNames = Object.keys(\n workspaceRjsf?.schema.properties ?? {},\n ).filter(name => !sharedFieldNames.has(name))\n next.values = Object.fromEntries(\n Object.entries(previous.values).filter(\n ([key]) => !workspaceOnlyFieldNames.includes(key),\n ),\n )\n next.workspaceReference = undefined\n }\n return next\n })\n }\n transferType={draft.transferType ?? allowedTransferTypes[0]}\n onTransferTypeChange={transferType =>\n setDraft(previous => ({ ...previous, transferType }))\n }\n />\n )}\n\n {currentStepKey === 'workspace' &&\n (workspaceFormQuery.isLoading ? (\n <Skeleton height={200} />\n ) : workspaceRjsf ? (\n <DarWorkspaceStep\n schema={workspaceRjsf.schema}\n uiSchema={workspaceRjsf.uiSchema}\n formData={draft.values}\n onChange={mergeValues}\n reference={draft.workspaceReference ?? ''}\n onReferenceChange={reference =>\n setDraft(previous => ({\n ...previous,\n workspaceReference: reference,\n }))\n }\n />\n ) : (\n <Alert severity=\"error\">\n Unable to load the new-workspace request form. Please try again\n later.\n </Alert>\n ))}\n\n {currentStepKey === 'project' &&\n (workflowQuery.isLoading ? (\n <Skeleton height={200} />\n ) : projectRjsf ? (\n <DarProjectStep\n schema={projectRjsf.schema}\n uiSchema={projectRjsf.uiSchema}\n formData={draft.values}\n onChange={mergeValues}\n />\n ) : (\n <Alert severity=\"error\">\n Unable to load the project section of this request form. Please try\n again later.\n </Alert>\n ))}\n\n {currentStepKey === 'about' &&\n (workflowQuery.isLoading ? (\n <Skeleton height={200} />\n ) : aboutRjsf ? (\n <DarAboutStep\n schema={aboutRjsf.schema}\n uiSchema={aboutRjsf.uiSchema}\n formData={draft.values}\n onChange={mergeValues}\n />\n ) : (\n <Alert severity=\"error\">\n Unable to load the &quot;about you&quot; section of this request\n form. Please try again later.\n </Alert>\n ))}\n\n {currentStepKey === 'complete' && (\n <DarCompleteStep\n datasetCode={datasetCode}\n datasetName={datasetName}\n selectedDictionaryNames={selectedDictionaries.map(\n d => d.name ?? d.code,\n )}\n allTablesSelected={draft.selectedDictionaryCodes.length === 0}\n workspaceRequested={draft.workspaceRequested}\n workspaceName={workspaceName}\n workspaceReference={draft.workspaceReference}\n showTransferType={showTransferType}\n transferType={draft.transferType ?? allowedTransferTypes[0]}\n aboutAnswers={aboutAnswers}\n projectAnswers={projectAnswers}\n termsAccepted={draft.termsAccepted}\n onTermsAcceptedChange={accepted =>\n setDraft(previous => ({ ...previous, termsAccepted: accepted }))\n }\n />\n )}\n\n {submitMutation.isError && (\n <Alert\n severity=\"error\"\n sx={{ mt: 2 }}\n action={\n (submitMutation.error?.httpStatus ?? 0) >= 500 ||\n !submitMutation.error?.httpStatus ? (\n <Button color=\"inherit\" size=\"small\" onClick={handleSubmit}>\n Retry\n </Button>\n ) : undefined\n }\n >\n {submitMutation.error?.message ??\n 'The request could not be submitted.'}\n </Alert>\n )}\n </>\n )\n\n const actions = (\n <>\n <Button\n disabled={stepIndex === 0}\n onClick={() => goToStep(stepIndex - 1)}\n >\n Back\n </Button>\n {currentStepKey === 'complete' ? (\n <Button\n variant=\"contained\"\n disabled={!canAdvance || unsupportedFields.length > 0}\n loading={submitMutation.isPending}\n onClick={handleSubmit}\n >\n Submit request\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n disabled={!canAdvance || unsupportedFields.length > 0}\n onClick={() => goToStep(stepIndex + 1)}\n >\n Next\n </Button>\n )}\n </>\n )\n\n return { content, actions }\n}\n\n/**\n * Full-page/standalone entry point for the DAR wizard: renders the step content and its\n * Back/Next/Submit navigation inline in a single scrolling column.\n *\n * Dialog-hosted callers (e.g. `AridhiaAccessStatus`) should use `useAridhiaDarWizardParts`\n * directly instead, so the navigation buttons can be placed in a real MUI `DialogActions`\n * footer rather than nested inside the scrollable dialog content.\n */\nexport function AridhiaDarWizard(props: AridhiaDarWizardProps) {\n const { content, actions } = useAridhiaDarWizardParts(props)\n return (\n <Box sx={{ width: '100%' }}>\n {content}\n {actions && (\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mt: 3 }}>\n {actions}\n </Box>\n )}\n </Box>\n )\n}\n\nexport { useAridhiaDarWizardParts }\n"],"mappings":"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"}
@@ -1,27 +1,28 @@
1
- import { Alert as e, Link as t, Stack as n, Typography as r } from "@mui/material";
2
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
1
+ import { RDCA_DAP_URL as e } from "../rdcaDapConstants.js";
2
+ import { Alert as t, Link as n, Stack as r, Typography as i } from "@mui/material";
3
+ import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
3
4
  //#region src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx
4
- var s = "https://portal.rdca.c-path.org/", c = "vtheurercrider@c-path.org";
5
+ var c = "vtheurercrider@c-path.org";
5
6
  function l(l) {
6
7
  let { requestCode: u, status: d } = l;
7
- return /* @__PURE__ */ o(n, {
8
+ return /* @__PURE__ */ s(r, {
8
9
  spacing: 2,
9
10
  children: [
10
- /* @__PURE__ */ a(e, {
11
+ /* @__PURE__ */ o(t, {
11
12
  severity: "success",
12
13
  children: "Your data access request was submitted."
13
14
  }),
14
- /* @__PURE__ */ o(r, { children: [
15
+ /* @__PURE__ */ s(i, { children: [
15
16
  "Request code: ",
16
- /* @__PURE__ */ a("strong", { children: u }),
17
- d && /* @__PURE__ */ o(i, { children: [" — status: ", d] })
17
+ /* @__PURE__ */ o("strong", { children: u }),
18
+ d && /* @__PURE__ */ s(a, { children: [" — status: ", d] })
18
19
  ] }),
19
- /* @__PURE__ */ a(r, { children: "Thank you for your request. The information you've provided will be shared with the appropriate reviewing committee. The review process is usually completed within 2-3 business weeks." }),
20
- /* @__PURE__ */ o(r, { children: [
20
+ /* @__PURE__ */ o(i, { children: "Thank you for your request. The information you've provided will be shared with the appropriate reviewing committee. The review process is usually completed within 2-3 business weeks." }),
21
+ /* @__PURE__ */ s(i, { children: [
21
22
  "If approved, the signatory listed in your submission will receive a required Data Use Agreement (DUA) for review and execution. You will be notified via email when the DUA has been signed and the remaining processing is complete, or you can check the status of your request at any time by logging in to",
22
23
  " ",
23
- /* @__PURE__ */ a(t, {
24
- href: s,
24
+ /* @__PURE__ */ o(n, {
25
+ href: e,
25
26
  target: "_blank",
26
27
  rel: "noopener noreferrer",
27
28
  children: "RDCA-DAP"
@@ -29,10 +30,10 @@ function l(l) {
29
30
  " ",
30
31
  "and clicking Access > My Requests."
31
32
  ] }),
32
- /* @__PURE__ */ o(r, { children: [
33
+ /* @__PURE__ */ s(i, { children: [
33
34
  "If you have any questions about your request, please contact C-Path's administrator at",
34
35
  " ",
35
- /* @__PURE__ */ a(t, {
36
+ /* @__PURE__ */ o(n, {
36
37
  href: `mailto:${c}`,
37
38
  children: c
38
39
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"DarSubmittedPanel.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx"],"sourcesContent":["import { Alert, Link as MuiLink, Stack, Typography } from '@mui/material'\n\nconst RDCA_DAP_URL = 'https://portal.rdca.c-path.org/'\nconst C_PATH_ADMIN_EMAIL = 'vtheurercrider@c-path.org'\n\nexport type DarSubmittedPanelProps = {\n requestCode: string\n status?: string\n}\n\n/**\n * Confirmation panel shown after a successful `POST /fair/requests/`. Mirrors the guidance\n * RDCA-DAP's own post-submission screen gives — timeline, the DUA step, and where to check\n * status — since this wizard has no equivalent \"My Requests\" view of its own.\n */\nexport function DarSubmittedPanel(props: DarSubmittedPanelProps) {\n const { requestCode, status } = props\n return (\n <Stack spacing={2}>\n <Alert severity=\"success\">Your data access request was submitted.</Alert>\n <Typography>\n Request code: <strong>{requestCode}</strong>\n {status && <> &mdash; status: {status}</>}\n </Typography>\n <Typography>\n Thank you for your request. The information you&apos;ve provided will be\n shared with the appropriate reviewing committee. The review process is\n usually completed within 2-3 business weeks.\n </Typography>\n <Typography>\n If approved, the signatory listed in your submission will receive a\n required Data Use Agreement (DUA) for review and execution. You will be\n notified via email when the DUA has been signed and the remaining\n processing is complete, or you can check the status of your request at\n any time by logging in to{' '}\n <MuiLink href={RDCA_DAP_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n RDCA-DAP\n </MuiLink>{' '}\n and clicking Access &gt; My Requests.\n </Typography>\n <Typography>\n If you have any questions about your request, please contact\n C-Path&apos;s administrator at{' '}\n <MuiLink href={`mailto:${C_PATH_ADMIN_EMAIL}`}>\n {C_PATH_ADMIN_EMAIL}\n </MuiLink>\n .\n </Typography>\n </Stack>\n )\n}\n"],"mappings":";;;AAEA,IAAM,IAAe,mCACf,IAAqB;AAY3B,SAAgB,EAAkB,GAA+B;CAC/D,IAAM,EAAE,gBAAa,cAAW;CAChC,OACE,kBAAC,GAAD;EAAO,SAAS;YAAhB;GACE,kBAAC,GAAD;IAAO,UAAS;cAAU;GAA8C,CAAA;GACxE,kBAAC,GAAD,EAAA,UAAA;IAAY;IACI,kBAAC,UAAD,EAAA,UAAS,EAAoB,CAAA;IAC1C,KAAU,kBAAA,GAAA,EAAA,UAAA,CAAE,eAAkB,CAAS,EAAA,CAAA;GAC9B,EAAA,CAAA;GACZ,kBAAC,GAAD,EAAA,UAAY,0LAIA,CAAA;GACZ,kBAAC,GAAD,EAAA,UAAA;IAAY;IAKgB;IAC1B,kBAAC,GAAD;KAAS,MAAM;KAAc,QAAO;KAAS,KAAI;eAAsB;IAE9D,CAAA;IAAE;IAAI;GAEL,EAAA,CAAA;GACZ,kBAAC,GAAD,EAAA,UAAA;IAAY;IAEqB;IAC/B,kBAAC,GAAD;KAAS,MAAM,UAAU;eACtB;IACM,CAAA;IAAC;GAEA,EAAA,CAAA;EACP;;AAEX"}
1
+ {"version":3,"file":"DarSubmittedPanel.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx"],"sourcesContent":["import { Alert, Link as MuiLink, Stack, Typography } from '@mui/material'\nimport { RDCA_DAP_URL } from '@/components/Aridhia/rdcaDapConstants'\n\nconst C_PATH_ADMIN_EMAIL = 'vtheurercrider@c-path.org'\n\nexport type DarSubmittedPanelProps = {\n requestCode: string\n status?: string\n}\n\n/**\n * Confirmation panel shown after a successful `POST /fair/requests/`. Mirrors the guidance\n * RDCA-DAP's own post-submission screen gives — timeline, the DUA step, and where to check\n * status — since this wizard has no equivalent \"My Requests\" view of its own.\n */\nexport function DarSubmittedPanel(props: DarSubmittedPanelProps) {\n const { requestCode, status } = props\n return (\n <Stack spacing={2}>\n <Alert severity=\"success\">Your data access request was submitted.</Alert>\n <Typography>\n Request code: <strong>{requestCode}</strong>\n {status && <> &mdash; status: {status}</>}\n </Typography>\n <Typography>\n Thank you for your request. The information you&apos;ve provided will be\n shared with the appropriate reviewing committee. The review process is\n usually completed within 2-3 business weeks.\n </Typography>\n <Typography>\n If approved, the signatory listed in your submission will receive a\n required Data Use Agreement (DUA) for review and execution. You will be\n notified via email when the DUA has been signed and the remaining\n processing is complete, or you can check the status of your request at\n any time by logging in to{' '}\n <MuiLink href={RDCA_DAP_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n RDCA-DAP\n </MuiLink>{' '}\n and clicking Access &gt; My Requests.\n </Typography>\n <Typography>\n If you have any questions about your request, please contact\n C-Path&apos;s administrator at{' '}\n <MuiLink href={`mailto:${C_PATH_ADMIN_EMAIL}`}>\n {C_PATH_ADMIN_EMAIL}\n </MuiLink>\n .\n </Typography>\n </Stack>\n )\n}\n"],"mappings":";;;;AAGA,IAAM,IAAqB;AAY3B,SAAgB,EAAkB,GAA+B;CAC/D,IAAM,EAAE,gBAAa,cAAW;CAChC,OACE,kBAAC,GAAD;EAAO,SAAS;YAAhB;GACE,kBAAC,GAAD;IAAO,UAAS;cAAU;GAA8C,CAAA;GACxE,kBAAC,GAAD,EAAA,UAAA;IAAY;IACI,kBAAC,UAAD,EAAA,UAAS,EAAoB,CAAA;IAC1C,KAAU,kBAAA,GAAA,EAAA,UAAA,CAAE,eAAkB,CAAS,EAAA,CAAA;GAC9B,EAAA,CAAA;GACZ,kBAAC,GAAD,EAAA,UAAY,0LAIA,CAAA;GACZ,kBAAC,GAAD,EAAA,UAAA;IAAY;IAKgB;IAC1B,kBAAC,GAAD;KAAS,MAAM;KAAc,QAAO;KAAS,KAAI;eAAsB;IAE9D,CAAA;IAAE;IAAI;GAEL,EAAA,CAAA;GACZ,kBAAC,GAAD,EAAA,UAAA;IAAY;IAEqB;IAC/B,kBAAC,GAAD;KAAS,MAAM,UAAU;eACtB;IACM,CAAA;IAAC;GAEA,EAAA,CAAA;EACP;;AAEX"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Explains why the user can't use the RDCA-DAP API yet. A one-time RDCA-DAP sign-in links
3
+ * the Synapse account.
4
+ */
5
+ export declare function RdcaDapEligibilityExplainer(): import("react/jsx-runtime").JSX.Element;
6
+ export type RdcaDapEligibilityDialogProps = {
7
+ open: boolean;
8
+ onClose: () => void;
9
+ };
10
+ export default function RdcaDapEligibilityDialog(props: RdcaDapEligibilityDialogProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=RdcaDapEligibilityDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RdcaDapEligibilityDialog.d.ts","sourceRoot":"","sources":["../../../src/components/Aridhia/RdcaDapEligibilityDialog.tsx"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAgB,2BAA2B,4CAa1C;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAC9C,KAAK,EAAE,6BAA6B,2CAsBrC"}
@@ -0,0 +1,37 @@
1
+ import { RDCA_DAP_URL as e } from "./rdcaDapConstants.js";
2
+ import { Button as t, Dialog as n, DialogActions as r, DialogContent as i, DialogTitle as a, Stack as o, Typography as s } from "@mui/material";
3
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
4
+ //#region src/components/Aridhia/RdcaDapEligibilityDialog.tsx
5
+ function u() {
6
+ return /* @__PURE__ */ l(o, {
7
+ spacing: 2,
8
+ children: [/* @__PURE__ */ c(s, { children: "You need a linked RDCA-DAP account before you can request access to this dataset." }), /* @__PURE__ */ c(s, { children: "To create a new account or link an existing account, open RDCA-DAP and sign in with your ALS Knowledge Portal (Synapse) account." })]
9
+ });
10
+ }
11
+ function d(o) {
12
+ let { open: s, onClose: d } = o;
13
+ return /* @__PURE__ */ l(n, {
14
+ open: s,
15
+ onClose: d,
16
+ maxWidth: "sm",
17
+ fullWidth: !0,
18
+ children: [
19
+ /* @__PURE__ */ c(a, { children: "Link your RDCA-DAP account" }),
20
+ /* @__PURE__ */ c(i, { children: /* @__PURE__ */ c(u, {}) }),
21
+ /* @__PURE__ */ l(r, { children: [/* @__PURE__ */ c(t, {
22
+ onClick: d,
23
+ children: "Close"
24
+ }), /* @__PURE__ */ c(t, {
25
+ variant: "contained",
26
+ href: e,
27
+ target: "_blank",
28
+ rel: "noopener noreferrer",
29
+ children: "Go to RDCA-DAP"
30
+ })] })
31
+ ]
32
+ });
33
+ }
34
+ //#endregion
35
+ export { u as RdcaDapEligibilityExplainer, d as default };
36
+
37
+ //# sourceMappingURL=RdcaDapEligibilityDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RdcaDapEligibilityDialog.js","names":[],"sources":["../../../src/components/Aridhia/RdcaDapEligibilityDialog.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Stack,\n Typography,\n} from '@mui/material'\nimport { RDCA_DAP_URL } from './rdcaDapConstants'\n\n/**\n * Explains why the user can't use the RDCA-DAP API yet. A one-time RDCA-DAP sign-in links\n * the Synapse account.\n */\nexport function RdcaDapEligibilityExplainer() {\n return (\n <Stack spacing={2}>\n <Typography>\n You need a linked RDCA-DAP account before you can request access to this\n dataset.\n </Typography>\n <Typography>\n To create a new account or link an existing account, open RDCA-DAP and\n sign in with your ALS Knowledge Portal (Synapse) account.\n </Typography>\n </Stack>\n )\n}\n\nexport type RdcaDapEligibilityDialogProps = {\n open: boolean\n onClose: () => void\n}\n\nexport default function RdcaDapEligibilityDialog(\n props: RdcaDapEligibilityDialogProps,\n) {\n const { open, onClose } = props\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Link your RDCA-DAP account</DialogTitle>\n <DialogContent>\n <RdcaDapEligibilityExplainer />\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>Close</Button>\n <Button\n variant=\"contained\"\n href={RDCA_DAP_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Go to RDCA-DAP\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n"],"mappings":";;;;AAeA,SAAgB,IAA8B;CAC5C,OACE,kBAAC,GAAD;EAAO,SAAS;YAAhB,CACE,kBAAC,GAAD,EAAA,UAAY,oFAGA,CAAA,GACZ,kBAAC,GAAD,EAAA,UAAY,mIAGA,CAAA,CACP;;AAEX;AAOA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,SAAM,eAAY;CAC1B,OACE,kBAAC,GAAD;EAAc;EAAe;EAAS,UAAS;EAAK,WAAA;YAApD;GACE,kBAAC,GAAD,EAAA,UAAa,6BAAuC,CAAA;GACpD,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,CAA8B,CAAA,EACjB,CAAA;GACf,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAQ,SAAS;cAAS;GAAa,CAAA,GACvC,kBAAC,GAAD;IACE,SAAQ;IACR,MAAM;IACN,QAAO;IACP,KAAI;cACL;GAEO,CAAA,CACK,EAAA,CAAA;EACT;;AAEZ"}
@@ -3,7 +3,7 @@ import { RestrictionUiType as e } from "../HasAccess/AccessIcon.js";
3
3
  function t(t) {
4
4
  if (!t) return e.AccessBlockedByRestriction;
5
5
  switch (t.status) {
6
- case "approved": return e.Accessible;
6
+ case "approved": return e.AccessibleOnRDCADAP;
7
7
  case "pending": return e.AccessBlockedByRestrictionWithPendingRDCADAPRequest;
8
8
  case "denied": return e.AccessBlockedByRestrictionWithRejectedRDCADAPRequest;
9
9
  case "error": return e.AccessBlockedByACL;
@@ -11,7 +11,7 @@ function t(t) {
11
11
  }
12
12
  }
13
13
  function n(e, t) {
14
- let n = e.filter((e) => e.datasets?.code === t);
14
+ let n = e.filter((e) => e.datasets?.some((e) => e.code === t));
15
15
  if (n.length !== 0) return n.reduce((e, t) => e.updated_at ? t.updated_at && t.updated_at > e.updated_at ? t : e : t);
16
16
  }
17
17
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"aridhiaAccessStatusUtils.js","names":[],"sources":["../../../src/components/Aridhia/aridhiaAccessStatusUtils.ts"],"sourcesContent":["import { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { RequestListItem } from '@sage-bionetworks/aridhia-client/generated/models'\n\n/**\n * Maps an Aridhia request status to the appropriate RestrictionUiType for display.\n *\n * @param request - The Aridhia request object, or undefined if no request exists\n * @returns The appropriate RestrictionUiType based on the request status\n */\nexport function getRestrictionUiTypeFromAridhiaRequest(\n request: RequestListItem | undefined,\n): RestrictionUiType {\n if (!request) {\n // No request found - user needs to request access\n return RestrictionUiType.AccessBlockedByRestriction\n }\n\n switch (request.status) {\n case 'approved':\n return RestrictionUiType.Accessible\n case 'pending':\n return RestrictionUiType.AccessBlockedByRestrictionWithPendingRDCADAPRequest\n case 'denied':\n return RestrictionUiType.AccessBlockedByRestrictionWithRejectedRDCADAPRequest\n case 'error':\n return RestrictionUiType.AccessBlockedByACL\n default:\n return RestrictionUiType.AccessBlockedByRestriction\n }\n}\n\n/**\n * Finds the Aridhia request for a specific dataset from a list of requests.\n * If multiple requests match, returns the most recently updated one.\n *\n * @param requests - Array of Aridhia requests\n * @param datasetCode - The dataset code to search for\n * @returns The most recently updated request that contains the specified dataset, or undefined if not found\n */\nexport function findRequestForDataset(\n requests: RequestListItem[],\n datasetCode: string,\n): RequestListItem | undefined {\n const matchingRequests = requests.filter(\n request => request.datasets?.code === datasetCode,\n )\n\n if (matchingRequests.length === 0) {\n return undefined\n }\n\n // Return the most recently updated request\n return matchingRequests.reduce((mostRecent, current) => {\n if (!mostRecent.updated_at) {\n return current\n }\n if (!current.updated_at) {\n return mostRecent\n }\n return current.updated_at > mostRecent.updated_at ? current : mostRecent\n })\n}\n"],"mappings":";;AASA,SAAgB,EACd,GACmB;CACnB,IAAI,CAAC,GAEH,OAAO,EAAkB;CAG3B,QAAQ,EAAQ,QAAhB;EACE,KAAK,YACH,OAAO,EAAkB;EAC3B,KAAK,WACH,OAAO,EAAkB;EAC3B,KAAK,UACH,OAAO,EAAkB;EAC3B,KAAK,SACH,OAAO,EAAkB;EAC3B,SACE,OAAO,EAAkB;CAC7B;AACF;AAUA,SAAgB,EACd,GACA,GAC6B;CAC7B,IAAM,IAAmB,EAAS,QAChC,MAAW,EAAQ,UAAU,SAAS,CACxC;CAEI,MAAiB,WAAW,GAKhC,OAAO,EAAiB,QAAQ,GAAY,MACrC,EAAW,aAGX,EAAQ,cAGN,EAAQ,aAAa,EAAW,aAAa,IAAU,IALrD,CAMV;AACH"}
1
+ {"version":3,"file":"aridhiaAccessStatusUtils.js","names":[],"sources":["../../../src/components/Aridhia/aridhiaAccessStatusUtils.ts"],"sourcesContent":["import { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { RequestListItem } from '@sage-bionetworks/aridhia-client/generated/models'\n\n/**\n * Maps an Aridhia request status to the appropriate RestrictionUiType for display.\n *\n * @param request - The Aridhia request object, or undefined if no request exists\n * @returns The appropriate RestrictionUiType based on the request status\n */\nexport function getRestrictionUiTypeFromAridhiaRequest(\n request: RequestListItem | undefined,\n): RestrictionUiType {\n if (!request) {\n // No request found - user needs to request access\n return RestrictionUiType.AccessBlockedByRestriction\n }\n\n switch (request.status) {\n case 'approved':\n return RestrictionUiType.AccessibleOnRDCADAP\n case 'pending':\n return RestrictionUiType.AccessBlockedByRestrictionWithPendingRDCADAPRequest\n case 'denied':\n return RestrictionUiType.AccessBlockedByRestrictionWithRejectedRDCADAPRequest\n case 'error':\n return RestrictionUiType.AccessBlockedByACL\n default:\n return RestrictionUiType.AccessBlockedByRestriction\n }\n}\n\n/**\n * Finds the Aridhia request for a specific dataset from a list of requests.\n * If multiple requests match, returns the most recently updated one.\n *\n * @param requests - Array of Aridhia requests\n * @param datasetCode - The dataset code to search for\n * @returns The most recently updated request that contains the specified dataset, or undefined if not found\n */\nexport function findRequestForDataset(\n requests: RequestListItem[],\n datasetCode: string,\n): RequestListItem | undefined {\n const matchingRequests = requests.filter(request =>\n request.datasets?.some(dataset => dataset.code === datasetCode),\n )\n\n if (matchingRequests.length === 0) {\n return undefined\n }\n\n // Return the most recently updated request\n return matchingRequests.reduce((mostRecent, current) => {\n if (!mostRecent.updated_at) {\n return current\n }\n if (!current.updated_at) {\n return mostRecent\n }\n return current.updated_at > mostRecent.updated_at ? current : mostRecent\n })\n}\n"],"mappings":";;AASA,SAAgB,EACd,GACmB;CACnB,IAAI,CAAC,GAEH,OAAO,EAAkB;CAG3B,QAAQ,EAAQ,QAAhB;EACE,KAAK,YACH,OAAO,EAAkB;EAC3B,KAAK,WACH,OAAO,EAAkB;EAC3B,KAAK,UACH,OAAO,EAAkB;EAC3B,KAAK,SACH,OAAO,EAAkB;EAC3B,SACE,OAAO,EAAkB;CAC7B;AACF;AAUA,SAAgB,EACd,GACA,GAC6B;CAC7B,IAAM,IAAmB,EAAS,QAAO,MACvC,EAAQ,UAAU,MAAK,MAAW,EAAQ,SAAS,CAAW,CAChE;CAEI,MAAiB,WAAW,GAKhC,OAAO,EAAiB,QAAQ,GAAY,MACrC,EAAW,aAGX,EAAQ,cAGN,EAAQ,aAAa,EAAW,aAAa,IAAU,IALrD,CAMV;AACH"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Builds a link to a dataset's page on the RDCA-DAP FAIR portal's browsable UI.
3
+ */
4
+ export declare function getAridhiaFairPortalDatasetUrl(fairPortalUrl: string, datasetCode: string): string;
5
+ /**
6
+ * Builds a link to a specific data access request's page on the RDCA-DAP FAIR portal's
7
+ * browsable UI.
8
+ */
9
+ export declare function getAridhiaFairPortalRequestUrl(fairPortalUrl: string, requestCode: string): string;
10
+ //# sourceMappingURL=aridhiaFairPortalUrls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aridhiaFairPortalUrls.d.ts","sourceRoot":"","sources":["../../../src/components/Aridhia/aridhiaFairPortalUrls.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER"}
@@ -0,0 +1,11 @@
1
+ //#region src/components/Aridhia/aridhiaFairPortalUrls.ts
2
+ function e(e, t) {
3
+ return `${e}/#/data/datasets/${t}`;
4
+ }
5
+ function t(e, t) {
6
+ return `${e}/#/data/requests/${t}`;
7
+ }
8
+ //#endregion
9
+ export { e as getAridhiaFairPortalDatasetUrl, t as getAridhiaFairPortalRequestUrl };
10
+
11
+ //# sourceMappingURL=aridhiaFairPortalUrls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aridhiaFairPortalUrls.js","names":[],"sources":["../../../src/components/Aridhia/aridhiaFairPortalUrls.ts"],"sourcesContent":["/**\n * Builds a link to a dataset's page on the RDCA-DAP FAIR portal's browsable UI.\n */\nexport function getAridhiaFairPortalDatasetUrl(\n fairPortalUrl: string,\n datasetCode: string,\n): string {\n return `${fairPortalUrl}/#/data/datasets/${datasetCode}`\n}\n\n/**\n * Builds a link to a specific data access request's page on the RDCA-DAP FAIR portal's\n * browsable UI.\n */\nexport function getAridhiaFairPortalRequestUrl(\n fairPortalUrl: string,\n requestCode: string,\n): string {\n return `${fairPortalUrl}/#/data/requests/${requestCode}`\n}\n"],"mappings":";AAGA,SAAgB,EACd,GACA,GACQ;CACR,OAAO,GAAG,EAAc,mBAAmB;AAC7C;AAMA,SAAgB,EACd,GACA,GACQ;CACR,OAAO,GAAG,EAAc,mBAAmB;AAC7C"}
@@ -0,0 +1,3 @@
1
+ /** Base URL of RDCA-DAP's own sign-in/browsable UI (not the FAIR portal — see `aridhiaFairPortalUrls.ts`). */
2
+ export declare const RDCA_DAP_URL = "https://portal.rdca.c-path.org/";
3
+ //# sourceMappingURL=rdcaDapConstants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rdcaDapConstants.d.ts","sourceRoot":"","sources":["../../../src/components/Aridhia/rdcaDapConstants.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,eAAO,MAAM,YAAY,oCAAoC,CAAA"}
@@ -0,0 +1,6 @@
1
+ //#region src/components/Aridhia/rdcaDapConstants.ts
2
+ var e = "https://portal.rdca.c-path.org/";
3
+ //#endregion
4
+ export { e as RDCA_DAP_URL };
5
+
6
+ //# sourceMappingURL=rdcaDapConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rdcaDapConstants.js","names":[],"sources":["../../../src/components/Aridhia/rdcaDapConstants.ts"],"sourcesContent":["/** Base URL of RDCA-DAP's own sign-in/browsable UI (not the FAIR portal — see `aridhiaFairPortalUrls.ts`). */\nexport const RDCA_DAP_URL = 'https://portal.rdca.c-path.org/'\n"],"mappings":";AACA,IAAa,IAAe"}
@@ -1 +1 @@
1
- ._dataExplorerTitle_1ezpn_1.MuiTypography-root{color:var(--data-explorer-title-color,var(--synapse-primary-action-color));font-size:36px;line-height:40px}._dataExplorerSubtitle_1ezpn_7.MuiTypography-root{line-height:140%}@media (width>=1024px){._dataExplorerButton_1ezpn_12{width:fit-content}}._dataExplorerTextContainer_1ezpn_17{gap:16px}@media (width>=1024px){._dataExplorerTextContainer_1ezpn_17{flex:0 0 30%;max-width:30%}}._dataExplorerContainer_1ezpn_27{flex-direction:column;flex:1 0 0;align-items:flex-start;gap:60px;padding:40px 0;display:flex}@media (width>=1024px){._dataExplorerContainer_1ezpn_27{flex-direction:row}}._dataContainer_1ezpn_41{flex:60%;grid-template-rows:repeat(9,fit-content(100%));grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;min-width:0;display:inline-grid}._dataRowTitle_1ezpn_51{color:var(--synapse-primary-action-color,#4d558d);overflow-wrap:break-word;word-break:break-word;flex:0 auto;min-width:0;font-size:16px;font-weight:400;line-height:26.4px}@media (width>=1024px){._dataRowTitle_1ezpn_51{font-size:19.8px}}._dataRowInner_1ezpn_67{flex:1;justify-content:space-between;align-items:center;min-width:0;display:flex}._dataRow_1ezpn_51{border:1px solid #0000;border-radius:3.3px;justify-content:space-between;justify-self:stretch;align-items:center;gap:17.6px;min-height:66.6px;padding:8.8px 26.4px;transition:background-color .2s,border-color .2s,box-shadow .2s,transform .2s;display:flex;position:relative;text-decoration:none!important}._dataRow_1ezpn_51:hover{z-index:1;background-color:#fff;border-color:#e1e1e1;transform:scale(1.1);box-shadow:0 4px 8px #0000001a}._dataRow_1ezpn_51:hover ._viewCta_1ezpn_96{opacity:1;pointer-events:auto}._dataRowLeft_1ezpn_101{flex:1;align-items:center;gap:16px;min-width:0;display:inline-flex}._iconContainer_1ezpn_109{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:49px;height:49px;display:flex}._dataRowNamePill_1ezpn_119{flex:1 1 0;align-items:center;gap:8px;min-width:0;display:flex}._facetCount_1ezpn_127{color:#787090;border:1px solid #d8d5e0;border-radius:80px;flex-shrink:0;justify-content:center;align-items:center;gap:10px;padding:4px 8px;font-size:14px;font-weight:400;line-height:24px;display:flex}._viewCta_1ezpn_96{opacity:0;white-space:nowrap;color:var(--synapse-primary-action-color,#4d558d);background:linear-gradient(90deg,#0000,#fff 25% 100%);border-radius:0 2px 2px 0;align-items:center;gap:4px;padding-left:40px;padding-right:26.4px;transition:opacity .2s;display:inline-flex;position:absolute;top:0;bottom:0;right:0}._viewCtaText_1ezpn_160{color:var(--synapse-primary-action-color,#4d558d);font-size:16px;font-weight:400;line-height:26.4px}._viewCtaIcon_1ezpn_167.MuiSvgIcon-root{color:var(--synapse-primary-action-color,#5a488f);font-size:24px}
1
+ ._dataExplorerTitle_1d57f_1.MuiTypography-root{color:var(--data-explorer-title-color,var(--synapse-primary-action-color));font-size:36px;line-height:40px}._dataExplorerSubtitle_1d57f_7.MuiTypography-root{line-height:140%}@media (width>=1024px){._dataExplorerButton_1d57f_12{width:fit-content}}._dataExplorerTextContainer_1d57f_17{gap:16px}@media (width>=1024px){._dataExplorerTextContainer_1d57f_17{flex:0 0 30%;max-width:30%}}._dataExplorerContainer_1d57f_27{flex-direction:column;flex:1 0 0;align-items:flex-start;gap:20px;padding:40px 0;display:flex}@media (width>=1024px){._dataExplorerContainer_1d57f_27{flex-direction:row;gap:60px}}._dataContainer_1d57f_42{flex:60%;grid-template-rows:repeat(9,fit-content(100%));grid-template-columns:minmax(0,1fr);align-self:stretch;gap:8px;width:100%;min-width:0;display:grid}@media (width>=1024px){._dataContainer_1d57f_42{grid-template-columns:repeat(2,minmax(0,1fr))}}._dataRowTitle_1d57f_59{color:var(--synapse-primary-action-color,#4d558d);overflow-wrap:break-word;word-break:break-word;flex:0 auto;min-width:0;font-size:16px;font-weight:400;line-height:26.4px}@media (width>=1024px){._dataRowTitle_1d57f_59{font-size:19.8px}}._dataRowInner_1d57f_75{flex:1;justify-content:space-between;align-items:center;min-width:0;display:flex}._dataRow_1d57f_59{border:1px solid #0000;border-radius:3.3px;justify-content:space-between;justify-self:stretch;align-items:center;gap:17.6px;min-height:66.6px;padding:6px 12px;transition:background-color .2s,border-color .2s,box-shadow .2s,transform .2s;display:flex;position:relative;text-decoration:none!important}._dataRow_1d57f_59 ._dataRowTitle_1d57f_59{text-decoration:underline}@media (width>=1024px){._dataRow_1d57f_59{padding:8.8px 26.4px}._dataRow_1d57f_59 ._dataRowTitle_1d57f_59{text-decoration:none}}._dataRow_1d57f_59:hover,._dataRow_1d57f_59:active{z-index:1;background-color:#fff;border-color:#e1e1e1;box-shadow:0 4px 8px #0000001a}._dataRow_1d57f_59:hover ._viewCta_1d57f_114,._dataRow_1d57f_59:active ._viewCta_1d57f_114{opacity:1;pointer-events:auto}@media (width>=1024px){._dataRow_1d57f_59{transform:scale(1.1)}}._dataRowLeft_1d57f_124{flex:1;align-items:center;gap:16px;min-width:0;display:inline-flex}._iconContainer_1d57f_132{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:49px;height:49px;display:flex}._dataRowNamePill_1d57f_142{flex:1 1 0;align-items:center;gap:8px;min-width:0;display:flex}._facetCount_1d57f_150{color:#787090;border:1px solid #d8d5e0;border-radius:80px;flex-shrink:0;justify-content:center;align-items:center;gap:10px;padding:4px 8px;font-size:14px;font-weight:400;line-height:24px;display:flex}._viewCta_1d57f_114{opacity:0;white-space:nowrap;color:var(--synapse-primary-action-color,#4d558d);background:linear-gradient(90deg,#0000,#fff 25% 100%);border-radius:0 2px 2px 0;align-items:center;gap:4px;padding-left:40px;padding-right:26.4px;transition:opacity .2s;display:inline-flex;position:absolute;top:0;bottom:0;right:0}._viewCtaText_1d57f_183{color:var(--synapse-primary-action-color,#4d558d);font-size:16px;font-weight:400;line-height:26.4px}._viewCtaIcon_1d57f_190.MuiSvgIcon-root{color:var(--synapse-primary-action-color,#5a488f);font-size:24px}
@@ -1 +1 @@
1
- {"version":3,"file":"DataExplorer.d.ts","sourceRoot":"","sources":["../../../src/components/DataExplorer/DataExplorer.tsx"],"names":[],"mappings":"AAkBA,KAAK,iBAAiB,GAAG;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAUD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,GAAG,EACH,KAAK,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,QAAQ,GACT,EAAE,iBAAiB,2CAyMnB"}
1
+ {"version":3,"file":"DataExplorer.d.ts","sourceRoot":"","sources":["../../../src/components/DataExplorer/DataExplorer.tsx"],"names":[],"mappings":"AAwBA,KAAK,iBAAiB,GAAG;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAUD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,GAAG,EACH,KAAK,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,QAAQ,GACT,EAAE,iBAAiB,2CA2MnB"}
@@ -12,112 +12,112 @@ import o from "../ImageFromSynapseTable.js";
12
12
  import s from "./DataExplorer.module.js";
13
13
  import { useEffect as c, useMemo as l, useState as u } from "react";
14
14
  import { orderBy as d } from "lodash-es";
15
- import { Button as f, Stack as p, Typography as m } from "@mui/material";
16
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
17
- import _ from "@mui/icons-material/ArrowForward";
15
+ import { Button as f, Stack as p, Typography as m, useMediaQuery as h, useTheme as g } from "@mui/material";
16
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
17
+ import y from "@mui/icons-material/ArrowForward";
18
18
  //#region src/components/DataExplorer/DataExplorer.tsx
19
- function v({ sql: v, title: y, subtitle: b, buttonText: x, buttonLink: S, explorePath: C, exploreQuerySql: w, facetSql: T }) {
20
- let E = y || b || x, D = r(S), O = e(v), k = e(T ?? ""), A = {
19
+ function b({ sql: b, title: x, subtitle: S, buttonText: C, buttonLink: w, explorePath: T, exploreQuerySql: E, facetSql: D }) {
20
+ let O = x || S || C, k = r(w), A = h(g().breakpoints.down("sm")), j = e(b), M = e(D ?? ""), N = {
21
21
  partMask: 5,
22
22
  concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest",
23
- entityId: O,
24
- query: { sql: v }
25
- }, j = {
23
+ entityId: j,
24
+ query: { sql: b }
25
+ }, P = {
26
26
  partMask: 32,
27
27
  concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest",
28
- entityId: k,
29
- query: { sql: T ?? "" }
30
- }, { data: M } = n(A), N = l(() => M?.queryResult?.queryResults.rows ?? [], [M]), { data: P } = n(j, { enabled: !!T }), F = t("datatype", M), I = t("icon", M), L = t("hexColor", M), R = t("order", M), z = t("columnName", M), B = (e, t) => t ? `${t}::${e}` : e, [V, H] = u({});
28
+ entityId: M,
29
+ query: { sql: D ?? "" }
30
+ }, { data: F } = n(N), I = l(() => F?.queryResult?.queryResults.rows ?? [], [F]), { data: L } = n(P, { enabled: !!D }), R = t("datatype", F), z = t("icon", F), B = t("hexColor", F), V = t("order", F), H = t("columnName", F), U = (e, t) => t ? `${t}::${e}` : e, [W, G] = u({});
31
31
  c(() => {
32
- !C || !w || Promise.all(N.map((e) => {
33
- let t = e.values[F]?.trim() ?? "", n = e.values[z]?.trim() ?? "", r = B(t, n);
34
- return !t || !n ? Promise.resolve([r, C]) : i(C, w, [{
32
+ !T || !E || Promise.all(I.map((e) => {
33
+ let t = e.values[R]?.trim() ?? "", n = e.values[H]?.trim() ?? "", r = U(t, n);
34
+ return !t || !n ? Promise.resolve([r, T]) : i(T, E, [{
35
35
  facet: n,
36
36
  facetValue: t
37
37
  }]).then((e) => [r, e]);
38
- })).then((e) => H(Object.fromEntries(e)));
38
+ })).then((e) => G(Object.fromEntries(e)));
39
39
  }, [
40
- N,
41
- F,
42
- z,
43
- C,
44
- w
40
+ I,
41
+ R,
42
+ H,
43
+ T,
44
+ E
45
45
  ]);
46
- let U = l(() => {
47
- let e = a(P), t = /* @__PURE__ */ new Map();
46
+ let K = l(() => {
47
+ let e = a(L), t = /* @__PURE__ */ new Map();
48
48
  for (let n of e) t.set(n.columnName, new Map(n.facetValues.map((e) => [e.value, e.count])));
49
49
  return t;
50
- }, [P]), W = (e, t) => t ? U.get(t)?.get(e) : void 0, G = d(N, [(e) => Number(e.values[R] ?? 2 ** 53 - 1), (e) => W(e.values[F]?.trim() ?? "", e.values[z]?.trim() ?? "") ?? 0], ["asc", "desc"]);
51
- return /* @__PURE__ */ g("div", {
50
+ }, [L]), q = (e, t) => t ? K.get(t)?.get(e) : void 0, J = d(I, [(e) => Number(e.values[V] ?? 2 ** 53 - 1), (e) => q(e.values[R]?.trim() ?? "", e.values[H]?.trim() ?? "") ?? 0], ["asc", "desc"]);
51
+ return /* @__PURE__ */ v("div", {
52
52
  className: s.dataExplorerContainer,
53
- children: [E && /* @__PURE__ */ g(p, {
53
+ children: [O && /* @__PURE__ */ v(p, {
54
54
  className: s.dataExplorerTextContainer,
55
55
  children: [
56
- y && /* @__PURE__ */ h(m, {
56
+ x && /* @__PURE__ */ _(m, {
57
57
  variant: "headline1",
58
58
  className: s.dataExplorerTitle,
59
- children: y
59
+ children: x
60
60
  }),
61
- b && /* @__PURE__ */ h(m, {
61
+ S && /* @__PURE__ */ _(m, {
62
62
  variant: "body1",
63
63
  component: "div",
64
64
  className: s.dataExplorerSubtitle,
65
- children: b
65
+ children: S
66
66
  }),
67
- x && /* @__PURE__ */ h(f, {
67
+ C && /* @__PURE__ */ _(f, {
68
68
  variant: "contained",
69
69
  className: s.dataExplorerButton,
70
- ...D,
71
- children: x
70
+ ...k,
71
+ children: C
72
72
  })
73
73
  ]
74
- }), /* @__PURE__ */ h("div", {
74
+ }), /* @__PURE__ */ _("div", {
75
75
  className: s.dataContainer,
76
- children: G.map((e) => {
77
- let t = e.values[F]?.trim() ?? "", n = e.values[L] ?? void 0, r = e.values[z]?.trim() ?? "", i = V[B(t, r)], a = W(t, r);
78
- return /* @__PURE__ */ h("a", {
76
+ children: J.map((e) => {
77
+ let t = e.values[R]?.trim() ?? "", n = e.values[B] ?? void 0, r = e.values[H]?.trim() ?? "", i = W[U(t, r)], a = q(t, r);
78
+ return /* @__PURE__ */ _("a", {
79
79
  className: s.dataRow,
80
80
  href: i,
81
- children: /* @__PURE__ */ g("div", {
81
+ children: /* @__PURE__ */ v("div", {
82
82
  className: s.dataRowInner,
83
- children: [/* @__PURE__ */ g("div", {
83
+ children: [/* @__PURE__ */ v("div", {
84
84
  className: s.dataRowLeft,
85
- children: [/* @__PURE__ */ h("div", {
85
+ children: [/* @__PURE__ */ _("div", {
86
86
  className: s.iconContainer,
87
87
  style: n ? { backgroundColor: n } : void 0,
88
- children: /* @__PURE__ */ h(o, {
89
- tableId: O,
90
- fileHandleId: e.values[I],
88
+ children: /* @__PURE__ */ _(o, {
89
+ tableId: j,
90
+ fileHandleId: e.values[z],
91
91
  alt: t,
92
92
  style: {
93
93
  width: 49,
94
94
  height: 49
95
95
  }
96
96
  })
97
- }), /* @__PURE__ */ g("div", {
97
+ }), /* @__PURE__ */ v("div", {
98
98
  className: s.dataRowNamePill,
99
- children: [/* @__PURE__ */ h(m, {
99
+ children: [/* @__PURE__ */ _(m, {
100
100
  className: s.dataRowTitle,
101
101
  children: t
102
- }), a && /* @__PURE__ */ h("div", {
102
+ }), a && /* @__PURE__ */ _("div", {
103
103
  className: s.facetCount,
104
104
  children: a
105
105
  })]
106
106
  })]
107
- }), i && /* @__PURE__ */ g("div", {
107
+ }), i && !A && /* @__PURE__ */ v("div", {
108
108
  className: s.viewCta,
109
- children: [/* @__PURE__ */ h("span", {
109
+ children: [/* @__PURE__ */ _("span", {
110
110
  className: s.viewCtaText,
111
111
  children: "View"
112
- }), /* @__PURE__ */ h(_, { className: s.viewCtaIcon })]
112
+ }), /* @__PURE__ */ _(y, { className: s.viewCtaIcon })]
113
113
  })]
114
114
  })
115
- }, B(t, r));
115
+ }, U(t, r));
116
116
  })
117
117
  })]
118
118
  });
119
119
  }
120
120
  //#endregion
121
- export { v as default };
121
+ export { b as default };
122
122
 
123
123
  //# sourceMappingURL=DataExplorer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataExplorer.js","names":[],"sources":["../../../src/components/DataExplorer/DataExplorer.tsx"],"sourcesContent":["import { Button, Typography, Stack } from '@mui/material'\nimport { useEffect, useMemo, useState } from 'react'\nimport styles from './DataExplorer.module.scss'\nimport { useSmartLink } from '../SmartLink/useSmartLink'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport {\n QueryBundleRequest,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { SynapseConstants } from '@/utils'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { generateEncodedPathAndQueryForSelectedFacetURL } from '../QueryWrapper'\nimport ImageFromSynapseTable from '../ImageFromSynapseTable'\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward'\nimport { getFacets } from '../widgets/facet-nav/useFacetPlots'\nimport { orderBy } from 'lodash-es'\n\ntype DataExplorerProps = {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n buttonText?: string\n buttonLink?: string\n sql: string\n explorePath?: string\n exploreQuerySql?: string\n facetSql?: string\n}\n\nenum ExpectedColumns {\n DATATYPE = 'datatype',\n ICON = 'icon',\n HEX_COLOR = 'hexColor',\n ORDER = 'order',\n COLUMN_NAME = 'columnName',\n}\n\n/**\n * DataExplorer\n *\n * A reusable component that renders a list of data types/categories with associated icons.\n * It drives navigation by linking each row to a pre-filtered exploration view.\n *\n * How it works:\n * 1. `sql`: Fetches a configuration table defining the display categories,\n * their display order, hex colors, and icons.\n * 2. `facetSql`: Fetches real-time counts for these categories from the actual\n * underlying data table.\n * 3. Links are dynamically built to point to a target path (`explorePath`) pre-filtered to the\n * clicked category.\n */\nexport default function DataExplorer({\n sql,\n title,\n subtitle,\n buttonText,\n buttonLink,\n explorePath,\n exploreQuerySql,\n facetSql,\n}: DataExplorerProps) {\n const hasTextSection = title || subtitle || buttonText\n const smartLinkProps = useSmartLink(buttonLink)\n\n const entityId = parseEntityIdFromSqlStatement(sql)\n const facetEntityId = parseEntityIdFromSqlStatement(facetSql ?? '')\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n },\n }\n\n const facetQueryRequest: QueryBundleRequest = {\n partMask: SynapseConstants.BUNDLE_MASK_QUERY_FACETS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: facetEntityId,\n query: {\n sql: facetSql ?? '',\n },\n }\n\n const { data: queryResultBundle } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const dataRows = useMemo(\n () => queryResultBundle?.queryResult?.queryResults.rows ?? [],\n [queryResultBundle],\n )\n\n const { data: facetQueryResultBundle } = useGetQueryResultBundle(\n facetQueryRequest,\n { enabled: Boolean(facetSql) },\n )\n\n const datatypeColIndex = getFieldIndex(\n ExpectedColumns.DATATYPE,\n queryResultBundle,\n )\n\n const iconColIndex = getFieldIndex(ExpectedColumns.ICON, queryResultBundle)\n\n const hexColorColIndex = getFieldIndex(\n ExpectedColumns.HEX_COLOR,\n queryResultBundle,\n )\n\n const orderColIndex = getFieldIndex(ExpectedColumns.ORDER, queryResultBundle)\n\n const columnNameColIndex = getFieldIndex(\n ExpectedColumns.COLUMN_NAME,\n queryResultBundle,\n )\n\n // Key rows by columnName + dataType to prevent collisions when the same dataType appears in multiple columns.\n const getRowKey = (dataType: string, columnName: string) =>\n columnName ? `${columnName}::${dataType}` : dataType\n\n const [rowUrls, setRowUrls] = useState<Record<string, string>>({})\n\n useEffect(() => {\n if (!explorePath || !exploreQuerySql) return\n Promise.all(\n dataRows.map(row => {\n const dataType = row.values[datatypeColIndex]?.trim() ?? ''\n const columnName = row.values[columnNameColIndex]?.trim() ?? ''\n const rowKey = getRowKey(dataType, columnName)\n if (!dataType || !columnName)\n return Promise.resolve([rowKey, explorePath] as const)\n return generateEncodedPathAndQueryForSelectedFacetURL(\n explorePath,\n exploreQuerySql,\n [{ facet: columnName, facetValue: dataType }],\n ).then(url => [rowKey, url] as const)\n }),\n ).then(entries => setRowUrls(Object.fromEntries(entries)))\n }, [\n dataRows,\n datatypeColIndex,\n columnNameColIndex,\n explorePath,\n exploreQuerySql,\n ])\n\n // Create a map of facet counts by column name and data type for quick lookup\n const facetCountsByColumn = useMemo(() => {\n const facets = getFacets(\n facetQueryResultBundle,\n ) as FacetColumnResultValues[]\n const map = new Map<string, Map<string, number>>()\n for (const facet of facets) {\n map.set(\n facet.columnName,\n new Map(facet.facetValues.map(fv => [fv.value, fv.count])),\n )\n }\n return map\n }, [facetQueryResultBundle])\n\n const getFacetCount = (dataType: string, columnName?: string) =>\n columnName ? facetCountsByColumn.get(columnName)?.get(dataType) : undefined\n\n // Sort by order column ascending, then by facet count descending\n const sortedRows = orderBy(\n dataRows,\n [\n row => Number(row.values[orderColIndex] ?? Number.MAX_SAFE_INTEGER),\n row =>\n getFacetCount(\n row.values[datatypeColIndex]?.trim() ?? '',\n row.values[columnNameColIndex]?.trim() ?? '',\n ) ?? 0,\n ],\n ['asc', 'desc'],\n )\n\n return (\n <div className={styles.dataExplorerContainer}>\n {hasTextSection && (\n <Stack className={styles.dataExplorerTextContainer}>\n {title && (\n <Typography\n variant=\"headline1\"\n className={styles.dataExplorerTitle}\n >\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography\n variant=\"body1\"\n component=\"div\"\n className={styles.dataExplorerSubtitle}\n >\n {subtitle}\n </Typography>\n )}\n {buttonText && (\n <Button\n variant=\"contained\"\n className={styles.dataExplorerButton}\n {...smartLinkProps}\n >\n {buttonText}\n </Button>\n )}\n </Stack>\n )}\n <div className={styles.dataContainer}>\n {sortedRows.map(row => {\n const dataType = row.values[datatypeColIndex]?.trim() ?? ''\n const hexColor = row.values[hexColorColIndex] ?? undefined\n const columnName = row.values[columnNameColIndex]?.trim() ?? ''\n const rowUrl = rowUrls[getRowKey(dataType, columnName)]\n const facetCount = getFacetCount(dataType, columnName)\n return (\n <a\n key={getRowKey(dataType, columnName)}\n className={styles.dataRow}\n href={rowUrl}\n >\n <div className={styles.dataRowInner}>\n <div className={styles.dataRowLeft}>\n <div\n className={styles.iconContainer}\n style={hexColor ? { backgroundColor: hexColor } : undefined}\n >\n <ImageFromSynapseTable\n tableId={entityId}\n fileHandleId={row.values[iconColIndex]}\n alt={dataType}\n style={{ width: 49, height: 49 }}\n />\n </div>\n <div className={styles.dataRowNamePill}>\n <Typography className={styles.dataRowTitle}>\n {dataType}\n </Typography>\n {facetCount && (\n <div className={styles.facetCount}>{facetCount}</div>\n )}\n </div>\n </div>\n {rowUrl && (\n <div className={styles.viewCta}>\n <span className={styles.viewCtaText}>View</span>\n <ArrowForwardIcon className={styles.viewCtaIcon} />\n </div>\n )}\n </div>\n </a>\n )\n })}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataExplorer.js","names":[],"sources":["../../../src/components/DataExplorer/DataExplorer.tsx"],"sourcesContent":["import {\n Button,\n Typography,\n Stack,\n useTheme,\n useMediaQuery,\n} from '@mui/material'\nimport { useEffect, useMemo, useState } from 'react'\nimport styles from './DataExplorer.module.scss'\nimport { useSmartLink } from '../SmartLink/useSmartLink'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport {\n QueryBundleRequest,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { SynapseConstants } from '@/utils'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { generateEncodedPathAndQueryForSelectedFacetURL } from '../QueryWrapper'\nimport ImageFromSynapseTable from '../ImageFromSynapseTable'\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward'\nimport { getFacets } from '../widgets/facet-nav/useFacetPlots'\nimport { orderBy } from 'lodash-es'\n\ntype DataExplorerProps = {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n buttonText?: string\n buttonLink?: string\n sql: string\n explorePath?: string\n exploreQuerySql?: string\n facetSql?: string\n}\n\nenum ExpectedColumns {\n DATATYPE = 'datatype',\n ICON = 'icon',\n HEX_COLOR = 'hexColor',\n ORDER = 'order',\n COLUMN_NAME = 'columnName',\n}\n\n/**\n * DataExplorer\n *\n * A reusable component that renders a list of data types/categories with associated icons.\n * It drives navigation by linking each row to a pre-filtered exploration view.\n *\n * How it works:\n * 1. `sql`: Fetches a configuration table defining the display categories,\n * their display order, hex colors, and icons.\n * 2. `facetSql`: Fetches real-time counts for these categories from the actual\n * underlying data table.\n * 3. Links are dynamically built to point to a target path (`explorePath`) pre-filtered to the\n * clicked category.\n */\nexport default function DataExplorer({\n sql,\n title,\n subtitle,\n buttonText,\n buttonLink,\n explorePath,\n exploreQuerySql,\n facetSql,\n}: DataExplorerProps) {\n const hasTextSection = title || subtitle || buttonText\n const smartLinkProps = useSmartLink(buttonLink)\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'))\n\n const entityId = parseEntityIdFromSqlStatement(sql)\n const facetEntityId = parseEntityIdFromSqlStatement(facetSql ?? '')\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n },\n }\n\n const facetQueryRequest: QueryBundleRequest = {\n partMask: SynapseConstants.BUNDLE_MASK_QUERY_FACETS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: facetEntityId,\n query: {\n sql: facetSql ?? '',\n },\n }\n\n const { data: queryResultBundle } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const dataRows = useMemo(\n () => queryResultBundle?.queryResult?.queryResults.rows ?? [],\n [queryResultBundle],\n )\n\n const { data: facetQueryResultBundle } = useGetQueryResultBundle(\n facetQueryRequest,\n { enabled: Boolean(facetSql) },\n )\n\n const datatypeColIndex = getFieldIndex(\n ExpectedColumns.DATATYPE,\n queryResultBundle,\n )\n\n const iconColIndex = getFieldIndex(ExpectedColumns.ICON, queryResultBundle)\n\n const hexColorColIndex = getFieldIndex(\n ExpectedColumns.HEX_COLOR,\n queryResultBundle,\n )\n\n const orderColIndex = getFieldIndex(ExpectedColumns.ORDER, queryResultBundle)\n\n const columnNameColIndex = getFieldIndex(\n ExpectedColumns.COLUMN_NAME,\n queryResultBundle,\n )\n\n // Key rows by columnName + dataType to prevent collisions when the same dataType appears in multiple columns.\n const getRowKey = (dataType: string, columnName: string) =>\n columnName ? `${columnName}::${dataType}` : dataType\n\n const [rowUrls, setRowUrls] = useState<Record<string, string>>({})\n\n useEffect(() => {\n if (!explorePath || !exploreQuerySql) return\n Promise.all(\n dataRows.map(row => {\n const dataType = row.values[datatypeColIndex]?.trim() ?? ''\n const columnName = row.values[columnNameColIndex]?.trim() ?? ''\n const rowKey = getRowKey(dataType, columnName)\n if (!dataType || !columnName)\n return Promise.resolve([rowKey, explorePath] as const)\n return generateEncodedPathAndQueryForSelectedFacetURL(\n explorePath,\n exploreQuerySql,\n [{ facet: columnName, facetValue: dataType }],\n ).then(url => [rowKey, url] as const)\n }),\n ).then(entries => setRowUrls(Object.fromEntries(entries)))\n }, [\n dataRows,\n datatypeColIndex,\n columnNameColIndex,\n explorePath,\n exploreQuerySql,\n ])\n\n // Create a map of facet counts by column name and data type for quick lookup\n const facetCountsByColumn = useMemo(() => {\n const facets = getFacets(\n facetQueryResultBundle,\n ) as FacetColumnResultValues[]\n const map = new Map<string, Map<string, number>>()\n for (const facet of facets) {\n map.set(\n facet.columnName,\n new Map(facet.facetValues.map(fv => [fv.value, fv.count])),\n )\n }\n return map\n }, [facetQueryResultBundle])\n\n const getFacetCount = (dataType: string, columnName?: string) =>\n columnName ? facetCountsByColumn.get(columnName)?.get(dataType) : undefined\n\n // Sort by order column ascending, then by facet count descending\n const sortedRows = orderBy(\n dataRows,\n [\n row => Number(row.values[orderColIndex] ?? Number.MAX_SAFE_INTEGER),\n row =>\n getFacetCount(\n row.values[datatypeColIndex]?.trim() ?? '',\n row.values[columnNameColIndex]?.trim() ?? '',\n ) ?? 0,\n ],\n ['asc', 'desc'],\n )\n\n return (\n <div className={styles.dataExplorerContainer}>\n {hasTextSection && (\n <Stack className={styles.dataExplorerTextContainer}>\n {title && (\n <Typography\n variant=\"headline1\"\n className={styles.dataExplorerTitle}\n >\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography\n variant=\"body1\"\n component=\"div\"\n className={styles.dataExplorerSubtitle}\n >\n {subtitle}\n </Typography>\n )}\n {buttonText && (\n <Button\n variant=\"contained\"\n className={styles.dataExplorerButton}\n {...smartLinkProps}\n >\n {buttonText}\n </Button>\n )}\n </Stack>\n )}\n <div className={styles.dataContainer}>\n {sortedRows.map(row => {\n const dataType = row.values[datatypeColIndex]?.trim() ?? ''\n const hexColor = row.values[hexColorColIndex] ?? undefined\n const columnName = row.values[columnNameColIndex]?.trim() ?? ''\n const rowUrl = rowUrls[getRowKey(dataType, columnName)]\n const facetCount = getFacetCount(dataType, columnName)\n return (\n <a\n key={getRowKey(dataType, columnName)}\n className={styles.dataRow}\n href={rowUrl}\n >\n <div className={styles.dataRowInner}>\n <div className={styles.dataRowLeft}>\n <div\n className={styles.iconContainer}\n style={hexColor ? { backgroundColor: hexColor } : undefined}\n >\n <ImageFromSynapseTable\n tableId={entityId}\n fileHandleId={row.values[iconColIndex]}\n alt={dataType}\n style={{ width: 49, height: 49 }}\n />\n </div>\n <div className={styles.dataRowNamePill}>\n <Typography className={styles.dataRowTitle}>\n {dataType}\n </Typography>\n {facetCount && (\n <div className={styles.facetCount}>{facetCount}</div>\n )}\n </div>\n </div>\n {rowUrl && !isMobile && (\n <div className={styles.viewCta}>\n <span className={styles.viewCtaText}>View</span>\n <ArrowForwardIcon className={styles.viewCtaIcon} />\n </div>\n )}\n </div>\n </a>\n )\n })}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}