@gen3/frontend 0.10.91 → 0.10.93

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 (193) hide show
  1. package/dist/cjs/index.js +390 -86
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/dts/components/CountButton/CountButton.d.ts +19 -0
  4. package/dist/dts/components/CountButton/CountButton.d.ts.map +1 -0
  5. package/dist/dts/components/CountButton/CountButton.js +18 -0
  6. package/dist/dts/components/CountButton/CountButton.js.map +1 -0
  7. package/dist/dts/components/Login/LoginPanel.d.ts.map +1 -1
  8. package/dist/dts/components/Login/LoginPanel.js +2 -1
  9. package/dist/dts/components/Login/LoginPanel.js.map +1 -1
  10. package/dist/dts/components/Login/test/utils.test.d.ts +2 -0
  11. package/dist/dts/components/Login/test/utils.test.d.ts.map +1 -0
  12. package/dist/dts/components/Login/test/utils.test.js +39 -0
  13. package/dist/dts/components/Login/test/utils.test.js.map +1 -0
  14. package/dist/dts/components/Login/utils.d.ts +15 -0
  15. package/dist/dts/components/Login/utils.d.ts.map +1 -0
  16. package/dist/dts/components/Login/utils.js +31 -0
  17. package/dist/dts/components/Login/utils.js.map +1 -0
  18. package/dist/dts/features/CohortBuilder/cohortUtils.d.ts +4 -0
  19. package/dist/dts/features/CohortBuilder/cohortUtils.d.ts.map +1 -0
  20. package/dist/dts/features/CohortBuilder/cohortUtils.js +23 -0
  21. package/dist/dts/features/CohortBuilder/cohortUtils.js.map +1 -0
  22. package/dist/dts/features/CohortDiscovery/ActionButtons/ActionButtonGroup.d.ts +5 -0
  23. package/dist/dts/features/CohortDiscovery/ActionButtons/ActionButtonGroup.d.ts.map +1 -0
  24. package/dist/dts/features/CohortDiscovery/ActionButtons/ActionButtonGroup.js +13 -0
  25. package/dist/dts/features/CohortDiscovery/ActionButtons/ActionButtonGroup.js.map +1 -0
  26. package/dist/dts/features/CohortDiscovery/ActionButtons/SaveActionButton.d.ts +5 -0
  27. package/dist/dts/features/CohortDiscovery/ActionButtons/SaveActionButton.d.ts.map +1 -0
  28. package/dist/dts/features/CohortDiscovery/ActionButtons/SaveActionButton.js +28 -0
  29. package/dist/dts/features/CohortDiscovery/ActionButtons/SaveActionButton.js.map +1 -0
  30. package/dist/dts/features/CohortDiscovery/CohortManager.d.ts +6 -0
  31. package/dist/dts/features/CohortDiscovery/CohortManager.d.ts.map +1 -0
  32. package/dist/dts/features/CohortDiscovery/CohortManager.js +55 -0
  33. package/dist/dts/features/CohortDiscovery/CohortManager.js.map +1 -0
  34. package/dist/dts/features/CohortDiscovery/CohortManagerSlice.d.ts +135 -0
  35. package/dist/dts/features/CohortDiscovery/CohortManagerSlice.d.ts.map +1 -0
  36. package/dist/dts/features/CohortDiscovery/CohortManagerSlice.js +40 -0
  37. package/dist/dts/features/CohortDiscovery/CohortManagerSlice.js.map +1 -0
  38. package/dist/dts/features/CohortDiscovery/CohortSelectors.d.ts +23 -0
  39. package/dist/dts/features/CohortDiscovery/CohortSelectors.d.ts.map +1 -0
  40. package/dist/dts/features/CohortDiscovery/CohortSelectors.js +35 -0
  41. package/dist/dts/features/CohortDiscovery/CohortSelectors.js.map +1 -0
  42. package/dist/dts/features/CohortDiscovery/CohortSlice.d.ts +91 -0
  43. package/dist/dts/features/CohortDiscovery/CohortSlice.d.ts.map +1 -0
  44. package/dist/dts/features/CohortDiscovery/CohortSlice.js +93 -0
  45. package/dist/dts/features/CohortDiscovery/CohortSlice.js.map +1 -0
  46. package/dist/dts/features/CohortDiscovery/FacetDefinitionsSlice.d.ts +15 -0
  47. package/dist/dts/features/CohortDiscovery/FacetDefinitionsSlice.d.ts.map +1 -0
  48. package/dist/dts/features/CohortDiscovery/FacetDefinitionsSlice.js +38 -0
  49. package/dist/dts/features/CohortDiscovery/FacetDefinitionsSlice.js.map +1 -0
  50. package/dist/dts/features/CohortDiscovery/RequestManagerSlice.d.ts +162 -0
  51. package/dist/dts/features/CohortDiscovery/RequestManagerSlice.d.ts.map +1 -0
  52. package/dist/dts/features/CohortDiscovery/RequestManagerSlice.js +53 -0
  53. package/dist/dts/features/CohortDiscovery/RequestManagerSlice.js.map +1 -0
  54. package/dist/dts/features/CohortDiscovery/Requests/DataAccessRequestForm.d.ts +10 -0
  55. package/dist/dts/features/CohortDiscovery/Requests/DataAccessRequestForm.d.ts.map +1 -0
  56. package/dist/dts/features/CohortDiscovery/Requests/DataAccessRequestForm.js +85 -0
  57. package/dist/dts/features/CohortDiscovery/Requests/DataAccessRequestForm.js.map +1 -0
  58. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.d.ts +3 -0
  59. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.d.ts.map +1 -0
  60. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.js +8 -0
  61. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.js.map +1 -0
  62. package/dist/dts/features/CohortDiscovery/Requests/RequestsTable.d.ts +3 -0
  63. package/dist/dts/features/CohortDiscovery/Requests/RequestsTable.d.ts.map +1 -0
  64. package/dist/dts/features/CohortDiscovery/Requests/RequestsTable.js +67 -0
  65. package/dist/dts/features/CohortDiscovery/Requests/RequestsTable.js.map +1 -0
  66. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsPanel.d.ts +3 -0
  67. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsPanel.d.ts.map +1 -0
  68. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsPanel.js +9 -0
  69. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsPanel.js.map +1 -0
  70. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsTable.d.ts +7 -0
  71. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsTable.d.ts.map +1 -0
  72. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsTable.js +101 -0
  73. package/dist/dts/features/CohortDiscovery/SaveCohorts/SavedCohortsTable.js.map +1 -0
  74. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.d.ts +3 -0
  75. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.d.ts.map +1 -0
  76. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.js +86 -0
  77. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.js.map +1 -0
  78. package/dist/dts/features/CohortDiscovery/api/utils.d.ts +1 -0
  79. package/dist/dts/features/CohortDiscovery/api/utils.d.ts.map +1 -0
  80. package/dist/dts/features/CohortDiscovery/api/utils.js +2 -0
  81. package/dist/dts/features/CohortDiscovery/api/utils.js.map +1 -0
  82. package/dist/dts/features/CohortDiscovery/appApi.d.ts +10 -1
  83. package/dist/dts/features/CohortDiscovery/appApi.d.ts.map +1 -1
  84. package/dist/dts/features/CohortDiscovery/appApi.js.map +1 -1
  85. package/dist/dts/features/CohortDiscovery/appApiRTKQ.d.ts +1 -0
  86. package/dist/dts/features/CohortDiscovery/appApiRTKQ.d.ts.map +1 -0
  87. package/dist/dts/features/CohortDiscovery/appApiRTKQ.js +101 -0
  88. package/dist/dts/features/CohortDiscovery/appApiRTKQ.js.map +1 -0
  89. package/dist/dts/features/CohortDiscovery/queryApi.d.ts +35 -0
  90. package/dist/dts/features/CohortDiscovery/queryApi.d.ts.map +1 -0
  91. package/dist/dts/features/CohortDiscovery/queryApi.js +497 -0
  92. package/dist/dts/features/CohortDiscovery/queryApi.js.map +1 -0
  93. package/dist/dts/features/CohortDiscovery/tableSettings.d.ts +3 -0
  94. package/dist/dts/features/CohortDiscovery/tableSettings.d.ts.map +1 -0
  95. package/dist/dts/features/CohortDiscovery/tableSettings.js +68 -0
  96. package/dist/dts/features/CohortDiscovery/tableSettings.js.map +1 -0
  97. package/dist/dts/features/DataLibrary/DataLibraryLists.d.ts.map +1 -1
  98. package/dist/dts/features/DataLibrary/DataLibraryLists.js +19 -15
  99. package/dist/dts/features/DataLibrary/DataLibraryLists.js.map +1 -1
  100. package/dist/dts/features/DataLibrary/DatalistAccordionItem.d.ts +3 -3
  101. package/dist/dts/features/DataLibrary/DatalistAccordionItem.d.ts.map +1 -1
  102. package/dist/dts/features/DataLibrary/DatalistAccordionItem.js +1 -3
  103. package/dist/dts/features/DataLibrary/DatalistAccordionItem.js.map +1 -1
  104. package/dist/dts/features/DataLibrary/DatasetAccordionControl.d.ts +3 -2
  105. package/dist/dts/features/DataLibrary/DatasetAccordionControl.d.ts.map +1 -1
  106. package/dist/dts/features/DataLibrary/DatasetAccordionControl.js.map +1 -1
  107. package/dist/dts/features/DataLibrary/SearchAndActions.d.ts +2 -2
  108. package/dist/dts/features/DataLibrary/SearchAndActions.d.ts.map +1 -1
  109. package/dist/dts/features/DataLibrary/SearchAndActions.js.map +1 -1
  110. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.d.ts +3 -0
  111. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.d.ts.map +1 -0
  112. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.js +178 -0
  113. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.js.map +1 -0
  114. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.d.ts +9 -0
  115. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.d.ts.map +1 -0
  116. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.js +7 -0
  117. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.js.map +1 -0
  118. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.d.ts +3 -0
  119. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.d.ts.map +1 -0
  120. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.js +80 -0
  121. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.js.map +1 -0
  122. package/dist/dts/features/DataLibrary/selection/exportActions.d.ts.map +1 -1
  123. package/dist/dts/features/DataLibrary/selection/exportActions.js +14 -9
  124. package/dist/dts/features/DataLibrary/selection/exportActions.js.map +1 -1
  125. package/dist/dts/features/DataLibrary/selection/registeredActions.d.ts.map +1 -1
  126. package/dist/dts/features/DataLibrary/selection/registeredActions.js +8 -0
  127. package/dist/dts/features/DataLibrary/selection/registeredActions.js.map +1 -1
  128. package/dist/dts/features/DataLibrary/selection/selectedItemActions.d.ts.map +1 -1
  129. package/dist/dts/features/DataLibrary/selection/selectedItemActions.js +4 -0
  130. package/dist/dts/features/DataLibrary/selection/selectedItemActions.js.map +1 -1
  131. package/dist/dts/features/DataLibrary/selection/tests/utils.unit.test.js +71 -1
  132. package/dist/dts/features/DataLibrary/selection/tests/utils.unit.test.js.map +1 -1
  133. package/dist/dts/features/DataLibrary/selection/types.d.ts +2 -2
  134. package/dist/dts/features/DataLibrary/selection/types.d.ts.map +1 -1
  135. package/dist/dts/features/DataLibrary/selection/utils.d.ts +4 -2
  136. package/dist/dts/features/DataLibrary/selection/utils.d.ts.map +1 -1
  137. package/dist/dts/features/DataLibrary/selection/utils.js +18 -0
  138. package/dist/dts/features/DataLibrary/selection/utils.js.map +1 -1
  139. package/dist/dts/features/DataLibrary/types.d.ts +7 -2
  140. package/dist/dts/features/DataLibrary/types.d.ts.map +1 -1
  141. package/dist/dts/features/DataLibrary/types.js +18 -0
  142. package/dist/dts/features/DataLibrary/types.js.map +1 -1
  143. package/dist/dts/features/Discovery/ActionBar/ActionBar.d.ts.map +1 -1
  144. package/dist/dts/features/Discovery/ActionBar/ActionBar.js +6 -3
  145. package/dist/dts/features/Discovery/ActionBar/ActionBar.js.map +1 -1
  146. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.d.ts +1 -1
  147. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.d.ts.map +1 -1
  148. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.js +81 -55
  149. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.js.map +1 -1
  150. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.stories.d.ts +1 -1
  151. package/dist/dts/features/Discovery/ActionBar/DownloadManifestButton.js +1 -1
  152. package/dist/dts/features/Discovery/ActionBar/DownloadManifestButton.js.map +1 -1
  153. package/dist/dts/features/Discovery/ActionBar/types.d.ts +3 -1
  154. package/dist/dts/features/Discovery/ActionBar/types.d.ts.map +1 -1
  155. package/dist/dts/features/Discovery/DiscoveryIndexPanel.d.ts.map +1 -1
  156. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js +2 -2
  157. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js.map +1 -1
  158. package/dist/dts/features/Discovery/DiscoveryTable.d.ts.map +1 -1
  159. package/dist/dts/features/Discovery/DiscoveryTable.js.map +1 -1
  160. package/dist/dts/features/Discovery/TableRenderers/DataAccessCellRenderers.d.ts.map +1 -1
  161. package/dist/dts/features/Discovery/TableRenderers/DataAccessCellRenderers.js +13 -3
  162. package/dist/dts/features/Discovery/TableRenderers/DataAccessCellRenderers.js.map +1 -1
  163. package/dist/dts/features/Discovery/types.d.ts +2 -1
  164. package/dist/dts/features/Discovery/types.d.ts.map +1 -1
  165. package/dist/dts/features/Discovery/types.js.map +1 -1
  166. package/dist/dts/features/Navigation/index.d.ts +2 -2
  167. package/dist/dts/features/Navigation/index.d.ts.map +1 -1
  168. package/dist/dts/features/Navigation/index.js +2 -2
  169. package/dist/dts/features/Navigation/index.js.map +1 -1
  170. package/dist/dts/features/Workspace/PaymentPanel/PaymentPanel.d.ts.map +1 -1
  171. package/dist/dts/features/Workspace/PaymentPanel/PaymentPanel.js +3 -1
  172. package/dist/dts/features/Workspace/PaymentPanel/PaymentPanel.js.map +1 -1
  173. package/dist/dts/lib/session/session.d.ts.map +1 -1
  174. package/dist/dts/lib/session/session.js +3 -1
  175. package/dist/dts/lib/session/session.js.map +1 -1
  176. package/dist/dts/pages/DataLibrary/data.js +2 -2
  177. package/dist/dts/pages/DataLibrary/data.js.map +1 -1
  178. package/dist/dts/pages/Discovery/data.d.ts.map +1 -1
  179. package/dist/dts/pages/Discovery/data.js +21 -11
  180. package/dist/dts/pages/Discovery/data.js.map +1 -1
  181. package/dist/dts/types/constants.d.ts +2 -0
  182. package/dist/dts/types/constants.d.ts.map +1 -0
  183. package/dist/dts/types/constants.js +2 -0
  184. package/dist/dts/types/constants.js.map +1 -0
  185. package/dist/dts/utils/sizes.d.ts +4 -0
  186. package/dist/dts/utils/sizes.d.ts.map +1 -0
  187. package/dist/dts/utils/sizes.js +25 -0
  188. package/dist/dts/utils/sizes.js.map +1 -0
  189. package/dist/esm/index.js +392 -89
  190. package/dist/esm/index.js.map +1 -1
  191. package/dist/index.d.ts +6 -4
  192. package/dist/tsconfig.tsbuildinfo +1 -1
  193. package/package.json +3 -3
