@gen3/frontend 0.10.91 → 0.10.92

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 (194) hide show
  1. package/dist/cjs/index.js +383 -84
  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 +82 -0
  77. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.js.map +1 -0
  78. package/dist/dts/features/CohortDiscovery/appApi.d.ts +10 -1
  79. package/dist/dts/features/CohortDiscovery/appApi.d.ts.map +1 -1
  80. package/dist/dts/features/CohortDiscovery/appApi.js.map +1 -1
  81. package/dist/dts/features/CohortDiscovery/appApiRTKQ.d.ts +1 -0
  82. package/dist/dts/features/CohortDiscovery/appApiRTKQ.d.ts.map +1 -0
  83. package/dist/dts/features/CohortDiscovery/appApiRTKQ.js +101 -0
  84. package/dist/dts/features/CohortDiscovery/appApiRTKQ.js.map +1 -0
  85. package/dist/dts/features/CohortDiscovery/queryApi.d.ts +32 -0
  86. package/dist/dts/features/CohortDiscovery/queryApi.d.ts.map +1 -0
  87. package/dist/dts/features/CohortDiscovery/queryApi.js +498 -0
  88. package/dist/dts/features/CohortDiscovery/queryApi.js.map +1 -0
  89. package/dist/dts/features/CohortDiscovery/tableSettings.d.ts +3 -0
  90. package/dist/dts/features/CohortDiscovery/tableSettings.d.ts.map +1 -0
  91. package/dist/dts/features/CohortDiscovery/tableSettings.js +68 -0
  92. package/dist/dts/features/CohortDiscovery/tableSettings.js.map +1 -0
  93. package/dist/dts/features/DataLibrary/DataLibrary.d.ts.map +1 -1
  94. package/dist/dts/features/DataLibrary/DataLibrary.js +1 -0
  95. package/dist/dts/features/DataLibrary/DataLibrary.js.map +1 -1
  96. package/dist/dts/features/DataLibrary/DataLibraryLists.d.ts.map +1 -1
  97. package/dist/dts/features/DataLibrary/DataLibraryLists.js +19 -15
  98. package/dist/dts/features/DataLibrary/DataLibraryLists.js.map +1 -1
  99. package/dist/dts/features/DataLibrary/DatalistAccordionItem.d.ts +3 -3
  100. package/dist/dts/features/DataLibrary/DatalistAccordionItem.d.ts.map +1 -1
  101. package/dist/dts/features/DataLibrary/DatalistAccordionItem.js +1 -3
  102. package/dist/dts/features/DataLibrary/DatalistAccordionItem.js.map +1 -1
  103. package/dist/dts/features/DataLibrary/DatasetAccordionControl.d.ts +3 -2
  104. package/dist/dts/features/DataLibrary/DatasetAccordionControl.d.ts.map +1 -1
  105. package/dist/dts/features/DataLibrary/DatasetAccordionControl.js.map +1 -1
  106. package/dist/dts/features/DataLibrary/SearchAndActions.d.ts +2 -2
  107. package/dist/dts/features/DataLibrary/SearchAndActions.d.ts.map +1 -1
  108. package/dist/dts/features/DataLibrary/SearchAndActions.js.map +1 -1
  109. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.d.ts +3 -0
  110. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.d.ts.map +1 -0
  111. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.js +178 -0
  112. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/exportMetadataToWorkspace.js.map +1 -0
  113. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.d.ts +9 -0
  114. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.d.ts.map +1 -0
  115. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.js +7 -0
  116. package/dist/dts/features/DataLibrary/selection/actions/exportDatasetsToWorkspace/providerErrorNotification.js.map +1 -0
  117. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.d.ts +3 -0
  118. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.d.ts.map +1 -0
  119. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.js +80 -0
  120. package/dist/dts/features/DataLibrary/selection/actions/exportToManifest.js.map +1 -0
  121. package/dist/dts/features/DataLibrary/selection/exportActions.d.ts.map +1 -1
  122. package/dist/dts/features/DataLibrary/selection/exportActions.js +14 -9
  123. package/dist/dts/features/DataLibrary/selection/exportActions.js.map +1 -1
  124. package/dist/dts/features/DataLibrary/selection/registeredActions.d.ts.map +1 -1
  125. package/dist/dts/features/DataLibrary/selection/registeredActions.js +8 -0
  126. package/dist/dts/features/DataLibrary/selection/registeredActions.js.map +1 -1
  127. package/dist/dts/features/DataLibrary/selection/selectedItemActions.d.ts.map +1 -1
  128. package/dist/dts/features/DataLibrary/selection/selectedItemActions.js +4 -0
  129. package/dist/dts/features/DataLibrary/selection/selectedItemActions.js.map +1 -1
  130. package/dist/dts/features/DataLibrary/selection/tests/utils.unit.test.js +71 -1
  131. package/dist/dts/features/DataLibrary/selection/tests/utils.unit.test.js.map +1 -1
  132. package/dist/dts/features/DataLibrary/selection/types.d.ts +2 -2
  133. package/dist/dts/features/DataLibrary/selection/types.d.ts.map +1 -1
  134. package/dist/dts/features/DataLibrary/selection/utils.d.ts +4 -2
  135. package/dist/dts/features/DataLibrary/selection/utils.d.ts.map +1 -1
  136. package/dist/dts/features/DataLibrary/selection/utils.js +18 -0
  137. package/dist/dts/features/DataLibrary/selection/utils.js.map +1 -1
  138. package/dist/dts/features/DataLibrary/types.d.ts +7 -2
  139. package/dist/dts/features/DataLibrary/types.d.ts.map +1 -1
  140. package/dist/dts/features/DataLibrary/types.js +18 -0
  141. package/dist/dts/features/DataLibrary/types.js.map +1 -1
  142. package/dist/dts/features/Discovery/ActionBar/ActionBar.d.ts.map +1 -1
  143. package/dist/dts/features/Discovery/ActionBar/ActionBar.js +6 -3
  144. package/dist/dts/features/Discovery/ActionBar/ActionBar.js.map +1 -1
  145. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.d.ts +1 -1
  146. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.d.ts.map +1 -1
  147. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.js +70 -53
  148. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.js.map +1 -1
  149. package/dist/dts/features/Discovery/ActionBar/AddToDataLibrary.stories.d.ts +1 -1
  150. package/dist/dts/features/Discovery/ActionBar/DownloadManifestButton.js +1 -1
  151. package/dist/dts/features/Discovery/ActionBar/DownloadManifestButton.js.map +1 -1
  152. package/dist/dts/features/Discovery/ActionBar/types.d.ts +3 -1
  153. package/dist/dts/features/Discovery/ActionBar/types.d.ts.map +1 -1
  154. package/dist/dts/features/Discovery/Discovery.d.ts.map +1 -1
  155. package/dist/dts/features/Discovery/Discovery.js +1 -0
  156. package/dist/dts/features/Discovery/Discovery.js.map +1 -1
  157. package/dist/dts/features/Discovery/DiscoveryIndexPanel.d.ts.map +1 -1
  158. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js +3 -2
  159. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js.map +1 -1
  160. package/dist/dts/features/Discovery/DiscoveryTable.d.ts.map +1 -1
  161. package/dist/dts/features/Discovery/DiscoveryTable.js.map +1 -1
  162. package/dist/dts/features/Discovery/TableRenderers/DataAccessCellRenderers.d.ts.map +1 -1
  163. package/dist/dts/features/Discovery/TableRenderers/DataAccessCellRenderers.js +13 -3
  164. package/dist/dts/features/Discovery/TableRenderers/DataAccessCellRenderers.js.map +1 -1
  165. package/dist/dts/features/Discovery/types.d.ts +2 -1
  166. package/dist/dts/features/Discovery/types.d.ts.map +1 -1
  167. package/dist/dts/features/Discovery/types.js.map +1 -1
  168. package/dist/dts/features/Workspace/PaymentPanel/PaymentPanel.d.ts.map +1 -1
  169. package/dist/dts/features/Workspace/PaymentPanel/PaymentPanel.js +3 -1
  170. package/dist/dts/features/Workspace/PaymentPanel/PaymentPanel.js.map +1 -1
  171. package/dist/dts/lib/session/session.d.ts.map +1 -1
  172. package/dist/dts/lib/session/session.js +3 -1
  173. package/dist/dts/lib/session/session.js.map +1 -1
  174. package/dist/dts/pages/DataLibrary/DataLibrary.d.ts.map +1 -1
  175. package/dist/dts/pages/DataLibrary/DataLibrary.js +1 -0
  176. package/dist/dts/pages/DataLibrary/DataLibrary.js.map +1 -1
  177. package/dist/dts/pages/DataLibrary/data.js +2 -2
  178. package/dist/dts/pages/DataLibrary/data.js.map +1 -1
  179. package/dist/dts/pages/Discovery/data.d.ts.map +1 -1
  180. package/dist/dts/pages/Discovery/data.js +22 -11
  181. package/dist/dts/pages/Discovery/data.js.map +1 -1
  182. package/dist/dts/types/constants.d.ts +2 -0
  183. package/dist/dts/types/constants.d.ts.map +1 -0
  184. package/dist/dts/types/constants.js +2 -0
  185. package/dist/dts/types/constants.js.map +1 -0
  186. package/dist/dts/utils/sizes.d.ts +4 -0
  187. package/dist/dts/utils/sizes.d.ts.map +1 -0
  188. package/dist/dts/utils/sizes.js +25 -0
  189. package/dist/dts/utils/sizes.js.map +1 -0
  190. package/dist/esm/index.js +385 -86
  191. package/dist/esm/index.js.map +1 -1
  192. package/dist/index.d.ts +4 -3
  193. package/dist/tsconfig.tsbuildinfo +1 -1
  194. 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.