package/dist/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import React__default, { createContext, useState, useMemo, useEffect, useCallback, useContext, useRef, createElement, forwardRef, useReducer } from 'react';
4
- import { useUserAuth, useCoreSelector, selectUserDetails, useGetAuthzMappingsQuery, fetchFence, isFetchError, WorkspaceStatus, useGetWorkspaceStatusQuery, useGetWorkspacePayModelsQuery, useTerminateWorkspaceMutation, selectRequestedWorkspaceStatus, selectRequestedWorkspaceStatusTimestamp, useCoreDispatch, setActiveWorkspaceStatus, RequestedWorkspaceStatus, setRequestedWorkspaceStatus, isTimeGreaterThan, useGetCSRFQuery, useLazyFetchUserDetailsQuery, selectUserAuthStatus, GEN3_REDIRECT_URL, GEN3_FENCE_API, showModal, Modals, isAuthenticated, useGetLoginProvidersQuery, hideModal, selectCurrentModal, fieldNameToTitle, useIsUserLoggedIn, GEN3_DOMAIN, useDataLibrary, buildListItemsGroupedByDataset, extractFileDatasetsInRecords, useGetMDSQuery, selectAuthzMappingData, useGetAggMDSQuery, useAskQuestionMutation, useGetIndexAggMDSQuery, useGetTagsQuery, isOperationWithField, extractEnumFilterValue, selectIndexedFilterByName, selectShouldShareFilters, selectSharedFilters, updateCohortFilter, isOperatorWithFieldAndArrayOfOperands, removeCohortFilter, setCohortFilter, clearCohortFilters, handleOperation, selectCohortFilters, setCohortIndexFilters, toggleCohortBuilderCategoryFilter, selectCohortFilterExpanded, setCohortFilterCombineMode, selectCohortFilterCombineMode, selectCurrentCohortId, selectCurrentCohortName, useGeneralGQLQuery, selectIndexFilters, useGetRawDataAndTotalCountsQuery, Accessibility, downloadFromGuppyToBlob, downloadJSONDataFromGuppy, trimFirstFieldNameToTitle, selectAllCohortFiltersCollapsed, toggleCohortBuilderAllFilters, setShouldShareFilters, useGetAggsQuery, useGetAggsNoFilterSelfQuery, isIntersection, useGetCountsQuery, setSharedFilters, selectHeadersWithCSRFToken, GEN3_GUPPY_API, useLaunchWorkspaceMutation, selectActiveWorkspaceStatus, isFetchBaseQueryError, setActiveWorkspace, getCurrentTimestamp, selectWorkspaceStatusFromService, selectActiveWorkspaceId, useGetWorkspaceOptionsQuery, GEN3_WORKSPACE_API, useGetExternalLoginsQuery, useSetCurrentPayModelMutation, PodStatus, PodConditionType, isWorkspaceRunningOrStopping, GEN3_COMMONS_NAME, createAppStore, createGen3AppWithOwnStore, createAppApiForRTKQ, getGen3AppId, useGetDictionaryQuery, useGetMetadataByIdQuery, createGen3App, CoreProvider, fetchJSONDataFromURL, HttpMethod, groupSharedFields, useGetCredentialsQuery, useRemoveCredentialMutation, useAddNewCredentialMutation, useGetProjectsDetailsQuery, useGetSubmissionsQuery, isCohortItem, isFileItem, fetchFencePresignedURL, HTTPError, extractIndexFromDataLibraryCohort, isFilterSet, getNumberOfItemsInDatalist, isAdditionalDataItem, useLazyGetCrosswalkDataQuery } from '@gen3/core';
4
+ import { useUserAuth, useCoreSelector, selectUserDetails, useGetAuthzMappingsQuery, fetchFence, isFetchError, WorkspaceStatus, useGetWorkspaceStatusQuery, useGetWorkspacePayModelsQuery, useTerminateWorkspaceMutation, selectRequestedWorkspaceStatus, selectRequestedWorkspaceStatusTimestamp, useCoreDispatch, setActiveWorkspaceStatus, RequestedWorkspaceStatus, setRequestedWorkspaceStatus, isTimeGreaterThan, useGetCSRFQuery, useLazyFetchUserDetailsQuery, selectUserAuthStatus, GEN3_REDIRECT_URL, GEN3_FENCE_API, showModal, Modals, isAuthenticated, useGetLoginProvidersQuery, hideModal, selectCurrentModal, fieldNameToTitle, useIsUserLoggedIn, GEN3_DOMAIN, useDataLibrary, DataLibraryStoreMode, buildListItemsGroupedByDataset, extractFileDatasetsInRecords, useGetMDSQuery, selectAuthzMappingData, useGetAggMDSQuery, useAskQuestionMutation, useGetIndexAggMDSQuery, useGetTagsQuery, isOperationWithField, extractEnumFilterValue, selectIndexedFilterByName, selectShouldShareFilters, selectSharedFilters, updateCohortFilter, isOperatorWithFieldAndArrayOfOperands, removeCohortFilter, setCohortFilter, clearCohortFilters, handleOperation, selectCohortFilters, setCohortIndexFilters, toggleCohortBuilderCategoryFilter, selectCohortFilterExpanded, setCohortFilterCombineMode, selectCohortFilterCombineMode, selectCurrentCohortId, selectCurrentCohortName, useGeneralGQLQuery, selectIndexFilters, useGetRawDataAndTotalCountsQuery, Accessibility, downloadFromGuppyToBlob, downloadJSONDataFromGuppy, trimFirstFieldNameToTitle, selectAllCohortFiltersCollapsed, toggleCohortBuilderAllFilters, setShouldShareFilters, useGetAggsQuery, useGetAggsNoFilterSelfQuery, isIntersection, useGetCountsQuery, setSharedFilters, selectHeadersWithCSRFToken, GEN3_GUPPY_API, useLaunchWorkspaceMutation, selectActiveWorkspaceStatus, isFetchBaseQueryError, setActiveWorkspace, getCurrentTimestamp, selectWorkspaceStatusFromService, selectActiveWorkspaceId, useGetWorkspaceOptionsQuery, GEN3_WORKSPACE_API, useGetExternalLoginsQuery, useSetCurrentPayModelMutation, PodStatus, PodConditionType, isWorkspaceRunningOrStopping, GEN3_COMMONS_NAME, createAppStore, createGen3AppWithOwnStore, createAppApiForRTKQ, getGen3AppId, useGetDictionaryQuery, useGetMetadataByIdQuery, createGen3App, CoreProvider, fetchJSONDataFromURL, HttpMethod, groupSharedFields, useGetCredentialsQuery, useRemoveCredentialMutation, useAddNewCredentialMutation, useGetProjectsDetailsQuery, useGetSubmissionsQuery, isCohortItem, isFileItem, fetchFencePresignedURL, HTTPError, getFederatedLoginStatus, queryMultipleMDSRecords, GEN3_MANIFEST_API, extractIndexFromDataLibraryCohort, isFilterSet, getNumberOfItemsInDatalist, isAdditionalDataItem, useLazyGetCrosswalkDataQuery } from '@gen3/core';
5
5
  import { LoadingOverlay, Card, Group, Avatar, Text, Checkbox, Stack, Tooltip, UnstyledButton, ThemeIcon, Center, Box, Select, Button, Divider, Textarea, FileButton, Anchor, Modal, Grid, Table, ColorSwatch, useMantineTheme, Loader, Paper, Menu, Badge, Alert, Tabs, Accordion, Drawer, CopyButton, factory, useProps, getStyleObject, SegmentedControl, useCombobox, Combobox, TextInput, ScrollArea, Switch, Autocomplete, Title, ActionIcon, NumberInput, RangeSlider, MultiSelect, Transition, rem, Stepper, Image as Image$1, NavLink, Flex, Highlight, List, createTheme, Pagination, FileInput, CloseButton } from '@mantine/core';
6
6
  import { useDeepCompareEffect, useDeepCompareMemo, useDeepCompareCallback } from 'use-deep-compare';
7
7
  import { useRouter } from 'next/router';
@@ -12,7 +12,7 @@ import 'swr';
12
12
  import { errors, importSPKI, jwtVerify, decodeJwt } from 'jose';
13
13
  import { notifications, showNotification, cleanNotifications, Notifications } from '@mantine/notifications';
14
14
  import tinycolor from 'tinycolor2';
15
- import { capitalize as capitalize$1, toString, isArray, get, omit, partial } from 'lodash';
15
+ import { capitalize as capitalize$1, toString, isArray, get, omit, partial, cloneDeep, unset } from 'lodash';
16
16
  import { twMerge } from 'tailwind-merge';
17
17
  import { BsExclamationTriangle, BsArrowsFullscreen } from 'react-icons/bs';
18
18
  import Markdown from 'react-markdown';
@@ -878,7 +878,7 @@ const UPDATE_SESSION_LIMIT = MinutesToMilliseconds(5);
878
878
  await getUserDetails();
879
879
  };
880
880
  const sessionInfo = useManageSession(userStatus);
881
- // for now we are using the user status to determine if the user is logged in
881
+ // for now, we are using the user status to determine if the user is logged in
882
882
  const updateSession = useCallback(()=>updateSessionWithUserStatus(), [
883
883
  updateSessionWithUserStatus
884
884
  ]);
@@ -904,9 +904,11 @@ const UPDATE_SESSION_LIMIT = MinutesToMilliseconds(5);
904
904
  };
905
905
  window.addEventListener('mousedown', updateUserActivity);
906
906
  window.addEventListener('keypress', updateUserActivity);
907
+ window.addEventListener('updateUserActivity', updateUserActivity);
907
908
  return ()=>{
908
909
  window.removeEventListener('mousedown', updateUserActivity);
909
910
  window.removeEventListener('keypress', updateUserActivity);
911
+ window.removeEventListener('updateUserActivity', updateUserActivity);
910
912
  };