@@ -5624,7 +5684,7 @@ const createTooltipLabel = (error, isLoggedIn, requiresLogin, numSelected, curre
5624
5684
  if (!currentListName) return 'Please select or create a list';
5625
5685
  return 'Add selections to list';
5626
5686
  };
5627
- const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, classNames = {} })=>{
5687
+ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, dataLibraryStoreMode = DataLibraryStoreMode.ApiOnly, classNames = {} })=>{
5628
5688
  const [selectItems, setSelectItems] = useState({});
5629
5689
  const [currentList, setCurrentList] = useState(null);
5630
5690
  const [error, setError] = useState(null);
@@ -5640,23 +5700,26 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5640
5700
  root: 'w-1/2'
5641
5701
  };
5642
5702
  const mergedClassnames = mergeDefaultTailwindClassnames(classNamesDefaults, classNames);
5643
- const { dataLibrary, updateListInDataLibrary, addListToDataLibrary, isLoading, error: dataLibraryError } = useDataLibrary();
5703
+ const { dataLibrary, updateListInDataLibrary, addListToDataLibrary, isLoading, isUpdating, error: dataLibraryError } = useDataLibrary({
5704
+ storageMode: dataLibraryStoreMode
5705
+ });
5644
5706
  const saveToList = (listname, listId = undefined)=>{
5645
5707
  if (selectedResources.length === 0) return;
5646
5708
  const items = buildListItemsGroupedByDataset(extractFileDatasetsInRecords(selectedResources, exportDataFields));
5709
+ if (Object.keys(items).length === 0) {
5710
+ notifications.show({
5711
+ id: 'update-datalibrary-no-items-to-update-notification',
5712
+ position: 'top-center',
5713
+ withCloseButton: true,
5714
+ autoClose: 5000,
5715
+ title: 'Save to list',
5716
+ message: `No data objects selected to save to list ${listname}.`,
5717
+ loading: false
5718
+ });
5719
+ return;
5720
+ }
5647
5721
  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
- }
5722
+ // updating list
5660
5723
  updateListInDataLibrary({
5661
5724
  id: listId,
5662
5725
  name: listname,
@@ -5664,26 +5727,46 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5664
5727
  ...dataLibrary[listId].items,
5665
5728
  ...items
5666
5729
  }
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
5730
+ }).then((results)=>{
5731
+ if (results.isError) notifications.show({
5732
+ id: 'update-datalibrary-list-error-notification',
5733
+ position: 'top-center',
5734
+ withCloseButton: true,
5735
+ autoClose: 5000,
5736
+ title: 'Save to list',
5737
+ message: `Error saving to list ${listname}.`,
5738
+ loading: isUpdating !== null
5739
+ });
5740
+ else notifications.show({
5741
+ id: 'update-datalibrary-list-notification',
5742
+ position: 'top-center',
5743
+ withCloseButton: true,
5744
+ autoClose: 5000,
5745
+ title: 'Save to list',
5746
+ message: `${Object.values(items).length} datasets saved to list ${listname}.`,
5747
+ loading: isUpdating !== null
5748
+ });
5676
5749
  });
5677
5750
  } 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
5751
+ addListToDataLibrary(items, listname).then((results)=>{
5752
+ if (results.isError) notifications.show({
5753
+ id: 'update-datalibrary-list-error-notification',
5754
+ position: 'top-center',
5755
+ withCloseButton: true,
5756
+ autoClose: 5000,
5757
+ title: 'Save to list',
5758
+ message: `Error saving to list ${listname}.`,
5759
+ loading: isUpdating !== null
5760
+ });
5761
+ else notifications.show({
5762
+ id: 'update-datalibrary-list-notification',
5763
+ position: 'top-center',
5764
+ withCloseButton: true,
5765
+ autoClose: 5000,
5766
+ title: 'Save to list',
5767
+ message: `${Object.values(items).length} datasets saved to list ${listname}.`,
5768
+ loading: isLoading
5769
+ });
5687
5770
  });
5688
5771
  }
5689
5772
  };
@@ -5706,21 +5789,11 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5706
5789
  options
5707
5790
  ]);
5708
5791
  useDeepCompareEffect(()=>{
5709
- if (dataLibrary && !dataLibraryError) {
5792
+ if (dataLibrary) if (!dataLibraryError) {
5710
5793
  const listItems = extractIdToLabel(dataLibrary);
5711
5794
  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
- });
5795
+ } else {
5796
+ setError(dataLibraryError);
5724
5797
  }
5725
5798
  }, [
5726
5799
  dataLibrary,
@@ -5792,7 +5865,7 @@ const AddToDataLibrary = ({ buttonConfig, selectedResources, exportDataFields, c
5792
5865
  });
5793
5866
  };