911
913
  }, []); // only call on mount/dismount
912
914
  useInterval(()=>{
@@ -1467,6 +1469,35 @@ function hashCode(str) {
1467
1469
  }
1468
1470
  };
1469
1471
 
1472
+ /**
1473
+ * Determines the correct separator to append additional parameters to a URL
1474
+ * @param {string} url - The URL to examine
1475
+ * @returns {string} - Either '?' or '&' depending on whether the URL already has parameters
1476
+ */ const getUrlSeparator = (url)=>{
1477
+ // Check if the URL already contains a question mark
1478
+ return url.includes('?') ? '&' : '?';
1479
+ };
1480
+ /**
1481
+ * Adds a parameter to a URL using the correct separator
1482
+ * @param {string} url - The URL to add the parameter to
1483
+ * @param {string} paramName - The parameter name
1484
+ * @param {string} paramValue - The parameter value
1485
+ * @returns {string} - The URL with the added parameter
1486
+ */ const appendParameterToUrl = (url, paramName, paramValue)=>{
1487
+ if (!url || false) {
1488
+ return url;
1489
+ }
1490
+ // Extract hash fragment if present
1491
+ const [baseUrl, hash] = url.split('#');
1492
+ const hashFragment = hash ? `#${hash}` : '';
1493
+ // Determine separator and append parameter
1494
+ const separator = getUrlSeparator(baseUrl);
1495
+ const encodedParamName = encodeURIComponent(paramName);
1496
+ const encodedParamValue = encodeURIComponent(paramValue);
1497
+ // Construct the final URL with parameter and hash fragment
1498
+ return `${baseUrl}${separator}${encodedParamName}=${encodedParamValue}${hashFragment}`;
1499
+ };
1500
+
1470
1501
  const filterRedirect = (redirect)=>{
1471
1502
  let redirectPath = '';
1472
1503
  if (Array.isArray(redirect)) {
@@ -1481,7 +1512,7 @@ const LoginPanel = (loginConfig)=>{
1481
1512
  const router = useRouter();
1482
1513
  const { query: { referer } } = router;
1483
1514
  const handleFenceLoginSelected = useCallback(async (loginURL)=>{
1484
- router.push(`${loginURL}?redirect=${filterRedirect(referer)}`).catch((e)=>{
1515
+ router.push(`${appendParameterToUrl(loginURL, 'redirect', filterRedirect(referer))}`).catch((e)=>{
1485
1516
  showNotification({
1486
1517
  title: 'Login Error',
1487
1518
  message: `error logging in ${e.message}`
@@ -3037,6 +3068,22 @@ const Gen3Link = ({ className, href, linkType, text, showExternalIcon = false })
3037
3068
  });
3038
3069
  };
3039
3070
 
3071
+ /**
3072
+ * Type guard for ValidFileItemWithParentDatasetNameAndID
3073
+ * Checks if the object has the properties that define this interface
3074
+ */ const isValidFileItemWithParentDatasetNameAndID = (item)=>{
3075
+ if (!item || typeof item !== 'object') {
3076
+ return false;
3077
+ }
3078
+ const fileItem = item;
3079
+ // Check required properties from FileItemWithParentDatasetNameAndID
3080
+ if (typeof fileItem.datasetName !== 'string' || typeof fileItem.datasetId !== 'string') {
3081
+ return false;
3082
+ }
3083
+ // We can assume it's a FileItem if it has the required properties from parent interfaces
3084
+ // Additional checks could be added if FileItem has required properties
3085
+ return true;
3086
+ };
3040
3087
  const IconSize = {
3041
3088
  xs: 14,
3042
3089
  sm: 16,
@@ -3981,11 +4028,23 @@ const buildTooltip = (mainMessage, secondaryMessage)=>{
3981
4028
  });
3982
4029
  };
3983
4030
  const DataAccessCellRenderer = ({ cell, row }, params)=>{
3984
- const authzField = params?.authzField || 'authz';
4031
+ const { discoveryConfig: config } = useDiscoveryContext();
4032
+ const authzField = config.minimalFieldMapping?.authzField || 'authz';
3985
4033
  let value = cell?.getValue();
3986
4034
  const authorization = row?.original?.[authzField] || undefined;
4035
+ const dataObjectField = config.features.exportFromDiscovery?.exportDataFields.dataObjectField;
4036
+ row?.original?.num_fileobject || 0;
3987
4037
  if (isArray(value)) value = value[0];
3988
4038
  const accessLevel = getAccessLevelFromNumber(value);
4039
+ const numFileObjects = dataObjectField && row?.original?.[dataObjectField] ? row?.original?.[dataObjectField] : 0;
4040
+ if (numFileObjects === 0) {
4041
+ return /*#__PURE__*/ jsx(Tooltip, {
4042
+ label: buildTooltip('No data attached to this study'),
4043
+ children: /*#__PURE__*/ jsx(LuCircleSlash, {
4044
+ className: "text-utility-error"
4045
+ })
4046
+ });
4047
+ }
3989
4048
  if (!accessLevel) {
3990
4049
  return /*#__PURE__*/ jsx(Tooltip, {
3991
4050
  label: buildTooltip('Unable to determine access level'),
@@ -5525,6 +5584,7 @@ const DataLibraryActionButton = /*#__PURE__*/ forwardRef(({ label = undefined, i
5525
5584
  DataLibraryActionButton.displayName = 'DataLibraryActionButton';
5526
5585
 
5527
5586
  const MANIFEST_FILENAME = 'manifest.json';
5587
+
5528
5588
  /**
5529
5589
  * Determines the disabled state and the reason for disabling based on authentication status,
5530
5590
  * selection count, and requirement for login.
@@ -5617,14 +5677,23 @@ const extractIdToLabel = (data)=>!data ? {} : Object.keys(data).reduce((acc, id)
5617
5677
  acc[id] = data[id].name;
5618
5678
  return acc;
5619
5679
  }, {});
5680
+ const buildErrorMessage = (error)=>{
5681
+ if (error.status === 401) {
5682
+ return 'Please log in to save to data library';
5683
+ }
5684
+ if (error.status === 404) {
5685
+ return 'Cannot query data library. Please try again later.';
5686
+ }
5687
+ return 'Error saving to data library. Please try again later.';
5688
+ };
5620
5689
  const createTooltipLabel = (error, isLoggedIn, requiresLogin, numSelected, currentListName)=>{
5621
- if (error) return 'Error saving to data library. Please try again later';
5622
5690
  if (!isLoggedIn && requiresLogin) return 'Please log in to save to data library';
5623
5691
  if (numSelected === 0) return 'Please select at least one study to save to data library';
5624
5692
  if (!currentListName) return 'Please select or create a list';
5693
+ if (error) return buildErrorMessage(error);
5625
5694
  return 'Add selections to list';
5626
5695
  };
5627
- const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, classNames = {} })=>{
5696
+ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, dataLibraryStoreMode = DataLibraryStoreMode.ApiOnly, classNames = {} })=>{
5628
5697
  const [selectItems, setSelectItems] = useState({});
5629
5698
  const [currentList, setCurrentList] = useState(null);
5630
5699
  const [error, setError] = useState(null);
@@ -5640,23 +5709,26 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5640
5709
  root: 'w-1/2'
5641
5710
  };
5642
5711
  const mergedClassnames = mergeDefaultTailwindClassnames(classNamesDefaults, classNames);
5643
- const { dataLibrary, updateListInDataLibrary, addListToDataLibrary, isLoading, error: dataLibraryError } = useDataLibrary();
5712
+ const { dataLibrary, updateListInDataLibrary, addListToDataLibrary, isLoading, isUpdating, error: dataLibraryError } = useDataLibrary({
5713
+ storageMode: dataLibraryStoreMode
5714
+ });
5644
5715
  const saveToList = (listname, listId = undefined)=>{
5645
5716
  if (selectedResources.length === 0) return;
5646
5717
  const items = buildListItemsGroupedByDataset(extractFileDatasetsInRecords(selectedResources, exportDataFields));
5718
+ if (Object.keys(items).length === 0) {
5719
+ notifications.show({
5720
+ id: 'update-datalibrary-no-items-to-update-notification',
5721
+ position: 'top-center',
5722
+ withCloseButton: true,
5723
+ autoClose: 5000,
5724
+ title: 'Save to list',
5725
+ message: `No data objects selected to save to list ${listname}.`,
5726
+ loading: false
5727
+ });
5728
+ return;
5729
+ }
5647
5730
  if (listId) {
5648
- if (Object.keys(items).length === 0) {
5649
- notifications.show({
5650
- id: 'update-datalibrary-no-items-to-update-notification',
5651
- position: 'top-center',
5652
- withCloseButton: true,
5653
- autoClose: 5000,
5654
- title: 'Save to list',
5655
- message: `No data objects selected to save to list ${listname}.`,
5656
- loading: false
5657
- });
5658
- return;
5659
- }
5731
+ // updating list
5660
5732
  updateListInDataLibrary({
5661
5733
  id: listId,
5662
5734
  name: listname,
@@ -5664,26 +5736,46 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5664
5736
  ...dataLibrary[listId].items,
5665
5737
  ...items
5666
5738
  }
5667
- });
5668
- notifications.show({
5669
- id: 'update-datalibrary-list-notification',
5670
- position: 'top-center',
5671
- withCloseButton: true,
5672
- autoClose: 5000,
5673
- title: 'Save to list',
5674
- message: `${Object.values(items)} saved to list ${listname} successfully.`,
5675
- loading: isLoading
5739
+ }).then((results)=>{
5740
+ if (results.isError) notifications.show({
5741
+ id: 'update-datalibrary-list-error-notification',
5742
+ position: 'top-center',
5743
+ withCloseButton: true,
5744
+ autoClose: 5000,
5745
+ title: 'Save to list',
5746
+ message: `Error saving to list ${listname}.`,
5747
+ loading: isUpdating !== null
5748
+ });
5749
+ else notifications.show({
5750
+ id: 'update-datalibrary-list-notification',
5751
+ position: 'top-center',
5752
+ withCloseButton: true,
5753
+ autoClose: 5000,
5754
+ title: 'Save to list',
5755
+ message: `${Object.values(items).length} datasets saved to list ${listname}.`,
5756
+ loading: isUpdating !== null
5757
+ });
5676
5758
  });
5677
5759
  } else {
5678
- addListToDataLibrary(items, listname);
5679
- notifications.show({
5680
- id: 'update-datalibrary-list-notification',
5681
- position: 'top-center',
5682
- withCloseButton: true,
5683
- autoClose: 5000,
5684
- title: 'Save to list',
5685
- message: `${Object.values(items)} saved to list ${listname} successfully.`,
5686
- loading: isLoading
5760
+ addListToDataLibrary(items, listname).then((results)=>{
5761
+ if (results.isError) notifications.show({
5762
+ id: 'update-datalibrary-list-error-notification',
5763
+ position: 'top-center',
5764
+ withCloseButton: true,
5765
+ autoClose: 5000,
5766
+ title: 'Save to list',
5767
+ message: `Error saving to list ${listname}.`,
5768
+ loading: isUpdating !== null
5769
+ });
5770
+ else notifications.show({
5771
+ id: 'update-datalibrary-list-notification',
5772
+ position: 'top-center',
5773
+ withCloseButton: true,
5774
+ autoClose: 5000,
5775
+ title: 'Save to list',
5776
+ message: `${Object.values(items).length} datasets saved to list ${listname}.`,
5777
+ loading: isLoading
5778
+ });
5687
5779
  });
5688
5780
  }
5689
5781
  };
@@ -5706,21 +5798,11 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5706
5798
  options
5707
5799
  ]);
5708
5800
  useDeepCompareEffect(()=>{
5709
- if (dataLibrary && !dataLibraryError) {
5801
+ if (dataLibrary) if (!dataLibraryError) {
5710
5802
  const listItems = extractIdToLabel(dataLibrary);
5711
5803
  setSelectItems(listItems);
5712
- }
5713
- setError(dataLibraryError);
5714
- if (dataLibraryError) {
5715
- notifications.show({
5716
- id: 'update-datalibrary-error-notification',
5717
- position: 'top-center',
5718
- withCloseButton: true,
5719
- autoClose: 5000,
5720
- title: 'Error',
5721
- message: `Error saving to data library. Please try again later.`,
5722
- loading: false
5723
- });
5804
+ } else {
5805
+ setError(dataLibraryError);
5724
5806
  }
5725
5807
  }, [
5726
5808
  dataLibrary,
@@ -5792,7 +5874,7 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5792
5874
  });
5793
5875
  };
5794
5876
 
5795
- const createActionButton = ({ buttonConfig, selectedResources, exportDataFields })=>{
5877
+ const createActionButton = ({ buttonConfig, selectedResources, exportDataFields, verifyExternalLogins, dataLibraryStoreMode })=>{
5796
5878
  return ({
5797
5879
  manifest: /*#__PURE__*/ jsx(DownloadManifestButton, {
5798
5880
  buttonConfig: buttonConfig,
@@ -5802,18 +5884,22 @@ const createActionButton = ({ buttonConfig, selectedResources, exportDataFields
5802
5884
  addToDataLibrary: /*#__PURE__*/ jsx(AddToDataLibrary, {
5803
5885
  buttonConfig: buttonConfig,
5804
5886
  selectedResources: selectedResources,
5805
- exportDataFields: exportDataFields
5887
+ exportDataFields: exportDataFields,
5888
+ verifyExternalLogins: verifyExternalLogins,
5889
+ dataLibraryStoreMode: dataLibraryStoreMode
5806
5890
  }, buttonConfig.type)
5807
5891
  })[buttonConfig.type];
5808
5892
  };
5809
- const ActionBar = ({ buttons, selectedResources, exportDataFields, verifyExternalLogins })=>{
5893
+ const ActionBar = ({ buttons, selectedResources, exportDataFields, verifyExternalLogins, dataLibraryStoreMode = DataLibraryStoreMode.ApiOnly })=>{
5810
5894
  return /*#__PURE__*/ jsx("div", {
5811
5895
  className: "flex items-center justify-end py-1 px-2 mb-1 w-full gap-x-1.5 ",
5812
5896
  children: buttons?.map((button)=>{
5813
5897
  return createActionButton({
5814
5898
  buttonConfig: button,
5815
5899
  selectedResources,
5816
- exportDataFields
5900
+ exportDataFields,
5901
+ verifyExternalLogins,
5902
+ dataLibraryStoreMode
5817
5903
  });
5818
5904
  })
5819
5905
  });
@@ -7203,7 +7289,6 @@ registerDefaultDiscoveryDataLoaders();
7203
7289
  *
7204
7290
  * @return {JSX.Element} A fully featured discovery interface including search functionality, a table, charts, filters, and more.
7205
7291
  */ const DiscoveryIndexPanel = ({ discoveryConfig, indexSelector })=>{
7206
- console.log(discoveryConfig);
7207
7292
  const dataHook = useMemo(()=>getDiscoveryDataLoader(discoveryConfig?.features?.dataLoader?.dataFetchFunction) ?? useLoadAllMDSData, [
7208
7293
  discoveryConfig?.features?.dataLoader?.dataFetchFunction
7209
7294
  ]);
@@ -7325,7 +7410,8 @@ registerDefaultDiscoveryDataLoaders();
7325
7410
  buttons: discoveryConfig.features.exportFromDiscovery.buttons,
7326
7411
  exportDataFields: discoveryConfig.features.exportFromDiscovery.exportDataFields,
7327
7412
  selectedResources: selectedRecords,
7328
- verifyExternalLogins: discoveryConfig.features.exportFromDiscovery.verifyExternalLogins
7413
+ verifyExternalLogins: discoveryConfig.features.exportFromDiscovery.verifyExternalLogins,
7414
+ dataLibraryStoreMode: discoveryConfig.features.exportFromDiscovery.dataLibraryStoreMode
7329
7415
  }) : null
7330
7416
  ]
7331
7417
  }),
@@ -11992,7 +12078,7 @@ const PaymentPanel = ()=>{
11992
12078
  setSelectedPayModel(data.currentPayModel.bmh_workspace_id ?? data.currentPayModel.workspace_type);
11993
12079
  return {
11994
12080
  usersPayModels,
11995
- workspaceName: data.currentPayModel.bmh_workspace_id.length > 0 ? data.currentPayModel.bmh_workspace_id.length : data.currentPayModel.workspace_type,
12081
+ workspaceName: data.currentPayModel.bmh_workspace_id.length > 0 ? data.currentPayModel.bmh_workspace_id : data.currentPayModel.workspace_type,
11996
12082
  totalUsage: data.currentPayModel['total-usage'],
11997
12083
  hardLimit: data.currentPayModel['hard-limit']
11998
12084
  };
@@ -12001,6 +12087,7 @@ const PaymentPanel = ()=>{
12001
12087
  ]);
12002
12088
  const PayModelSelectItem = ({ option })=>{
12003
12089
  const menuItem = usersPayModels[Number(option.value)];
12090
+ if (!menuItem) return null;
12004
12091
  return /*#__PURE__*/ jsx("div", {
12005
12092
  children: /*#__PURE__*/ jsxs(Group, {
12006
12093
  wrap: "nowrap",
@@ -15775,6 +15862,11 @@ const DiscoveryPage = ({ headerProps, footerProps, discoveryConfig })=>{
15775
15862
  const DiscoveryPageGetServerSideProps = async ()=>{
15776
15863
  try {
15777
15864
  const discoveryConfig = await ContentSource$1.getContentDatabase().get(`${GEN3_COMMONS_NAME}/discovery.json`);
15865
+ // need data library config for export from discovery using the DataLibrary
15866
+ const datalibraryConfig = await ContentSource$1.getContentDatabase().get(`${GEN3_COMMONS_NAME}/dataLibrary.json`);
15867
+ discoveryConfig.metadataConfig?.forEach((index)=>{
15868
+ if (index.features.exportFromDiscovery) index.features.exportFromDiscovery.dataLibraryStoreMode = datalibraryConfig?.storageMode ?? DataLibraryStoreMode.ApiOnly;
15869
+ });
15778
15870
  return {
15779
15871
  props: {
15780
15872
  ...await getNavPageLayoutPropsFromConfig(),
@@ -15786,7 +15878,7 @@ const DiscoveryPageGetServerSideProps = async ()=>{
15786
15878
  return {
15787
15879
  props: {
15788
15880
  ...await getNavPageLayoutPropsFromConfig(),
15789
- discoveryConfig: undefined
15881
+ discoveryConfig: []
15790
15882
  }
15791
15883
  };
15792
15884
  }
@@ -19114,6 +19206,32 @@ const getUniqueItemKey = (item)=>{
19114
19206
  return `file_${item.datasetId}_${item.id}`;
19115
19207
  }
19116
19208
  };
19209
+ const selectionToManifest = (dataLibrarySelections)=>{
19210
+ return dataLibrarySelections.reduce((acc, item)=>{
19211
+ if (isValidFileItemWithParentDatasetNameAndID(item)) {
19212
+ acc.push({
19213
+ object_id: item.id,
19214
+ ...item.name ? {
19215
+ file_name: item.name
19216
+ } : {},
19217
+ ...item.size ? {
19218
+ file_size: Number(item.size)
19219
+ } : {},
19220
+ dataset_id: item.datasetId
19221
+ });
19222
+ }
19223
+ return acc;
19224
+ }, []);
19225
+ };
19226
+ const extractDatasetIds = (dataLibrarySelections)=>{
19227
+ const metadataIds = dataLibrarySelections.reduce((acc, item)=>{
19228
+ if (isFileItem(item)) {
19229
+ acc.add(item.datasetId);
19230
+ }
19231
+ return acc;
19232
+ }, new Set());
19233
+ return Array.from(metadataIds);
19234
+ };
19117
19235
 
19118
19236
  // Create the context
19119
19237
  const DataLibrarySelectionContext = /*#__PURE__*/ createContext(undefined);
@@ -19667,6 +19785,11 @@ const evaluateGroupRule = (rule, items)=>{
19667
19785
  const fieldValue = items.map((item)=>item[rule.field]);
19668
19786
  return fieldValue.length === rule.total;
19669
19787
  }
19788
+ case 'greater':
19789
+ {
19790
+ const fieldValue = items.map((item)=>item[rule.field]);
19791
+ return fieldValue.length > rule.total;
19792
+ }
19670
19793
  }
19671
19794
  };
19672
19795
  /**
@@ -19704,7 +19827,7 @@ const isSendExistingPFBToURLParameters = (value)=>{
19704
19827
  const candidate = value;
19705
19828
  return 'targetURLTemplate' in candidate && typeof candidate.targetURLTemplate === 'string';
19706
19829
  };
19707
- const sendExistingPFBToURL = async (validatedSelections, params, done = ()=>null, error = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19830
+ const sendExistingPFBToURL = async (validatedSelections, params, onDone = ()=>null, onError = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19708
19831
  if (!isSendExistingPFBToURLParameters(params)) {
19709
19832
  console.error('Invalid parameters for sendPFBToURL action:', params);
19710
19833
  return;
@@ -19738,7 +19861,7 @@ const sendExistingPFBToURL = async (validatedSelections, params, done = ()=>null
19738
19861
  const targetURL = targetURLTemplate.replace(PRESIGNED_URL_TEMPLATE_VARIABLE, signedURL);
19739
19862
  return new Promise(()=>{
19740
19863
  if (window) window.open(targetURL, '_blank', 'noopener,noreferrer');
19741
- if (done) done(targetURL);
19864
+ if (onDone) onDone(targetURL);
19742
19865
  });
19743
19866
  } catch (error) {
19744
19867
  if (error instanceof HTTPError) {
@@ -19753,10 +19876,175 @@ const sendExistingPFBToURL = async (validatedSelections, params, done = ()=>null
19753
19876
  loading: false
19754
19877
  });
19755
19878
  }
19756
- console.error('Error sending PFB to URL', error);
19757
- return new Promise(()=>{
19758
- error(error);
19879
+ if (error instanceof Error) {
19880
+ if (error.name == 'AbortError') {
19881
+ onAbort?.();
19882
+ }
19883
+ return new Promise(()=>{
19884
+ onError?.(error);
19885
+ });
19886
+ }
19887
+ }
19888
+ };
19889
+
19890
+ const exportToManifest = async (validatedSelections, params, onDone = ()=>null, onError = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19891
+ const manifest = selectionToManifest(validatedSelections); // TODO md5sum? commons_name?
19892
+ try {
19893
+ const blob = new Blob([
19894
+ JSON.stringify(manifest, null, 2)
19895
+ ], {
19896
+ type: 'text/json'
19759
19897
  });
19898
+ FileSaver.saveAs(blob, MANIFEST_FILENAME);
19899
+ onDone?.();
19900
+ } catch (error) {
19901
+ if (error instanceof Error) {
19902
+ onError?.(error);
19903
+ } else onError?.(new Error('unknown error saving file'));
19904
+ }
19905
+ };
19906
+
19907
+ const ProvidersErrorPanel = ({ message, providers })=>{
19908
+ return /*#__PURE__*/ jsxs(Stack, {
19909
+ children: [
19910
+ /*#__PURE__*/ jsx(Text, {
19911
+ children: message
19912
+ }),
19913
+ /*#__PURE__*/ jsxs(Table, {
19914
+ children: [
19915
+ /*#__PURE__*/ jsx("thead", {
19916
+ children: /*#__PURE__*/ jsxs("tr", {
19917
+ children: [
19918
+ /*#__PURE__*/ jsx("th", {
19919
+ children: "Provider"
19920
+ }),
19921
+ /*#__PURE__*/ jsx("th", {
19922
+ children: "URL"
19923
+ })
19924
+ ]
19925
+ })
19926
+ }),
19927
+ /*#__PURE__*/ jsx("tbody", {
19928
+ children: providers.map((provider)=>/*#__PURE__*/ jsxs("tr", {
19929
+ children: [
19930
+ /*#__PURE__*/ jsx(Text, {
19931
+ children: provider.name
19932
+ }),
19933
+ /*#__PURE__*/ jsx(Text, {
19934
+ children: provider.base_url
19935
+ })
19936
+ ]
19937
+ }, provider.name))
19938
+ })
19939
+ ]
19940
+ })
19941
+ ]
19942
+ });
19943
+ };
19944
+
19945
+ const removeKeys = (obj, keysToRemove)=>{
19946
+ keysToRemove.forEach((key)=>{
19947
+ if (key.includes('.')) {
19948
+ const [firstKey, ...nestedKeys] = key.split('.');
19949
+ const nestedObj = get(obj, firstKey);
19950
+ unset(nestedObj, nestedKeys.join('.'));
19951
+ } else {
19952
+ unset(obj, key);
19953
+ }
19954
+ });
19955
+ return obj;
19956
+ };
19957
+ /**
19958
+ * Processes and assembles metadata by cloning objects, removing specified keys, and optionally accessing a defined metadata root.
19959
+ *
19960
+ * @param {Array<string>} keysToRemove - A list of keys to remove from each object in the selected resources after cloning.
19961
+ * @param {Array<Record<string, unknown>>} selectedResources - An array of resource objects to process and format.
19962
+ * @param {string} metadataRoot - The root key that holds the metadata in the objects. If present, this root is used as a starting point.
19963
+ * @returns {Array<Record<string, unknown>>} A new array of processed objects with the specified keys removed and metadata root applied when applicable.
19964
+ */ const assembleMetadata = (selectedResources, metadataRoot, keysToRemove)=>{
19965
+ return selectedResources.map((obj)=>{
19966
+ const clonedObj = cloneDeep(!obj[metadataRoot] ? obj : obj[metadataRoot]);
19967
+ // if there are keysToRemove, remove them
19968
+ if (keysToRemove) {
19969
+ return removeKeys(clonedObj, keysToRemove);
19970
+ }
19971
+ // Otherwise just return the cloned object
19972
+ return clonedObj;
19973
+ });
19974
+ };
19975
+ const exportMetadataToWorkspace = async (validatedSelections, params, onDone = ()=>null, onError = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19976
+ // first need to get file manifest
19977
+ try {
19978
+ const fileManifest = selectionToManifest(validatedSelections);
19979
+ if (params?.verifyExternalLogins) {
19980
+ const results = await getFederatedLoginStatus(fileManifest);
19981
+ const { error: providersError, providersToAuthenticate, missingProviders } = results;
19982
+ if (providersError) {
19983
+ onError?.(providersError);
19984
+ return;
19985
+ }
19986
+ if (providersToAuthenticate && providersToAuthenticate?.length > 0 && missingProviders && missingProviders?.length > 0) {
19987
+ modals.open({
19988
+ id: 'export-dicovery-to-workspace-providers-to-authenticate-modal',
19989
+ title: 'Error: Export to Workspace',
19990
+ withCloseButton: true,
19991
+ children: /*#__PURE__*/ jsxs(Stack, {
19992
+ children: [
19993
+ /*#__PURE__*/ jsx(ProvidersErrorPanel, {
19994
+ message: "The following providers need to be authenticated",
19995
+ providers: providersToAuthenticate
19996
+ }),
19997
+ /*#__PURE__*/ jsx(ProvidersErrorPanel, {
19998
+ message: "The following providers need to be authenticated",
19999
+ providers: providersToAuthenticate
20000
+ })
20001
+ ]
20002
+ })
20003
+ });
20004
+ return;
20005
+ }
20006
+ if (providersToAuthenticate && providersToAuthenticate?.length > 0) {
20007
+ modals.open({
20008
+ id: 'export-dicovery-to-workspace-providers-to-authenticate-modal',
20009
+ title: 'Error: Export to Workspace',
20010
+ withCloseButton: true,
20011
+ children: /*#__PURE__*/ jsx(ProvidersErrorPanel, {
20012
+ message: "The following providers need to be authenticated",
20013
+ providers: providersToAuthenticate
20014
+ })
20015
+ });
20016
+ return;
20017
+ } else {
20018
+ if (missingProviders && missingProviders?.length > 0) {
20019
+ modals.open({
20020
+ id: 'export-dicovery-to-workspace-providers-to-authenticate-modal',
20021
+ title: 'Error: Export to Workspace',
20022
+ withCloseButton: true,
20023
+ children: /*#__PURE__*/ jsx(ProvidersErrorPanel, {
20024
+ message: "The following providers are missing",
20025
+ providers: missingProviders
20026
+ })
20027
+ });
20028
+ return;
20029
+ }
20030
+ }
20031
+ }
20032
+ // next get the metadata from the dataset id
20033
+ const metadataIds = extractDatasetIds(validatedSelections);
20034
+ const metadata = await queryMultipleMDSRecords(metadataIds, params?.useAggMDS, signal);
20035
+ const metadataObjects = Object.values(metadata).map((metadataObj)=>metadataObj);
20036
+ const filteredMetadata = assembleMetadata(metadataObjects, params?.metadataRoot ?? 'gen3_discovery', params?.keysToRemove);
20037
+ // save the metadata
20038
+ await fetchJSONDataFromURL(`${GEN3_MANIFEST_API}/metadata`, true, 'POST', JSON.stringify(filteredMetadata), signal);
20039
+ // save files manifest
20040
+ await fetchJSONDataFromURL(`${GEN3_MANIFEST_API}/`, true, 'POST', JSON.stringify(fileManifest), signal);
20041
+ onDone?.();
20042
+ } catch (error) {
20043
+ if (error instanceof Error) {
20044
+ if (error.name == 'AbortError') {
20045
+ onAbort?.();
20046
+ }
20047
+ } else onError?.(new Error('unknown error'));
19760
20048
  }
19761
20049
  };
19762
20050
 
@@ -19784,6 +20072,12 @@ const registerDefaultDataLibraryActions = ()=>{
19784
20072
  registerAction('export-pfb-to-url', {
19785
20073
  action: sendExistingPFBToURL
19786
20074
  });
20075
+ registerAction('export-from-discovery-to-manifest', {
20076
+ action: exportToManifest
20077
+ });
20078
+ registerAction('export-from-discovery-to-workspace', {
20079
+ action: exportMetadataToWorkspace
20080
+ });
19787
20081
  };
19788
20082
  registerDefaultDataLibraryActions();
19789
20083
 
@@ -20693,7 +20987,7 @@ const DataSetContentsTable = ({ listId, data, removeList, size = 'sm' })=>{
20693
20987
  ]);
20694
20988
  const { selections, updateSelections, removeListMember, removeList } = useDataLibrarySelection();
20695
20989
  const updateList = async (update)=>{
20696
- await updateListInDataLibrary({
20990
+ return await updateListInDataLibrary({
20697
20991
  ...{
20698
20992
  name: listName,
20699
20993
  items: dataList.items
@@ -20816,8 +21110,10 @@ const DataSetContentsTable = ({ listId, data, removeList, size = 'sm' })=>{
20816
21110
  }, listName);
20817
21111
  };
20818
21112
 
20819
- const DataLibraryLists = ({ requiresLogin = true, actions, size })=>{
20820
- const { dataLibrary, isLoading, isUpdating, error: dataLibraryError, addListToDataLibrary, updateListInDataLibrary, deleteListFromDataLibrary } = useDataLibrary();
21113
+ const DataLibraryLists = ({ storageMode, requiresLogin = true, actions, size })=>{
21114
+ const { dataLibrary, isLoading, isUpdating, error: dataLibraryError, addListToDataLibrary, updateListInDataLibrary, deleteListFromDataLibrary } = useDataLibrary({
21115
+ storageMode
21116
+ });
20821
21117
  const { isAuthenticated } = useIsAuthenticated();
20822
21118
  const [selectedItemsOpen, { open, close }] = useDisclosure(false);
20823
21119
  const { gatherSelectedItems } = useDataLibrarySelection();
@@ -20825,27 +21121,34 @@ const DataLibraryLists = ({ requiresLogin = true, actions, size })=>{
20825
21121
  gatherSelectedItems(dataLibrary);
20826
21122
  open();
20827
21123
  };
20828
- if (dataLibraryError?.isError) {
20829
- if (dataLibraryError?.status === 401) {
20830
- let message = 'You are not authorized to access the library.';
20831
- if (requiresLogin) {
20832
- if (!isAuthenticated) message = 'Data Library requires login. Please log in to continue.';
20833
- else message = 'You are not authorized to access the library. Please contact your site administrator.';
20834
- }
20835
- return /*#__PURE__*/ jsx("div", {
20836
- className: "flex flex-col w-full ml-2",
20837
- children: /*#__PURE__*/ jsx(Center, {
20838
- children: /*#__PURE__*/ jsx(ErrorCard, {
20839
- message: message
20840
- })
20841
- })
21124
+ // Use useEffect to show notifications only when error changes
21125
+ useDeepCompareEffect(()=>{
21126
+ if (dataLibraryError?.isError && dataLibraryError?.status !== 401) {
21127
+ notifications.show({
21128
+ position: 'top-center',
21129
+ color: 'red',
21130
+ title: 'Data Library Error',
21131
+ message: dataLibraryError?.message,
21132
+ autoClose: 2000
20842
21133
  });
20843
- } else notifications.show({
20844
- position: 'top-center',
20845
- color: 'red',
20846
- title: 'Data Library Error',
20847
- message: dataLibraryError?.message,
20848
- autoClose: 2000
21134
+ }
21135
+ }, [
21136
+ dataLibraryError
21137
+ ]);
21138
+ // Handle 401 error with UI rendering
21139
+ if (dataLibraryError?.isError && dataLibraryError?.status === 401) {
21140
+ let message = 'You are not authorized to access the library.';
21141
+ if (requiresLogin) {
21142
+ if (!isAuthenticated) message = 'Data Library requires login. Please log in to continue.';
21143
+ else message = 'You are not authorized to access the library. Please contact your site administrator.';
21144
+ }
21145
+ return /*#__PURE__*/ jsx("div", {
21146
+ className: "flex flex-col w-full ml-2",
21147
+ children: /*#__PURE__*/ jsx(Center, {
21148
+ children: /*#__PURE__*/ jsx(ErrorCard, {
21149
+ message: message
21150
+ })
21151
+ })
20849
21152
  });
20850
21153
  }
20851
21154
  return /*#__PURE__*/ jsxs("div", {
@@ -20927,7 +21230,7 @@ const DataLibraryPageGetServerSideProps = async ()=>{
20927
21230
  props: {
20928
21231
  ...await getNavPageLayoutPropsFromConfig(),
20929
21232
  config: {
20930
- useAPI: false,
21233
+ storageMode: DataLibraryStoreMode.ApiOnly,
20931
21234
  actions: []
20932
21235
  }
20933
21236
  }
@@ -21544,5 +21847,5 @@ async function credentialsLogout(req, res) {
21544
21847
  res.redirect(307, '/');
21545
21848
  }
21546
21849
 
21547
- export { AISearchPageGetServerSideProps, ActionBar, ActionButton, AdminAuthZPageGetServerSideProps, AiSearch, AISearchPage as AiSearchPage, AnalysisCenter, AnalysisCenterWithSections, AnalysisEditorPage, AnalysisEditorPageGetServerSideProps, AnalysisPage, AnalysisPageGetServerSideProps, AuthzPage, BaseModal, Charts, CohortBuilder, CohortManager, CollapsableSidebar, ColorThemePage, ColorThemePageGetServerSideProps, ContentSource$1 as ContentSource, CreateCredentialsAPIKeyModal, CrosswalkPage, CrosswalkPageGetServerSideProps, Custom404Page, DataLibraryPage, DataLibraryPageGetServerSideProps, DictionaryPage, DictionaryPageGetServerSideProps, DiscoveryCellRendererFactory, DiscoveryProvider as DiscoveryConfigProvider, DiscoveryIndexPanel, DiscoveryPage, DiscoveryPageGetServerSideProps, DiscoveryRowRendererFactory, DropdownButton, EnumFacetChart, ErrorCard, ExplorerPage, ExplorerPageGetServerSideProps, ExplorerPageGetServerSidePropsForConfigId, ExplorerTableCellRendererFactory, ExplorerTableDetailsPanelFactory, FirstTimeModal, Footer, Gen3Button, Gen3ButtonReverse, Gen3Link, Gen3ModalsProvider, Gen3Provider, GqlQueryEditor$1 as GqlQueryEditor, Header, HoverLink, LandingPage, LandingPageGetServerSideProps, LoginButton$1 as LoginButton, LoginPage, LoginPageGetServerSideProps, LoginPanel, LoginProvidersPanel, MinutesToMilliseconds, NavPageLayout, NavigationBar, NavigationButton, NoAccessModal, NotebookLitePage, NotebookLitePageGetStaticProps, ProfilePage, ProfilePageGetServerSideProps, ProfileProvider, ProtectedContent, QueryPage, QueryPageGetServerSideProps, ReactECharts, ResourcesFilters, SPECIAL_CASE_FIELDS, SessionExpiredModal, StudyGroup, SubmissionPage, SubmissionPageGetServerSideProps, TagCloud, TailwindConfig, TopBar, UploadJSONButton, User, Workspace, WorkspaceNoAccessPage, WorkspaceNoAccessPageServerSideProps, WorkspacePage, WorkspacePageGetServerSideProps, capitalize, computeRowSpan, convertMinutesToMilliseconds, convertSecondsToMilliseconds, create10ColorAccessibleContrast, create10ColorPallet, createMantineTheme, credentialsLogin, credentialsLogout, extractObjectKey, focusStyles, getCurrentUnixTimestamp, getNavPageLayoutPropsFromConfig, getParamsValueAsString, getTagInfo, hasOwnProperty, isArrayOfString, isPropertyKey, isTextTransform$1 as isTextTransform, processLabel$1 as processLabel, processRangeKeyLabel, registerCohortBuilderDefaultPreviewRenderers, registerCohortDiscoveryApp, registerCohortSimilarityApp, registerDefaultDiscoveryDataLoaders, registerDiscoveryDefaultCellRenderers, registerDiscoveryDefaultStudyPreviewRenderers, registerExplorerDefaultCellRenderers, registerMetadataSchemaApp, removeKey$1 as removeKey, resourcePathFromProjectID, sessionLogout, sessionToken, stripTrailingSlash, toDisplayName, truncateString, unixTimeToString, useDiscoveryContext, userHasMethodForServiceOnResource$1 as userHasMethodForServiceOnResource };
21850
+ export { AISearchPageGetServerSideProps, ActionBar, ActionButton, AdminAuthZPageGetServerSideProps, AiSearch, AISearchPage as AiSearchPage, AnalysisCenter, AnalysisCenterWithSections, AnalysisEditorPage, AnalysisEditorPageGetServerSideProps, AnalysisPage, AnalysisPageGetServerSideProps, AuthzPage, Banner, BaseModal, Charts, CohortBuilder, CohortManager, CollapsableSidebar, ColorThemePage, ColorThemePageGetServerSideProps, ContentSource$1 as ContentSource, CreateCredentialsAPIKeyModal, CrosswalkPage, CrosswalkPageGetServerSideProps, Custom404Page, DataLibraryPage, DataLibraryPageGetServerSideProps, DictionaryPage, DictionaryPageGetServerSideProps, DiscoveryCellRendererFactory, DiscoveryProvider as DiscoveryConfigProvider, DiscoveryIndexPanel, DiscoveryPage, DiscoveryPageGetServerSideProps, DiscoveryRowRendererFactory, DropdownButton, EnumFacetChart, ErrorCard, ExplorerPage, ExplorerPageGetServerSideProps, ExplorerPageGetServerSidePropsForConfigId, ExplorerTableCellRendererFactory, ExplorerTableDetailsPanelFactory, FirstTimeModal, Footer, Gen3Button, Gen3ButtonReverse, Gen3Link, Gen3ModalsProvider, Gen3Provider, GqlQueryEditor$1 as GqlQueryEditor, Header, HoverLink, LandingPage, LandingPageGetServerSideProps, LoginButton$1 as LoginButton, LoginPage, LoginPageGetServerSideProps, LoginPanel, LoginProvidersPanel, MinutesToMilliseconds, NavPageLayout, NavigationBar, NavigationButton, NoAccessModal, NotebookLitePage, NotebookLitePageGetStaticProps, ProfilePage, ProfilePageGetServerSideProps, ProfileProvider, ProtectedContent, QueryPage, QueryPageGetServerSideProps, ReactECharts, ResourcesFilters, SPECIAL_CASE_FIELDS, SessionExpiredModal, StudyGroup, SubmissionPage, SubmissionPageGetServerSideProps, TagCloud, TailwindConfig, TopBar, UploadJSONButton, User, Workspace, WorkspaceNoAccessPage, WorkspaceNoAccessPageServerSideProps, WorkspacePage, WorkspacePageGetServerSideProps, capitalize, computeRowSpan, convertMinutesToMilliseconds, convertSecondsToMilliseconds, create10ColorAccessibleContrast, create10ColorPallet, createMantineTheme, credentialsLogin, credentialsLogout, extractObjectKey, focusStyles, getCurrentUnixTimestamp, getNavPageLayoutPropsFromConfig, getParamsValueAsString, getTagInfo, hasOwnProperty, isArrayOfString, isPropertyKey, isTextTransform$1 as isTextTransform, processLabel$1 as processLabel, processRangeKeyLabel, registerCohortBuilderDefaultPreviewRenderers, registerCohortDiscoveryApp, registerCohortSimilarityApp, registerDefaultDiscoveryDataLoaders, registerDiscoveryDefaultCellRenderers, registerDiscoveryDefaultStudyPreviewRenderers, registerExplorerDefaultCellRenderers, registerMetadataSchemaApp, removeKey$1 as removeKey, resourcePathFromProjectID, sessionLogout, sessionToken, stripTrailingSlash, toDisplayName, truncateString, unixTimeToString, useDiscoveryContext, userHasMethodForServiceOnResource$1 as userHasMethodForServiceOnResource };
21548
21851
  //# sourceMappingURL=index.js.map