5794
5867
 
5795
- const createActionButton = ({ buttonConfig, selectedResources, exportDataFields })=>{
5868
+ const createActionButton = ({ buttonConfig, selectedResources, exportDataFields, verifyExternalLogins, dataLibraryStoreMode })=>{
5796
5869
  return ({
5797
5870
  manifest: /*#__PURE__*/ jsx(DownloadManifestButton, {
5798
5871
  buttonConfig: buttonConfig,
@@ -5802,18 +5875,22 @@ const createActionButton = ({ buttonConfig, selectedResources, exportDataFields
5802
5875
  addToDataLibrary: /*#__PURE__*/ jsx(AddToDataLibrary, {
5803
5876
  buttonConfig: buttonConfig,
5804
5877
  selectedResources: selectedResources,
5805
- exportDataFields: exportDataFields
5878
+ exportDataFields: exportDataFields,
5879
+ verifyExternalLogins: verifyExternalLogins,
5880
+ dataLibraryStoreMode: dataLibraryStoreMode
5806
5881
  }, buttonConfig.type)
5807
5882
  })[buttonConfig.type];
5808
5883
  };
5809
- const ActionBar = ({ buttons, selectedResources, exportDataFields, verifyExternalLogins })=>{
5884
+ const ActionBar = ({ buttons, selectedResources, exportDataFields, verifyExternalLogins, dataLibraryStoreMode = DataLibraryStoreMode.ApiOnly })=>{
5810
5885
  return /*#__PURE__*/ jsx("div", {
5811
5886
  className: "flex items-center justify-end py-1 px-2 mb-1 w-full gap-x-1.5 ",
5812
5887
  children: buttons?.map((button)=>{
5813
5888
  return createActionButton({
5814
5889
  buttonConfig: button,
5815
5890
  selectedResources,
5816
- exportDataFields
5891
+ exportDataFields,
5892
+ verifyExternalLogins,
5893
+ dataLibraryStoreMode
5817
5894
  });
5818
5895
  })
5819
5896
  });
@@ -7203,7 +7280,6 @@ registerDefaultDiscoveryDataLoaders();
7203
7280
  *
7204
7281
  * @return {JSX.Element} A fully featured discovery interface including search functionality, a table, charts, filters, and more.
7205
7282
  */ const DiscoveryIndexPanel = ({ discoveryConfig, indexSelector })=>{
7206
- console.log(discoveryConfig);
7207
7283
  const dataHook = useMemo(()=>getDiscoveryDataLoader(discoveryConfig?.features?.dataLoader?.dataFetchFunction) ?? useLoadAllMDSData, [
7208
7284
  discoveryConfig?.features?.dataLoader?.dataFetchFunction
7209
7285
  ]);
@@ -7248,6 +7324,7 @@ registerDefaultDiscoveryDataLoaders();
7248
7324
  discoveryConfig?.minimalFieldMapping?.uid,
7249
7325
  selections
7250
7326
  ]);
7327
+ console.log('selectedRecords', selectedRecords);
7251
7328
  const [sorting, setSorting] = useState([]);
7252
7329
  const [showAdvancedSearch, { toggle: toggleAdvancedSearch }] = useDisclosure(false);
7253
7330
  if (dataRequestStatus.isLoading) {
@@ -7325,7 +7402,8 @@ registerDefaultDiscoveryDataLoaders();
7325
7402
  buttons: discoveryConfig.features.exportFromDiscovery.buttons,
7326
7403
  exportDataFields: discoveryConfig.features.exportFromDiscovery.exportDataFields,
7327
7404
  selectedResources: selectedRecords,
7328
- verifyExternalLogins: discoveryConfig.features.exportFromDiscovery.verifyExternalLogins
7405
+ verifyExternalLogins: discoveryConfig.features.exportFromDiscovery.verifyExternalLogins,
7406
+ dataLibraryStoreMode: discoveryConfig.features.exportFromDiscovery.dataLibraryStoreMode
7329
7407
  }) : null
7330
7408
  ]
7331
7409
  }),
@@ -11992,7 +12070,7 @@ const PaymentPanel = ()=>{
11992
12070
  setSelectedPayModel(data.currentPayModel.bmh_workspace_id ?? data.currentPayModel.workspace_type);
11993
12071
  return {
11994
12072
  usersPayModels,
11995
- workspaceName: data.currentPayModel.bmh_workspace_id.length > 0 ? data.currentPayModel.bmh_workspace_id.length : data.currentPayModel.workspace_type,
12073
+ workspaceName: data.currentPayModel.bmh_workspace_id.length > 0 ? data.currentPayModel.bmh_workspace_id : data.currentPayModel.workspace_type,
11996
12074
  totalUsage: data.currentPayModel['total-usage'],
11997
12075
  hardLimit: data.currentPayModel['hard-limit']
11998
12076
  };
@@ -12001,6 +12079,7 @@ const PaymentPanel = ()=>{
12001
12079
  ]);
12002
12080
  const PayModelSelectItem = ({ option })=>{
12003
12081
  const menuItem = usersPayModels[Number(option.value)];
12082
+ if (!menuItem) return null;
12004
12083
  return /*#__PURE__*/ jsx("div", {
12005
12084
  children: /*#__PURE__*/ jsxs(Group, {
12006
12085
  wrap: "nowrap",
@@ -15689,6 +15768,7 @@ const MessagePanel = ({ message, isError = false })=>{
15689
15768
  const extractLabel = (c, idx)=>c.label ?? c.features?.pageTitle?.text ?? `Index ${idx.toString()}`;
15690
15769
  const Discovery = ({ discoveryConfig })=>{
15691
15770
  const [metadataIndex, setMetadataIndex] = useState('0');
15771
+ console.log('Discovery Component', discoveryConfig);
15692
15772
  const menuItems = useMemo(()=>{
15693
15773
  return discoveryConfig.metadataConfig.map((n, idx)=>{
15694
15774
  return {
@@ -15775,6 +15855,12 @@ const DiscoveryPage = ({ headerProps, footerProps, discoveryConfig })=>{
15775
15855
  const DiscoveryPageGetServerSideProps = async ()=>{
15776
15856
  try {
15777
15857
  const discoveryConfig = await ContentSource$1.getContentDatabase().get(`${GEN3_COMMONS_NAME}/discovery.json`);
15858
+ // need data library config for export from discovery using the DataLibrary
15859
+ const datalibraryConfig = await ContentSource$1.getContentDatabase().get(`${GEN3_COMMONS_NAME}/dataLibrary.json`);
15860
+ discoveryConfig.metadataConfig?.forEach((index)=>{
15861
+ if (index.features.exportFromDiscovery) index.features.exportFromDiscovery.dataLibraryStoreMode = datalibraryConfig?.storageMode ?? DataLibraryStoreMode.ApiOnly;
15862
+ });
15863
+ console.log('Updated Config', discoveryConfig);
15778
15864
  return {
15779
15865
  props: {
15780
15866
  ...await getNavPageLayoutPropsFromConfig(),
@@ -19114,6 +19200,32 @@ const getUniqueItemKey = (item)=>{
19114
19200
  return `file_${item.datasetId}_${item.id}`;
19115
19201
  }
19116
19202
  };
19203
+ const selectionToManifest = (dataLibrarySelections)=>{
19204
+ return dataLibrarySelections.reduce((acc, item)=>{
19205
+ if (isValidFileItemWithParentDatasetNameAndID(item)) {
19206
+ acc.push({
19207
+ object_id: item.id,
19208
+ ...item.name ? {
19209
+ file_name: item.name
19210
+ } : {},
19211
+ ...item.size ? {
19212
+ file_size: Number(item.size)
19213
+ } : {},
19214
+ dataset_id: item.datasetId
19215
+ });
19216
+ }
19217
+ return acc;
19218
+ }, []);
19219
+ };
19220
+ const extractDatasetIds = (dataLibrarySelections)=>{
19221
+ const metadataIds = dataLibrarySelections.reduce((acc, item)=>{
19222
+ if (isFileItem(item)) {
19223
+ acc.add(item.datasetId);
19224
+ }
19225
+ return acc;
19226
+ }, new Set());
19227
+ return Array.from(metadataIds);
19228
+ };
19117
19229
 
19118
19230
  // Create the context
19119
19231
  const DataLibrarySelectionContext = /*#__PURE__*/ createContext(undefined);
@@ -19667,6 +19779,11 @@ const evaluateGroupRule = (rule, items)=>{
19667
19779
  const fieldValue = items.map((item)=>item[rule.field]);
19668
19780
  return fieldValue.length === rule.total;
19669
19781
  }
19782
+ case 'greater':
19783
+ {
19784
+ const fieldValue = items.map((item)=>item[rule.field]);
19785
+ return fieldValue.length > rule.total;
19786
+ }
19670
19787
  }
19671
19788
  };
19672
19789
  /**
@@ -19704,7 +19821,7 @@ const isSendExistingPFBToURLParameters = (value)=>{
19704
19821
  const candidate = value;
19705
19822
  return 'targetURLTemplate' in candidate && typeof candidate.targetURLTemplate === 'string';
19706
19823
  };
19707
- const sendExistingPFBToURL = async (validatedSelections, params, done = ()=>null, error = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19824
+ const sendExistingPFBToURL = async (validatedSelections, params, onDone = ()=>null, onError = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19708
19825
  if (!isSendExistingPFBToURLParameters(params)) {
19709
19826
  console.error('Invalid parameters for sendPFBToURL action:', params);
19710
19827
  return;
@@ -19738,7 +19855,7 @@ const sendExistingPFBToURL = async (validatedSelections, params, done = ()=>null
19738
19855
  const targetURL = targetURLTemplate.replace(PRESIGNED_URL_TEMPLATE_VARIABLE, signedURL);
19739
19856
  return new Promise(()=>{
19740
19857
  if (window) window.open(targetURL, '_blank', 'noopener,noreferrer');
19741
- if (done) done(targetURL);
19858
+ if (onDone) onDone(targetURL);
19742
19859
  });
19743
19860
  } catch (error) {
19744
19861
  if (error instanceof HTTPError) {
@@ -19753,10 +19870,175 @@ const sendExistingPFBToURL = async (validatedSelections, params, done = ()=>null
19753
19870
  loading: false
19754
19871
  });
19755
19872
  }
19756
- console.error('Error sending PFB to URL', error);
19757
- return new Promise(()=>{
19758
- error(error);
19873
+ if (error instanceof Error) {
19874
+ if (error.name == 'AbortError') {
19875
+ onAbort?.();
19876
+ }
19877
+ return new Promise(()=>{
19878
+ onError?.(error);
19879
+ });
19880
+ }
19881
+ }
19882
+ };
19883
+
19884
+ const exportToManifest = async (validatedSelections, params, onDone = ()=>null, onError = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19885
+ const manifest = selectionToManifest(validatedSelections); // TODO md5sum? commons_name?
19886
+ try {
19887
+ const blob = new Blob([
19888
+ JSON.stringify(manifest, null, 2)
19889
+ ], {
19890
+ type: 'text/json'
19759
19891
  });
19892
+ FileSaver.saveAs(blob, MANIFEST_FILENAME);
19893
+ onDone?.();
19894
+ } catch (error) {
19895
+ if (error instanceof Error) {
19896
+ onError?.(error);
19897
+ } else onError?.(new Error('unknown error saving file'));
19898
+ }
19899
+ };
19900
+
19901
+ const ProvidersErrorPanel = ({ message, providers })=>{
19902
+ return /*#__PURE__*/ jsxs(Stack, {
19903
+ children: [
19904
+ /*#__PURE__*/ jsx(Text, {
19905
+ children: message
19906
+ }),
19907
+ /*#__PURE__*/ jsxs(Table, {
19908
+ children: [
19909
+ /*#__PURE__*/ jsx("thead", {
19910
+ children: /*#__PURE__*/ jsxs("tr", {
19911
+ children: [
19912
+ /*#__PURE__*/ jsx("th", {
19913
+ children: "Provider"
19914
+ }),
19915
+ /*#__PURE__*/ jsx("th", {
19916
+ children: "URL"
19917
+ })
19918
+ ]
19919
+ })
19920
+ }),
19921
+ /*#__PURE__*/ jsx("tbody", {
19922
+ children: providers.map((provider)=>/*#__PURE__*/ jsxs("tr", {
19923
+ children: [
19924
+ /*#__PURE__*/ jsx(Text, {
19925
+ children: provider.name
19926
+ }),
19927
+ /*#__PURE__*/ jsx(Text, {
19928
+ children: provider.base_url
19929
+ })
19930
+ ]
19931
+ }, provider.name))
19932
+ })
19933
+ ]
19934
+ })
19935
+ ]
19936
+ });
19937
+ };
19938
+
19939
+ const removeKeys = (obj, keysToRemove)=>{
19940
+ keysToRemove.forEach((key)=>{
19941
+ if (key.includes('.')) {
19942
+ const [firstKey, ...nestedKeys] = key.split('.');
19943
+ const nestedObj = get(obj, firstKey);
19944
+ unset(nestedObj, nestedKeys.join('.'));
19945
+ } else {
19946
+ unset(obj, key);
19947
+ }
19948
+ });
19949
+ return obj;
19950
+ };
19951
+ /**
19952
+ * Processes and assembles metadata by cloning objects, removing specified keys, and optionally accessing a defined metadata root.
19953
+ *
19954
+ * @param {Array<string>} keysToRemove - A list of keys to remove from each object in the selected resources after cloning.
19955
+ * @param {Array<Record<string, unknown>>} selectedResources - An array of resource objects to process and format.
19956
+ * @param {string} metadataRoot - The root key that holds the metadata in the objects. If present, this root is used as a starting point.
19957
+ * @returns {Array<Record<string, unknown>>} A new array of processed objects with the specified keys removed and metadata root applied when applicable.
19958
+ */ const assembleMetadata = (selectedResources, metadataRoot, keysToRemove)=>{
19959
+ return selectedResources.map((obj)=>{
19960
+ const clonedObj = cloneDeep(!obj[metadataRoot] ? obj : obj[metadataRoot]);
19961
+ // if there are keysToRemove, remove them
19962
+ if (keysToRemove) {
19963
+ return removeKeys(clonedObj, keysToRemove);
19964
+ }
19965
+ // Otherwise just return the cloned object
19966
+ return clonedObj;
19967
+ });
19968
+ };
19969
+ const exportMetadataToWorkspace = async (validatedSelections, params, onDone = ()=>null, onError = ()=>null, onAbort = ()=>null, signal = undefined)=>{
19970
+ // first need to get file manifest
19971
+ try {
19972
+ const fileManifest = selectionToManifest(validatedSelections);
19973
+ if (params?.verifyExternalLogins) {
19974
+ const results = await getFederatedLoginStatus(fileManifest);
19975
+ const { error: providersError, providersToAuthenticate, missingProviders } = results;
19976
+ if (providersError) {
19977
+ onError?.(providersError);
19978
+ return;
19979
+ }
19980
+ if (providersToAuthenticate && providersToAuthenticate?.length > 0 && missingProviders && missingProviders?.length > 0) {
19981
+ modals.open({
19982
+ id: 'export-dicovery-to-workspace-providers-to-authenticate-modal',
19983
+ title: 'Error: Export to Workspace',
19984
+ withCloseButton: true,
19985
+ children: /*#__PURE__*/ jsxs(Stack, {
19986
+ children: [
19987
+ /*#__PURE__*/ jsx(ProvidersErrorPanel, {
19988
+ message: "The following providers need to be authenticated",
19989
+ providers: providersToAuthenticate
19990
+ }),
19991
+ /*#__PURE__*/ jsx(ProvidersErrorPanel, {
19992
+ message: "The following providers need to be authenticated",
19993
+ providers: providersToAuthenticate
19994
+ })
19995
+ ]
19996
+ })
19997
+ });
19998
+ return;
19999
+ }
20000
+ if (providersToAuthenticate && providersToAuthenticate?.length > 0) {
20001
+ modals.open({
20002
+ id: 'export-dicovery-to-workspace-providers-to-authenticate-modal',
20003
+ title: 'Error: Export to Workspace',
20004
+ withCloseButton: true,
20005
+ children: /*#__PURE__*/ jsx(ProvidersErrorPanel, {
20006
+ message: "The following providers need to be authenticated",
20007
+ providers: providersToAuthenticate
20008
+ })
20009
+ });
20010
+ return;
20011
+ } else {
20012
+ if (missingProviders && missingProviders?.length > 0) {
20013
+ modals.open({
20014
+ id: 'export-dicovery-to-workspace-providers-to-authenticate-modal',
20015
+ title: 'Error: Export to Workspace',
20016
+ withCloseButton: true,
20017
+ children: /*#__PURE__*/ jsx(ProvidersErrorPanel, {
20018
+ message: "The following providers are missing",
20019
+ providers: missingProviders
20020
+ })
20021
+ });
20022
+ return;
20023
+ }
20024
+ }
20025
+ }
20026
+ // next get the metadata from the dataset id
20027
+ const metadataIds = extractDatasetIds(validatedSelections);
20028
+ const metadata = await queryMultipleMDSRecords(metadataIds, params?.useAggMDS, signal);
20029
+ const metadataObjects = Object.values(metadata).map((metadataObj)=>metadataObj);
20030
+ const filteredMetadata = assembleMetadata(metadataObjects, params?.metadataRoot ?? 'gen3_discovery', params?.keysToRemove);
20031
+ // save the metadata
20032
+ await fetchJSONDataFromURL(`${GEN3_MANIFEST_API}/metadata`, true, 'POST', JSON.stringify(filteredMetadata), signal);
20033
+ // save files manifest
20034
+ await fetchJSONDataFromURL(`${GEN3_MANIFEST_API}/`, true, 'POST', JSON.stringify(fileManifest), signal);
20035
+ onDone?.();
20036
+ } catch (error) {
20037
+ if (error instanceof Error) {
20038
+ if (error.name == 'AbortError') {
20039
+ onAbort?.();
20040
+ }
20041
+ } else onError?.(new Error('unknown error'));
19760
20042
  }
19761
20043
  };
19762
20044
 
@@ -19784,6 +20066,12 @@ const registerDefaultDataLibraryActions = ()=>{
19784
20066
  registerAction('export-pfb-to-url', {
19785
20067
  action: sendExistingPFBToURL
19786
20068
  });
20069
+ registerAction('export-from-discovery-to-manifest', {
20070
+ action: exportToManifest
20071
+ });
20072
+ registerAction('export-from-discovery-to-workspace', {
20073
+ action: exportMetadataToWorkspace
20074
+ });
19787
20075
  };
19788
20076
  registerDefaultDataLibraryActions();
19789
20077
 
@@ -20693,7 +20981,7 @@ const DataSetContentsTable = ({ listId, data, removeList, size = 'sm' })=>{
20693
20981
  ]);
20694
20982
  const { selections, updateSelections, removeListMember, removeList } = useDataLibrarySelection();
20695
20983
  const updateList = async (update)=>{
20696
- await updateListInDataLibrary({
20984
+ return await updateListInDataLibrary({
20697
20985
  ...{
20698
20986
  name: listName,
20699
20987
  items: dataList.items
@@ -20816,8 +21104,10 @@ const DataSetContentsTable = ({ listId, data, removeList, size = 'sm' })=>{
20816
21104
  }, listName);
20817
21105
  };
20818
21106
 
20819
- const DataLibraryLists = ({ requiresLogin = true, actions, size })=>{
20820
- const { dataLibrary, isLoading, isUpdating, error: dataLibraryError, addListToDataLibrary, updateListInDataLibrary, deleteListFromDataLibrary } = useDataLibrary();
21107
+ const DataLibraryLists = ({ storageMode, requiresLogin = true, actions, size })=>{
21108
+ const { dataLibrary, isLoading, isUpdating, error: dataLibraryError, addListToDataLibrary, updateListInDataLibrary, deleteListFromDataLibrary } = useDataLibrary({
21109
+ storageMode
21110
+ });
20821
21111
  const { isAuthenticated } = useIsAuthenticated();
20822
21112
  const [selectedItemsOpen, { open, close }] = useDisclosure(false);
20823
21113
  const { gatherSelectedItems } = useDataLibrarySelection();
@@ -20825,27 +21115,34 @@ const DataLibraryLists = ({ requiresLogin = true, actions, size })=>{
20825
21115
  gatherSelectedItems(dataLibrary);
20826
21116
  open();
20827
21117
  };
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
- })
21118
+ // Use useEffect to show notifications only when error changes
21119
+ useDeepCompareEffect(()=>{
21120
+ if (dataLibraryError?.isError && dataLibraryError?.status !== 401) {
21121
+ notifications.show({
21122
+ position: 'top-center',
21123
+ color: 'red',
21124
+ title: 'Data Library Error',
21125
+ message: dataLibraryError?.message,
21126
+ autoClose: 2000
20842
21127
  });
20843
- } else notifications.show({
20844
- position: 'top-center',
20845
- color: 'red',
20846
- title: 'Data Library Error',
20847
- message: dataLibraryError?.message,
20848
- autoClose: 2000
21128
+ }
21129
+ }, [
21130
+ dataLibraryError
21131
+ ]);
21132
+ // Handle 401 error with UI rendering
21133
+ if (dataLibraryError?.isError && dataLibraryError?.status === 401) {
21134
+ let message = 'You are not authorized to access the library.';
21135
+ if (requiresLogin) {
21136
+ if (!isAuthenticated) message = 'Data Library requires login. Please log in to continue.';
21137
+ else message = 'You are not authorized to access the library. Please contact your site administrator.';
21138
+ }
21139
+ return /*#__PURE__*/ jsx("div", {
21140
+ className: "flex flex-col w-full ml-2",
21141
+ children: /*#__PURE__*/ jsx(Center, {
21142
+ children: /*#__PURE__*/ jsx(ErrorCard, {
21143
+ message: message
21144
+ })
21145
+ })
20849
21146
  });
20850
21147
  }
20851
21148
  return /*#__PURE__*/ jsxs("div", {
@@ -20890,6 +21187,7 @@ const DataLibraryLists = ({ requiresLogin = true, actions, size })=>{
20890
21187
  };
20891
21188
 
20892
21189
  const DataLibrary = (config)=>{
21190
+ console.log(config);
20893
21191
  return /*#__PURE__*/ jsx(DataLibrarySelectionProvider, {
20894
21192
  children: /*#__PURE__*/ jsx(DataLibraryLists, {
20895
21193
  ...config
@@ -20898,6 +21196,7 @@ const DataLibrary = (config)=>{
20898
21196
  };
20899
21197
 
20900
21198
  const DataLibraryPage = ({ headerProps, footerProps, config })=>{
21199
+ console.log('DataLibraryPage', config);
20901
21200
  return /*#__PURE__*/ jsx(NavPageLayout, {
20902
21201
  headerProps,
20903
21202
  footerProps,
@@ -20927,7 +21226,7 @@ const DataLibraryPageGetServerSideProps = async ()=>{
20927
21226
  props: {
20928
21227
  ...await getNavPageLayoutPropsFromConfig(),
20929
21228
  config: {
20930
- useAPI: false,
21229
+ storageMode: DataLibraryStoreMode.ApiOnly,
20931
21230
  actions: []
20932
21231
  }
20933
21232
  }