synapse-react-client 4.0.38 → 4.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/useAridhiaQuery.d.ts +6 -2
  3. package/dist/aridhia-queries/useAridhiaQuery.d.ts.map +1 -1
  4. package/dist/aridhia-queries/useAridhiaQuery.js +3 -0
  5. package/dist/aridhia-queries/useAridhiaQuery.js.map +1 -1
  6. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts +2 -1
  7. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  8. package/dist/components/Aridhia/AridhiaAccessStatus.js +60 -37
  9. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  10. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +12 -0
  11. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -0
  12. package/dist/components/Aridhia/AridhiaDarStatusPopover.js +56 -0
  13. package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -0
  14. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.d.ts.map +1 -1
  15. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js +38 -30
  16. package/dist/components/Aridhia/DarWizard/AridhiaDarWizard.js.map +1 -1
  17. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js +15 -14
  18. package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js.map +1 -1
  19. package/dist/components/Aridhia/RdcaDapEligibilityDialog.d.ts +11 -0
  20. package/dist/components/Aridhia/RdcaDapEligibilityDialog.d.ts.map +1 -0
  21. package/dist/components/Aridhia/RdcaDapEligibilityDialog.js +37 -0
  22. package/dist/components/Aridhia/RdcaDapEligibilityDialog.js.map +1 -0
  23. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +2 -2
  24. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
  25. package/dist/components/Aridhia/aridhiaFairPortalUrls.d.ts +10 -0
  26. package/dist/components/Aridhia/aridhiaFairPortalUrls.d.ts.map +1 -0
  27. package/dist/components/Aridhia/aridhiaFairPortalUrls.js +11 -0
  28. package/dist/components/Aridhia/aridhiaFairPortalUrls.js.map +1 -0
  29. package/dist/components/Aridhia/rdcaDapConstants.d.ts +3 -0
  30. package/dist/components/Aridhia/rdcaDapConstants.d.ts.map +1 -0
  31. package/dist/components/Aridhia/rdcaDapConstants.js +6 -0
  32. package/dist/components/Aridhia/rdcaDapConstants.js.map +1 -0
  33. package/dist/components/DataExplorer/DataExplorer.css +1 -1
  34. package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
  35. package/dist/components/DataExplorer/DataExplorer.js +50 -50
  36. package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
  37. package/dist/components/DataExplorer/DataExplorer.module.js +16 -16
  38. package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -1
  39. package/dist/components/DataExplorer/DataExplorer.module.scss +29 -6
  40. package/dist/components/DataGrid/columns/DateTimeColumn.d.ts +16 -7
  41. package/dist/components/DataGrid/columns/DateTimeColumn.d.ts.map +1 -1
  42. package/dist/components/DataGrid/columns/DateTimeColumn.js +79 -57
  43. package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
  44. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  45. package/dist/components/DataGrid/utils/columnFactory.js +11 -8
  46. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  47. package/dist/components/DatePicker/DatePicker.d.ts +10 -0
  48. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
  49. package/dist/components/DatePicker/DatePicker.js +18 -0
  50. package/dist/components/DatePicker/DatePicker.js.map +1 -0
  51. package/dist/components/EntityCitation/EntityCitation.d.ts.map +1 -1
  52. package/dist/components/EntityCitation/EntityCitation.js +8 -5
  53. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  54. package/dist/components/HasAccess/AccessIcon.d.ts +3 -1
  55. package/dist/components/HasAccess/AccessIcon.d.ts.map +1 -1
  56. package/dist/components/HasAccess/AccessIcon.js +11 -1
  57. package/dist/components/HasAccess/AccessIcon.js.map +1 -1
  58. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts +2 -1
  59. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts.map +1 -1
  60. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js +81 -53
  61. package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
  62. package/dist/components/ProjectInfo/ProjectInfo.d.ts.map +1 -1
  63. package/dist/components/ProjectInfo/ProjectInfo.js +3 -2
  64. package/dist/components/ProjectInfo/ProjectInfo.js.map +1 -1
  65. package/dist/components/QueryBuilder/FilterConditionRow.css +1 -0
  66. package/dist/components/QueryBuilder/FilterConditionRow.d.ts +6 -0
  67. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -0
  68. package/dist/components/QueryBuilder/FilterConditionRow.js +257 -0
  69. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -0
  70. package/dist/components/QueryBuilder/FilterConditionRow.module.js +17 -0
  71. package/dist/components/QueryBuilder/FilterConditionRow.module.js.map +1 -0
  72. package/dist/components/QueryBuilder/FilterConditionRow.module.scss +106 -0
  73. package/dist/components/QueryBuilder/FilterGroupNode.css +1 -0
  74. package/dist/components/QueryBuilder/FilterGroupNode.d.ts +7 -0
  75. package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -0
  76. package/dist/components/QueryBuilder/FilterGroupNode.js +100 -0
  77. package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -0
  78. package/dist/components/QueryBuilder/FilterGroupNode.module.js +15 -0
  79. package/dist/components/QueryBuilder/FilterGroupNode.module.js.map +1 -0
  80. package/dist/components/QueryBuilder/FilterGroupNode.module.scss +83 -0
  81. package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -0
  82. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts +21 -0
  83. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -0
  84. package/dist/components/QueryBuilder/QueryBuilderControls.js +138 -0
  85. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -0
  86. package/dist/components/QueryBuilder/QueryBuilderControls.module.js +17 -0
  87. package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -0
  88. package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +79 -0
  89. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +39 -0
  90. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -0
  91. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js +19 -0
  92. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -0
  93. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts +14 -0
  94. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts.map +1 -0
  95. package/dist/components/QueryBuilder/qbTreeToReadable.js +89 -0
  96. package/dist/components/QueryBuilder/qbTreeToReadable.js.map +1 -0
  97. package/dist/components/QueryBuilder/queryBuilderId.d.ts +2 -0
  98. package/dist/components/QueryBuilder/queryBuilderId.d.ts.map +1 -0
  99. package/dist/components/QueryBuilder/queryBuilderId.js +9 -0
  100. package/dist/components/QueryBuilder/queryBuilderId.js.map +1 -0
  101. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +24 -0
  102. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -0
  103. package/dist/components/QueryBuilder/queryBuilderMetadata.js +91 -0
  104. package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -0
  105. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts +58 -0
  106. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts.map +1 -0
  107. package/dist/components/QueryBuilder/queryBuilderOperations.js +200 -0
  108. package/dist/components/QueryBuilder/queryBuilderOperations.js.map +1 -0
  109. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +3 -2
  110. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
  111. package/dist/components/QueryBuilder/queryBuilderTranslation.js +82 -84
  112. package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
  113. package/dist/components/QueryBuilder/useQBCombinedSql.d.ts +11 -0
  114. package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -0
  115. package/dist/components/QueryBuilder/useQBCombinedSql.js +29 -0
  116. package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -0
  117. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.d.ts +18 -0
  118. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.d.ts.map +1 -0
  119. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.js +27 -0
  120. package/dist/components/QueryBuilder/useQBFacetSourceMetadata.js.map +1 -0
  121. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +14 -1
  122. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  123. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +185 -120
  124. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  125. package/dist/components/RssFeedCards/RssFeedCards.d.ts +1 -0
  126. package/dist/components/RssFeedCards/RssFeedCards.d.ts.map +1 -1
  127. package/dist/components/RssFeedCards/RssFeedCards.js +11 -11
  128. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  129. package/dist/components/SynapseChat/SynapseChat.d.ts +7 -1
  130. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  131. package/dist/components/SynapseChat/SynapseChat.js +76 -71
  132. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  133. package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts +3 -1
  134. package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts.map +1 -1
  135. package/dist/components/SynapseChat/SynapsePortalChatDialog.js +24 -13
  136. package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -1
  137. package/dist/components/SynapseChat/portalChatSessionStorage.d.ts +23 -0
  138. package/dist/components/SynapseChat/portalChatSessionStorage.d.ts.map +1 -0
  139. package/dist/components/SynapseChat/portalChatSessionStorage.js +29 -0
  140. package/dist/components/SynapseChat/portalChatSessionStorage.js.map +1 -0
  141. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts +6 -0
  142. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
  143. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +92 -79
  144. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
  145. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts +3 -4
  146. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
  147. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +2 -2
  148. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
  149. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js +1 -1
  150. package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
  151. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
  152. package/dist/components/entity/page/action_menu/EntityActionMenu.js +9 -2
  153. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  154. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +1 -1
  155. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  156. package/dist/components/menu/ComplexMenu.js +1 -1
  157. package/dist/components/menu/ComplexMenu.js.map +1 -1
  158. package/dist/components/menu/DropdownMenu.d.ts.map +1 -1
  159. package/dist/components/menu/DropdownMenu.js +4 -0
  160. package/dist/components/menu/DropdownMenu.js.map +1 -1
  161. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.d.ts +10 -0
  162. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.d.ts.map +1 -0
  163. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.js +20 -0
  164. package/dist/features/entity/metadata-task/hooks/useMarkCurationTaskInProgress.js.map +1 -0
  165. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
  166. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +29 -20
  167. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
  168. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts +16 -0
  169. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts.map +1 -0
  170. package/dist/mocks/accessRequirement/mockFormTemplates.js +70 -0
  171. package/dist/mocks/accessRequirement/mockFormTemplates.js.map +1 -0
  172. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts +7 -0
  173. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.d.ts.map +1 -0
  174. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js +47 -0
  175. package/dist/mocks/accessRequirement/mockJsonSchemaAccessRequirements.js.map +1 -0
  176. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts +24 -0
  177. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts.map +1 -0
  178. package/dist/mocks/accessRequirement/mockJsonSchemas.js +62 -0
  179. package/dist/mocks/accessRequirement/mockJsonSchemas.js.map +1 -0
  180. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +18 -1
  181. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
  182. package/dist/mocks/msw/handlers/aridhiaHandlers.js +39 -33
  183. package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
  184. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts +5 -0
  185. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts.map +1 -0
  186. package/dist/mocks/msw/handlers/formTemplateHandlers.js +65 -0
  187. package/dist/mocks/msw/handlers/formTemplateHandlers.js.map +1 -0
  188. package/dist/mocks/msw/handlers.d.ts.map +1 -1
  189. package/dist/mocks/msw/handlers.js +49 -47
  190. package/dist/mocks/msw/handlers.js.map +1 -1
  191. package/dist/style/abstracts/_cssVariables.scss +7 -0
  192. package/dist/style/components/_query-wrapper-plot-nav.scss +9 -0
  193. package/dist/style/main.css +1 -1
  194. package/dist/synapse-queries/KeyFactory.d.ts +6 -1
  195. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  196. package/dist/synapse-queries/KeyFactory.js +17 -2
  197. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  198. package/dist/synapse-queries/chat/useChat.d.ts.map +1 -1
  199. package/dist/synapse-queries/chat/useChat.js +2 -4
  200. package/dist/synapse-queries/chat/useChat.js.map +1 -1
  201. package/dist/synapse-queries/dataaccess/index.d.ts +2 -0
  202. package/dist/synapse-queries/dataaccess/index.d.ts.map +1 -1
  203. package/dist/synapse-queries/dataaccess/index.js +5 -3
  204. package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts +41 -0
  205. package/dist/synapse-queries/dataaccess/useFormTemplate.d.ts.map +1 -0
  206. package/dist/synapse-queries/dataaccess/useFormTemplate.js +63 -0
  207. package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -0
  208. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts +21 -0
  209. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts.map +1 -0
  210. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js +34 -0
  211. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js.map +1 -0
  212. package/dist/synapse-queries/index.js +190 -180
  213. package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
  214. package/dist/tsconfig.build.tsbuildinfo +1 -1
  215. package/dist/utils/featureflag/FeatureFlags.d.ts +0 -1
  216. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  217. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  218. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  219. package/dist/utils/jsonschema/getType.d.ts.map +1 -1
  220. package/dist/utils/jsonschema/getType.js +4 -1
  221. package/dist/utils/jsonschema/getType.js.map +1 -1
  222. package/package.json +7 -7
@@ -1,165 +1,230 @@
1
1
  import "../../utils/SynapseConstants.js";
2
- import { isTable as e } from "../../utils/functions/EntityTypeUtils.js";
3
- import { getAdditionalFilters as t, parseEntityIdAndVersionFromSqlStatement as n } from "../../utils/functions/SqlFunctions.js";
2
+ import { isFilterGroup as e } from "../../utils/types/IsType.js";
3
+ import { isTable as t } from "../../utils/functions/EntityTypeUtils.js";
4
+ import { getAdditionalFilters as n, parseEntityIdAndVersionFromSqlStatement as r } from "../../utils/functions/SqlFunctions.js";
4
5
  import "../../utils/functions/index.js";
5
- import { SynapseErrorBoundary as r } from "../error/ErrorBanner.js";
6
+ import { SynapseErrorBoundary as i } from "../error/ErrorBanner.js";
6
7
  import "../../utils/index.js";
7
- import { useGetEntity as i } from "../../synapse-queries/entity/useEntity.js";
8
+ import { useGetEntity as a } from "../../synapse-queries/entity/useEntity.js";
8
9
  import "../../synapse-queries/index.js";
9
- import a from "../download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js";
10
- import { useQueryContext as o } from "../QueryContext/QueryContext.js";
10
+ import { ConfirmationDialog as o } from "../ConfirmationDialog/ConfirmationDialog.js";
11
+ import "../ConfirmationDialog/index.js";
12
+ import s from "../download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js";
13
+ import { useQueryContext as c } from "../QueryContext/QueryContext.js";
11
14
  import "../QueryContext/index.js";
12
- import { NoContentPlaceholderType as s } from "../SynapseTable/NoContentPlaceholderType.js";
13
- import { QueryVisualizationContextConsumer as c } from "../QueryVisualizationWrapper/QueryVisualizationContext.js";
14
- import { QueryVisualizationWrapper as l } from "../QueryVisualizationWrapper/QueryVisualizationWrapper.js";
15
+ import { NoContentPlaceholderType as l } from "../SynapseTable/NoContentPlaceholderType.js";
16
+ import { QueryVisualizationContextConsumer as u } from "../QueryVisualizationWrapper/QueryVisualizationContext.js";
17
+ import { QueryVisualizationWrapper as d } from "../QueryVisualizationWrapper/QueryVisualizationWrapper.js";
15
18
  import "../QueryVisualizationWrapper/index.js";
16
- import { isRowSelectionVisibleAtom as u } from "../QueryWrapper/TableRowSelectionState.js";
17
- import { QueryWrapper as d } from "../QueryWrapper/QueryWrapper.js";
19
+ import { isRowSelectionVisibleAtom as f } from "../QueryWrapper/TableRowSelectionState.js";
20
+ import { QueryWrapper as p } from "../QueryWrapper/QueryWrapper.js";
18
21
  import "../QueryWrapper/index.js";
19
22
  import "../error/index.js";
20
- import f from "../TotalQueryResults.js";
21
- import { SqlEditor as p } from "../SynapseTable/SqlEditor.js";
22
- import { QueryWrapperErrorBoundary as m } from "../QueryWrapperErrorBoundary.js";
23
- import { ModalDownload as h } from "../ModalDownload/ModalDownload.js";
24
- import g from "../QueryWrapper/QueryWrapperLoadingScreen.js";
25
- import { RowSetView as _ } from "./RowSetView.js";
26
- import v from "../widgets/query-filter/FacetFilterControls.js";
27
- import { useGetAddToDownloadListRequestForCurrentQuery as y } from "../QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js";
28
- import { FullTextSearch as b } from "../FullTextSearch/FullTextSearch.js";
29
- import x from "../SynapseTable/SearchV2.js";
30
- import S from "../SynapseTable/TopLevelControls/TopLevelControls.js";
31
- import { CustomControls as C } from "../SynapseTable/CustomControls/CustomControls.js";
32
- import w from "../widgets/facet-nav/PlotsContainer.js";
33
- import { Suspense as T, createElement as E, useMemo as D, useState as O } from "react";
34
- import { Box as k } from "@mui/material";
35
- import { Fragment as A, jsx as j, jsxs as M } from "react/jsx-runtime";
36
- import { useQuery as N } from "@tanstack/react-query";
37
- import { useAtomValue as P } from "jotai";
23
+ import m from "../TotalQueryResults.js";
24
+ import { SqlEditor as h } from "../SynapseTable/SqlEditor.js";
25
+ import { QueryWrapperErrorBoundary as g } from "../QueryWrapperErrorBoundary.js";
26
+ import { ModalDownload as _ } from "../ModalDownload/ModalDownload.js";
27
+ import v from "../QueryWrapper/QueryWrapperLoadingScreen.js";
28
+ import { RowSetView as y } from "./RowSetView.js";
29
+ import b from "../widgets/query-filter/FacetFilterControls.js";
30
+ import { useGetAddToDownloadListRequestForCurrentQuery as x } from "../QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js";
31
+ import { FullTextSearch as S } from "../FullTextSearch/FullTextSearch.js";
32
+ import C from "../SynapseTable/SearchV2.js";
33
+ import w from "../SynapseTable/TopLevelControls/TopLevelControls.js";
34
+ import { CustomControls as T } from "../SynapseTable/CustomControls/CustomControls.js";
35
+ import E from "../widgets/facet-nav/PlotsContainer.js";
36
+ import { defaultQBGroup as D, hasCompleteCondition as O } from "../QueryBuilder/queryBuilderOperations.js";
37
+ import { qbNodeToApiFilter as ee, selectedFacetsToQBGroup as te } from "../QueryBuilder/queryBuilderTranslation.js";
38
+ import { QueryBuilderControls as ne } from "../QueryBuilder/QueryBuilderControls.js";
39
+ import { Suspense as k, createElement as A, useMemo as j, useState as M } from "react";
40
+ import { Box as re } from "@mui/material";
41
+ import { jsx as N, jsxs as ie } from "react/jsx-runtime";
42
+ import { useQuery as ae } from "@tanstack/react-query";
43
+ import { useAtomValue as oe } from "jotai";
38
44
  //#region src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx
39
- var F = "isShowingFacetFilters", I = "isHidingFacetFilters", L = "hasSelectedRows";
40
- function R(e) {
41
- let { tableConfiguration: t, name: n, cardConfiguration: i, facetsToPlot: s, availableFacets: l, initialExpandedFacetControls: d, hideDownload: g, hideAddToDownloadListMenuItem: E, hideProgrammaticOptionsMenuItem: D, hideQueryCount: R, hideSqlEditorControl: z, hideVisualizationsControl: B, searchConfiguration: V, cavaticaConnectAccountURL: H, customControls: U, remount: W = () => {}, isFullTextSearchEnabled: ee, customPlots: G, initialLimit: K, initialPlotTypeByFacetColumnName: q, hideTopLevelControls: J } = e, Y = o(), [X, Z] = O(!1), { hasFacetedSelectColumn: Q, queryMetadataQueryOptions: te } = Y, { isLoading: ne } = N(te), re = P(u), $ = Y.currentQueryRequest, ie = $?.query.selectedFacets !== void 0 && $.query.selectedFacets.length > 0 || $?.query.additionalFilters !== void 0 && $?.query.additionalFilters.length > 0, ae = y();
42
- return /* @__PURE__ */ j(c, { children: (e) => {
45
+ var P = "isShowingFacetFilters", F = "isHidingFacetFilters", I = "hasSelectedRows";
46
+ function L(t) {
47
+ let { tableConfiguration: n, name: r, cardConfiguration: a, facetsToPlot: l, availableFacets: d, initialExpandedFacetControls: p, hideDownload: v, hideAddToDownloadListMenuItem: A, hideProgrammaticOptionsMenuItem: j, hideQueryCount: L, hideSqlEditorControl: R, hideVisualizationsControl: se, searchConfiguration: z, cavaticaConnectAccountURL: ce, customControls: B, remount: V = () => {}, isFullTextSearchEnabled: le, customPlots: ue, initialLimit: H, initialPlotTypeByFacetColumnName: de, hideTopLevelControls: U, showQueryBuilderControl: fe = !1, defaultShowQueryBuilder: pe = !1 } = t, W = c(), [me, he] = M(!1), [G, K] = M(pe), [q, J] = M(() => D()), [ge, Y] = M(!1), { hasFacetedSelectColumn: X, queryMetadataQueryOptions: _e } = W, { executeQueryRequest: Z } = W, { isLoading: ve, data: ye } = ae(_e), be = () => {
48
+ let t = W.currentQueryRequest.query.selectedFacets;
49
+ if (t && t.length > 0) {
50
+ let n = te(t, ye?.columnModels), r = ee(n);
51
+ J(n), Z((t) => ({
52
+ ...t,
53
+ query: {
54
+ ...t.query,
55
+ selectedFacets: void 0,
56
+ additionalFilters: r ? [...(t.query.additionalFilters ?? []).filter((t) => !e(t)), r] : t.query.additionalFilters
57
+ }
58
+ }));
59
+ }
60
+ K(!0);
61
+ }, Q = () => {
62
+ J(D()), Z((t) => ({
63
+ ...t,
64
+ query: {
65
+ ...t.query,
66
+ additionalFilters: t.query.additionalFilters?.filter((t) => !e(t))
67
+ }
68
+ })), K(!1);
69
+ }, xe = () => {
70
+ if (!G) {
71
+ be();
72
+ return;
73
+ }
74
+ let t = W.currentQueryRequest.query.additionalFilters?.some(e) ?? !1;
75
+ if (O(q) || t) {
76
+ Y(!0);
77
+ return;
78
+ }
79
+ Q();
80
+ }, Se = oe(f), $ = W.currentQueryRequest, Ce = $?.query.selectedFacets !== void 0 && $.query.selectedFacets.length > 0 || $?.query.additionalFilters !== void 0 && $?.query.additionalFilters.length > 0, we = x();
81
+ return /* @__PURE__ */ N(u, { children: (e) => {
43
82
  if (e === void 0) throw Error("No queryVisualizationContext found when using QueryVisualizationContextConsumer");
44
- return /* @__PURE__ */ j(k, {
45
- className: `QueryWrapperPlotNav ${e.showFacetFilter ? F : I} ${re ? L : ""} ${J ? "isHidingTopLevelControls" : ""}`,
46
- sx: { "*": { cursor: ne ? "wait" : void 0 } },
47
- children: /* @__PURE__ */ M(m, { children: [
48
- ee ? /* @__PURE__ */ j(b, { ftsConfig: V?.ftsConfig }) : /* @__PURE__ */ j(x, {
49
- ...V,
50
- queryContext: Y,
83
+ return /* @__PURE__ */ N(re, {
84
+ className: `QueryWrapperPlotNav ${e.showFacetFilter && !G ? P : F} ${Se ? I : ""} ${U ? "isHidingTopLevelControls" : ""} ${G ? "isShowingQueryBuilder" : ""}`,
85
+ sx: { "*": { cursor: ve ? "wait" : void 0 } },
86
+ children: /* @__PURE__ */ ie(g, { children: [
87
+ le ? /* @__PURE__ */ N(S, { ftsConfig: z?.ftsConfig }) : /* @__PURE__ */ N(C, {
88
+ ...z,
89
+ queryContext: W,
51
90
  queryVisualizationContext: e
52
91
  }),
53
- /* @__PURE__ */ j(p, {}),
54
- e.showDownloadConfirmation && /* @__PURE__ */ j(a, {
55
- addToDownloadListRequest: ae,
92
+ /* @__PURE__ */ N(h, {}),
93
+ e.showDownloadConfirmation && /* @__PURE__ */ N(s, {
94
+ addToDownloadListRequest: we,
56
95
  onClose: () => e.setShowDownloadConfirmation(!1)
57
96
  }),
58
- !J && /* @__PURE__ */ j(r, { children: /* @__PURE__ */ j(S, {
59
- showColumnSelection: t !== void 0,
60
- name: n,
61
- hideDownload: g,
62
- hideAddToDownloadListMenuItem: E,
63
- hideProgrammaticOptionsMenuItem: D,
64
- hideQueryCount: R,
65
- hideFacetFilterControl: !Q,
66
- hideVisualizationsControl: !Q || B,
67
- hideSqlEditorControl: z,
68
- cavaticaConnectAccountURL: H,
69
- remount: W,
70
- customControls: U
71
- }) }),
72
- Q && /* @__PURE__ */ j(A, { children: /* @__PURE__ */ j(v, {
73
- availableFacets: l,
74
- initialExpandedFacetControls: d
97
+ !U && /* @__PURE__ */ N(i, { children: /* @__PURE__ */ N(w, {
98
+ showColumnSelection: n !== void 0,
99
+ name: r,
100
+ hideDownload: v,
101
+ hideAddToDownloadListMenuItem: A,
102
+ hideProgrammaticOptionsMenuItem: j,
103
+ hideQueryCount: L,
104
+ hideFacetFilterControl: !X || G,
105
+ hideVisualizationsControl: !X || se,
106
+ hideSqlEditorControl: R,
107
+ cavaticaConnectAccountURL: ce,
108
+ remount: V,
109
+ customControls: B,
110
+ showQueryBuilderControl: fe,
111
+ showQueryBuilder: G,
112
+ onToggleQueryBuilder: xe
75
113
  }) }),
76
- /* @__PURE__ */ j(T, {
114
+ G ? /* @__PURE__ */ N(k, {
77
115
  fallback: null,
78
- children: /* @__PURE__ */ j(f, {
116
+ children: /* @__PURE__ */ N("div", {
117
+ className: "QueryBuilderControls",
118
+ children: /* @__PURE__ */ N(ne, {
119
+ tree: q,
120
+ onTreeChange: J
121
+ })
122
+ })
123
+ }) : X && /* @__PURE__ */ N(b, {
124
+ availableFacets: d,
125
+ initialExpandedFacetControls: p
126
+ }),
127
+ /* @__PURE__ */ N(k, {
128
+ fallback: null,
129
+ children: /* @__PURE__ */ N(m, {
79
130
  frontText: "",
80
- endText: ie ? "filtered by" : "",
131
+ endText: Ce ? "filtered by" : "",
81
132
  hideIfUnfiltered: !0
82
133
  })
83
134
  }),
84
- /* @__PURE__ */ j(C, {
85
- customControls: U,
86
- remount: W
135
+ /* @__PURE__ */ N(T, {
136
+ customControls: B,
137
+ remount: V
138
+ }),
139
+ /* @__PURE__ */ N(E, {
140
+ facetsToPlot: l,
141
+ customPlots: ue,
142
+ initialPlotTypeByFacetColumnName: de
87
143
  }),
88
- /* @__PURE__ */ j(w, {
89
- facetsToPlot: s,
90
- customPlots: G,
91
- initialPlotTypeByFacetColumnName: q
144
+ /* @__PURE__ */ N(y, {
145
+ tableConfiguration: n,
146
+ hideDownload: v,
147
+ cardConfiguration: a,
148
+ initialLimit: H
92
149
  }),
93
- /* @__PURE__ */ j(_, {
94
- tableConfiguration: t,
95
- hideDownload: g,
96
- cardConfiguration: i,
97
- initialLimit: K
150
+ me && /* @__PURE__ */ N(_, {
151
+ getLastQueryRequest: W?.getCurrentQueryRequest,
152
+ onClose: () => he(!1)
98
153
  }),
99
- X && /* @__PURE__ */ j(h, {
100
- getLastQueryRequest: Y?.getCurrentQueryRequest,
101
- onClose: () => Z(!1)
154
+ /* @__PURE__ */ N(o, {
155
+ open: ge,
156
+ title: "Hide Query Builder?",
157
+ content: "Hiding the Query Builder will clear the conditions you've built. This can't be undone.",
158
+ confirmButtonProps: {
159
+ children: "Hide Query Builder",
160
+ color: "error",
161
+ variant: "contained"
162
+ },
163
+ onConfirm: () => {
164
+ Y(!1), Q();
165
+ },
166
+ onCancel: () => Y(!1)
102
167
  })
103
168
  ] })
104
169
  });
105
170
  } });
106
171
  }
107
- function z(r) {
108
- let { sql: a, tableConfiguration: o, isInfinite: c = !o, limit: u = 25, showLastUpdatedOn: f, unitDescription: p, additionalFiltersSessionStorageKey: m, helpConfiguration: h, customPlots: _, enabledExternalAnalysisPlatforms: v } = r, { entityId: y, versionNumber: b } = n(r.query?.sql ?? a ?? ""), x = D(() => r.query ? r.query : r.initQueryJson ? JSON.parse(r.initQueryJson) : {
109
- sql: a,
110
- additionalFilters: t(r.searchParams, r.sqlOperator, m),
111
- limit: u,
172
+ function R(e) {
173
+ let { sql: i, tableConfiguration: o, isInfinite: s = !o, limit: c = 25, showLastUpdatedOn: u, unitDescription: f, additionalFiltersSessionStorageKey: m, helpConfiguration: h, customPlots: g, enabledExternalAnalysisPlatforms: _ } = e, { entityId: y, versionNumber: b } = r(e.query?.sql ?? i ?? ""), x = j(() => e.query ? e.query : e.initQueryJson ? JSON.parse(e.initQueryJson) : {
174
+ sql: i,
175
+ additionalFilters: n(e.searchParams, e.sqlOperator, m),
176
+ limit: c,
112
177
  offset: 0
113
178
  }, [
114
- r.query,
115
- r.initQueryJson,
116
- r.searchParams,
117
- r.sqlOperator,
179
+ e.query,
180
+ e.initQueryJson,
181
+ e.searchParams,
182
+ e.sqlOperator,
118
183
  m,
119
- a,
120
- u
121
- ]), [S, C] = O(1), w = () => {
184
+ i,
185
+ c
186
+ ]), [S, C] = M(1), w = () => {
122
187
  C(S + 1);
123
- }, { data: k } = i(y, b), A = {
188
+ }, { data: T } = a(y, b), E = {
124
189
  entityId: y ?? "",
125
190
  concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest",
126
191
  partMask: 255,
127
192
  query: x
128
- }, M = (k && e(k) && k.isSearchEnabled) ?? !1, N = `${JSON.stringify(A)}-${S}`;
129
- return /* @__PURE__ */ E(d, {
130
- ...r,
131
- initQueryRequest: A,
132
- key: N,
133
- isInfinite: c
134
- }, /* @__PURE__ */ j(T, {
135
- fallback: /* @__PURE__ */ j(g, {}),
136
- children: /* @__PURE__ */ j(l, {
137
- unitDescription: p,
138
- rgbIndex: r.rgbIndex,
139
- columnAliases: r.columnAliases,
140
- renderFacetValue: r.renderFacetValue,
141
- dataUseModifiersColumnName: r.cardConfiguration?.genericCardSchema?.dataUseModifiersColumnName,
193
+ }, D = (T && t(T) && T.isSearchEnabled) ?? !1, O = `${JSON.stringify(E)}-${S}`;
194
+ return /* @__PURE__ */ A(p, {
195
+ ...e,
196
+ initQueryRequest: E,
197
+ key: O,
198
+ isInfinite: s
199
+ }, /* @__PURE__ */ N(k, {
200
+ fallback: /* @__PURE__ */ N(v, {}),
201
+ children: /* @__PURE__ */ N(d, {
202
+ unitDescription: f,
203
+ rgbIndex: e.rgbIndex,
204
+ columnAliases: e.columnAliases,
205
+ renderFacetValue: e.renderFacetValue,
206
+ dataUseModifiersColumnName: e.cardConfiguration?.genericCardSchema?.dataUseModifiersColumnName,
142
207
  helpConfiguration: h,
143
- visibleColumnCount: r.visibleColumnCount,
144
- hiddenColumns: r.hiddenColumns,
145
- defaultShowPlots: r.defaultShowPlots,
146
- hideCopyToClipboard: r.hideCopyToClipboard,
147
- defaultShowSearchBar: (r.defaultShowSearchBox || M) && !r.hideSearchBarControl,
148
- lockTextMatchesQueryFilterPill: r.lockTextMatchesQueryFilterPill,
149
- hideSearchBarControl: r.hideSearchBarControl,
150
- showLastUpdatedOn: f,
151
- noContentPlaceholderType: s.INTERACTIVE,
152
- hasCustomPlots: Array.isArray(_) && _.length > 0,
153
- enabledExternalAnalysisPlatforms: v,
154
- children: /* @__PURE__ */ j(R, {
155
- ...r,
156
- isFullTextSearchEnabled: M,
208
+ visibleColumnCount: e.visibleColumnCount,
209
+ hiddenColumns: e.hiddenColumns,
210
+ defaultShowPlots: e.defaultShowPlots,
211
+ hideCopyToClipboard: e.hideCopyToClipboard,
212
+ defaultShowSearchBar: (e.defaultShowSearchBox || D) && !e.hideSearchBarControl,
213
+ lockTextMatchesQueryFilterPill: e.lockTextMatchesQueryFilterPill,
214
+ hideSearchBarControl: e.hideSearchBarControl,
215
+ showLastUpdatedOn: u,
216
+ noContentPlaceholderType: l.INTERACTIVE,
217
+ hasCustomPlots: Array.isArray(g) && g.length > 0,
218
+ enabledExternalAnalysisPlatforms: _,
219
+ children: /* @__PURE__ */ N(L, {
220
+ ...e,
221
+ isFullTextSearchEnabled: D,
157
222
  remount: w
158
223
  })
159
224
  })
160
225
  }));
161
226
  }
162
227
  //#endregion
163
- export { L as HAS_SELECTED_ROWS_CSS, I as QUERY_FILTERS_COLLAPSED_CSS, F as QUERY_FILTERS_EXPANDED_CSS, R as QueryWrapperPlotNavContents, z as default };
228
+ export { I as HAS_SELECTED_ROWS_CSS, F as QUERY_FILTERS_COLLAPSED_CSS, P as QUERY_FILTERS_EXPANDED_CSS, L as QueryWrapperPlotNavContents, R as default };
164
229
 
165
230
  //# sourceMappingURL=QueryWrapperPlotNav.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { Suspense, useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n initialLimit?: number\n hideTopLevelControls?: boolean\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'hiddenColumns'\n | 'columnAliases'\n | 'renderFacetValue'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n | 'lockTextMatchesQueryFilterPill'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\nexport type QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideAddToDownloadListMenuItem'\n | 'hideProgrammaticOptionsMenuItem'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotTypeByFacetColumnName'\n | 'hideTopLevelControls'\n> & {\n isFullTextSearchEnabled: boolean\n remount?: () => void\n}\n\nexport function QueryWrapperPlotNavContents(\n props: QueryWrapperPlotNavContentsProps,\n) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideAddToDownloadListMenuItem,\n hideProgrammaticOptionsMenuItem,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount = () => {},\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotTypeByFacetColumnName,\n hideTopLevelControls,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { isLoading: isLoadingQueryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''} ${\n hideTopLevelControls ? 'isHidingTopLevelControls' : ''\n }`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n {!hideTopLevelControls && (\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideAddToDownloadListMenuItem={\n hideAddToDownloadListMenuItem\n }\n hideProgrammaticOptionsMenuItem={\n hideProgrammaticOptionsMenuItem\n }\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n />\n </SynapseErrorBoundary>\n )}\n {isFaceted && (\n <>\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n </>\n )}\n {/* Isolated Suspense so that metadata loading does not hide the table */}\n <Suspense fallback={null}>\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n </Suspense>\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotTypeByFacetColumnName={\n initialPlotTypeByFacetColumnName\n }\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n renderFacetValue={props.renderFacetValue}\n dataUseModifiersColumnName={\n props.cardConfiguration?.genericCardSchema\n ?.dataUseModifiersColumnName\n }\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n hiddenColumns={props.hiddenColumns}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n lockTextMatchesQueryFilterPill={props.lockTextMatchesQueryFilterPill}\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </QueryWrapper>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"QueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { Suspense, useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryBuilderControls } from '../QueryBuilder/QueryBuilderControls'\nimport {\n defaultQBGroup,\n hasCompleteCondition,\n} from '../QueryBuilder/queryBuilderOperations'\nimport {\n qbNodeToApiFilter,\n selectedFacetsToQBGroup,\n} from '../QueryBuilder/queryBuilderTranslation'\nimport { QBGroup } from '../QueryBuilder/QueryBuilderTypes'\nimport { ConfirmationDialog } from '../ConfirmationDialog'\nimport { isFilterGroup } from '../../utils/types/IsType'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n initialLimit?: number\n hideTopLevelControls?: boolean\n /**\n * When true, shows a `Show / Hide Query Builder` toggle in `TopLevelControls`.\n * The QB and the facet nav are mutually exclusive — turning the QB on hides\n * the facet nav entirely.\n */\n showQueryBuilderControl?: boolean\n /**\n * When true, the QB is shown by default. When `showQueryBuilderControl` is\n * also true, the user can toggle it back off from `TopLevelControls`. When\n * `showQueryBuilderControl` is false the QB is permanently displayed with\n * no toggle button.\n */\n defaultShowQueryBuilder?: boolean\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'hiddenColumns'\n | 'columnAliases'\n | 'renderFacetValue'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n | 'lockTextMatchesQueryFilterPill'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\nexport type QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideAddToDownloadListMenuItem'\n | 'hideProgrammaticOptionsMenuItem'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotTypeByFacetColumnName'\n | 'hideTopLevelControls'\n | 'showQueryBuilderControl'\n | 'defaultShowQueryBuilder'\n> & {\n isFullTextSearchEnabled: boolean\n remount?: () => void\n}\n\nexport function QueryWrapperPlotNavContents(\n props: QueryWrapperPlotNavContentsProps,\n) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideAddToDownloadListMenuItem,\n hideProgrammaticOptionsMenuItem,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount = () => {},\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotTypeByFacetColumnName,\n hideTopLevelControls,\n showQueryBuilderControl = false,\n defaultShowQueryBuilder = false,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const [showQueryBuilder, setShowQueryBuilder] = useState(\n defaultShowQueryBuilder,\n )\n const [qbTree, setQbTree] = useState<QBGroup>(() => defaultQBGroup())\n const [isConfirmingHideQb, setIsConfirmingHideQb] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { executeQueryRequest } = queryContext\n const { isLoading: isLoadingQueryMetadata, data: queryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n // Facets ↔ QB transitions: switching FF → QB silently translates\n // selectedFacets into the QB tree and swaps them for a FilterGroup in\n // additionalFilters so results stay stable. Switching QB → FF prompts if\n // the QB has meaningful state (a completed condition or an applied filter),\n // since we can't losslessly reverse the translation.\n const enterQueryBuilder = () => {\n const selectedFacets = queryContext.currentQueryRequest.query.selectedFacets\n if (selectedFacets && selectedFacets.length > 0) {\n const translated = selectedFacetsToQBGroup(\n selectedFacets,\n queryMetadata?.columnModels,\n )\n const asFilter = qbNodeToApiFilter(translated)\n setQbTree(translated)\n executeQueryRequest(prev => ({\n ...prev,\n query: {\n ...prev.query,\n selectedFacets: undefined,\n additionalFilters: asFilter\n ? [\n ...(prev.query.additionalFilters ?? []).filter(\n f => !isFilterGroup(f),\n ),\n asFilter,\n ]\n : prev.query.additionalFilters,\n },\n }))\n }\n setShowQueryBuilder(true)\n }\n\n const exitQueryBuilder = () => {\n setQbTree(defaultQBGroup())\n executeQueryRequest(prev => ({\n ...prev,\n query: {\n ...prev.query,\n additionalFilters: prev.query.additionalFilters?.filter(\n f => !isFilterGroup(f),\n ),\n },\n }))\n setShowQueryBuilder(false)\n }\n\n const handleToggleQueryBuilder = () => {\n if (!showQueryBuilder) {\n enterQueryBuilder()\n return\n }\n const hasFilterGroupApplied =\n queryContext.currentQueryRequest.query.additionalFilters?.some(\n isFilterGroup,\n ) ?? false\n if (hasCompleteCondition(qbTree) || hasFilterGroupApplied) {\n setIsConfirmingHideQb(true)\n return\n }\n exitQueryBuilder()\n }\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter && !showQueryBuilder\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''} ${\n hideTopLevelControls ? 'isHidingTopLevelControls' : ''\n } ${showQueryBuilder ? 'isShowingQueryBuilder' : ''}`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n {!hideTopLevelControls && (\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideAddToDownloadListMenuItem={\n hideAddToDownloadListMenuItem\n }\n hideProgrammaticOptionsMenuItem={\n hideProgrammaticOptionsMenuItem\n }\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted || showQueryBuilder}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n showQueryBuilderControl={showQueryBuilderControl}\n showQueryBuilder={showQueryBuilder}\n onToggleQueryBuilder={handleToggleQueryBuilder}\n />\n </SynapseErrorBoundary>\n )}\n {showQueryBuilder ? (\n <Suspense fallback={null}>\n <div className=\"QueryBuilderControls\">\n <QueryBuilderControls\n tree={qbTree}\n onTreeChange={setQbTree}\n />\n </div>\n </Suspense>\n ) : (\n isFaceted && (\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n )\n )}\n {/* Isolated Suspense so that metadata loading does not hide the table */}\n <Suspense fallback={null}>\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n </Suspense>\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotTypeByFacetColumnName={\n initialPlotTypeByFacetColumnName\n }\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n <ConfirmationDialog\n open={isConfirmingHideQb}\n title=\"Hide Query Builder?\"\n content=\"Hiding the Query Builder will clear the conditions you've built. This can't be undone.\"\n confirmButtonProps={{\n children: 'Hide Query Builder',\n color: 'error',\n variant: 'contained',\n }}\n onConfirm={() => {\n setIsConfirmingHideQb(false)\n exitQueryBuilder()\n }}\n onCancel={() => setIsConfirmingHideQb(false)}\n />\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n renderFacetValue={props.renderFacetValue}\n dataUseModifiersColumnName={\n props.cardConfiguration?.genericCardSchema\n ?.dataUseModifiersColumnName\n }\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n hiddenColumns={props.hiddenColumns}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n lockTextMatchesQueryFilterPill={props.lockTextMatchesQueryFilterPill}\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </QueryWrapper>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,IAAa,IAAqC,yBACrC,IAAsC,wBAEtC,IAAgC;AA8G7C,SAAgB,EACd,GACA;CACA,IAAM,EACJ,uBACA,SACA,sBACA,iBACA,oBACA,iCACA,iBACA,kCACA,oCACA,mBACA,yBACA,+BACA,wBACA,+BACA,mBACA,mBAAgB,CAAC,GACjB,6BACA,iBACA,iBACA,sCACA,yBACA,8BAA0B,IAC1B,8BAA0B,OACxB,GACE,IAAe,EAAgB,GAC/B,CAAC,IAAoB,MAAyB,EAAS,EAAK,GAC5D,CAAC,GAAkB,KAAuB,EAC9C,EACF,GACM,CAAC,GAAQ,KAAa,QAAwB,EAAe,CAAC,GAC9D,CAAC,IAAoB,KAAyB,EAAS,EAAK,GAC5D,EAAE,wBAAwB,GAAW,kCACzC,GACI,EAAE,2BAAwB,GAC1B,EAAE,WAAW,IAAwB,MAAM,OAAkB,GACjE,EACF,GAOM,WAA0B;EAC9B,IAAM,IAAiB,EAAa,oBAAoB,MAAM;EAC9D,IAAI,KAAkB,EAAe,SAAS,GAAG;GAC/C,IAAM,IAAa,GACjB,GACA,IAAe,YACjB,GACM,IAAW,GAAkB,CAAU;GAE7C,AADA,EAAU,CAAU,GACpB,GAAoB,OAAS;IAC3B,GAAG;IACH,OAAO;KACL,GAAG,EAAK;KACR,gBAAgB,KAAA;KAChB,mBAAmB,IACf,CACE,IAAI,EAAK,MAAM,qBAAqB,CAAC,GAAG,QACtC,MAAK,CAAC,EAAc,CAAC,CACvB,GACA,CACF,IACA,EAAK,MAAM;IACjB;GACF,EAAE;EACJ;EACA,EAAoB,EAAI;CAC1B,GAEM,UAAyB;EAW7B,AAVA,EAAU,EAAe,CAAC,GAC1B,GAAoB,OAAS;GAC3B,GAAG;GACH,OAAO;IACL,GAAG,EAAK;IACR,mBAAmB,EAAK,MAAM,mBAAmB,QAC/C,MAAK,CAAC,EAAc,CAAC,CACvB;GACF;EACF,EAAE,GACF,EAAoB,EAAK;CAC3B,GAEM,WAAiC;EACrC,IAAI,CAAC,GAAkB;GACrB,GAAkB;GAClB;EACF;EACA,IAAM,IACJ,EAAa,oBAAoB,MAAM,mBAAmB,KACxD,CACF,KAAK;EACP,IAAI,EAAqB,CAAM,KAAK,GAAuB;GACzD,EAAsB,EAAI;GAC1B;EACF;EACA,EAAiB;CACnB,GAEM,KAAwB,GAAa,CAAyB,GAE9D,IAAsB,EAAa,qBAEnC,KACH,GAAqB,MAAM,mBAAmB,KAAA,KAC7C,EAAoB,MAAM,eAAe,SAAS,KACnD,GAAqB,MAAM,sBAAsB,KAAA,KAChD,GAAqB,MAAM,kBAAkB,SAAS,GAEpD,KACJ,EAA8C;CAEhD,OACE,kBAAC,GAAD,EAAA,WACG,MAA6B;EAC5B,IAAI,MAA8B,KAAA,GAChC,MAAU,MACR,iFACF;EAGF,OACE,kBAAC,IAAD;GACE,WAAW,uBACT,EAA0B,mBAAmB,CAAC,IAC1C,IACA,EACL,GAAG,KAAwB,IAAwB,GAAG,GACrD,IAAuB,6BAA6B,GACrD,GAAG,IAAmB,0BAA0B;GACjD,IAAI,EACF,KAAK,EACH,QAAQ,KAAyB,SAAS,KAAA,EAC5C,EACF;aAEA,mBAAC,GAAD,EAAA,UAAA;IACG,KACC,kBAAC,GAAD,EAAgB,WAAW,GAAqB,UAAY,CAAA,IAE5D,kBAAC,GAAD;KACE,GAAI;KACU;KACa;IAC5B,CAAA;IAEH,kBAAC,GAAD,CAAY,CAAA;IACX,EAA0B,4BACzB,kBAAC,GAAD;KAC4B;KAC1B,eACE,EAA0B,4BAA4B,EAAK;IAE9D,CAAA;IAEF,CAAC,KACA,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,qBAAqB,MAAuB,KAAA;KACtC;KACQ;KAEZ;KAGA;KAEc;KAChB,wBAAwB,CAAC,KAAa;KACtC,2BACE,CAAC,KAAa;KAEM;KACK;KAClB;KACO;KACS;KACP;KAClB,sBAAsB;IACvB,CAAA,EACmB,CAAA;IAEvB,IACC,kBAAC,GAAD;KAAU,UAAU;eAClB,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,IAAD;OACE,MAAM;OACN,cAAc;MACf,CAAA;KACE,CAAA;IACG,CAAA,IAEV,KACE,kBAAC,GAAD;KACmB;KACa;IAC/B,CAAA;IAIL,kBAAC,GAAD;KAAU,UAAU;eAClB,kBAAC,GAAD;MACE,WAAW;MACX,SAAS,KAAqB,gBAAgB;MAC9C,kBAAkB;KACnB,CAAA;IACO,CAAA;IACV,kBAAC,GAAD;KACkB;KACP;IACV,CAAA;IACD,kBAAC,GAAD;KACgB;KACD;KAEX;IAEH,CAAA;IACD,kBAAC,GAAD;KACsB;KACN;KACK;KACL;IACf,CAAA;IACA,MACC,kBAAC,GAAD;KACE,qBAAqB,GAAc;KACnC,eAAe,GAAsB,EAAK;IAC3C,CAAA;IAEH,kBAAC,GAAD;KACE,MAAM;KACN,OAAM;KACN,SAAQ;KACR,oBAAoB;MAClB,UAAU;MACV,OAAO;MACP,SAAS;KACX;KACA,iBAAiB;MAEf,AADA,EAAsB,EAAK,GAC3B,EAAiB;KACnB;KACA,gBAAgB,EAAsB,EAAK;IAC5C,CAAA;GACwB,EAAA,CAAA;EACxB,CAAA;CAET,EACiC,CAAA;AAEvC;AAEA,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EACJ,KAAK,GACL,uBACA,gBAAa,CAAC,GACd,WAAA,IACA,sBACA,oBACA,uCACA,sBACA,gBACA,wCACE,GAGE,EAAE,aAAU,qBAChB,EAFU,EAAM,OAAO,OAAO,KAAiB,EAEJ,GAEvC,IAAe,QACf,EAAM,QAED,EAAM,QACJ,EAAM,gBAER,KAAK,MAAM,EAAM,aAAa,IAQ9B;EACL,KAAK;EACL,mBAPwB,EACxB,EAAM,cACN,EAAM,aACN,CAIA;EACO;EACP,QAAQ;CACV,GAED;EACD,EAAM;EACN,EAAM;EACN,EAAM;EACN,EAAM;EACN;EACA;EACA;CACF,CAAC,GAEK,CAAC,GAAc,KAAmB,EAAS,CAAC,GAC5C,UAAgB;EACpB,EAAgB,IAAe,CAAC;CAClC,GAEM,EAAE,MAAM,MAAW,EAAa,GAAU,CAAa,GACvD,IAAuC;EAC3C,UAAU,KAAY;EACtB,cAAc;EACd,UACE;EAQF;CACF,GACM,KACH,KAAU,EAAQ,CAAM,KAAK,EAAO,oBAAoB,IAQrD,IAAkB,GAAG,KAAK,UAAU,CAAgB,EAAE,GAAG;CAE/D,OACE,kBAAC,GAAD;EACE,GAAI;EACc;EAClB,KAAK;EACO;CAmCA,GAjCZ,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,CAA4B,CAAA;YAC9C,kBAAC,GAAD;GACmB;GACjB,UAAU,EAAM;GAChB,eAAe,EAAM;GACrB,kBAAkB,EAAM;GACxB,4BACE,EAAM,mBAAmB,mBACrB;GAEa;GACnB,oBAAoB,EAAM;GAC1B,eAAe,EAAM;GACrB,kBAAkB,EAAM;GACxB,qBAAqB,EAAM;GAC3B,uBACG,EAAM,wBAAwB,MAC/B,CAAC,EAAM;GAET,gCAAgC,EAAM;GACtC,sBAAsB,EAAM;GACT;GACnB,0BAA0B,EAAyB;GACnD,gBAAgB,MAAM,QAAQ,CAAW,KAAK,EAAY,SAAS;GACjC;aAElC,kBAAC,GAAD;IACE,GAAI;IACqB;IAChB;GACV,CAAA;EACwB,CAAA;CACnB,CAAA,CACE;AAElB"}
@@ -11,6 +11,7 @@ export type RssFeedCardsProps = {
11
11
  mailChimpListName?: string;
12
12
  mailChimpUrl?: string;
13
13
  viewAllNewsButtonText?: string;
14
+ hideDate?: boolean;
14
15
  };
15
16
  export declare function RssFeedCards(props: RssFeedCardsProps): import("react/jsx-runtime").JSX.Element;
16
17
  export default RssFeedCards;
@@ -1 +1 @@
1
- {"version":3,"file":"RssFeedCards.d.ts","sourceRoot":"","sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAA0B,MAAM,uBAAuB,CAAA;AAK3E,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAuBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CA6IpD;AAED,eAAe,YAAY,CAAA;AAE3B;;;GAGG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf"}
1
+ {"version":3,"file":"RssFeedCards.d.ts","sourceRoot":"","sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAA0B,MAAM,uBAAuB,CAAA;AAK3E,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAuBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAgJpD;AAED,eAAe,YAAY,CAAA;AAE3B;;;GAGG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -23,8 +23,8 @@ function m(e) {
23
23
  });
24
24
  }
25
25
  function h(s) {
26
- let { url: d, filter: f, itemsToShow: h, allowCategories: g, mailChimpListName: _, mailChimpUrl: v, viewAllNewsButtonText: y } = s, { allItemsUrl: b, feedUrl: x } = p(d, f), { data: S, isError: C } = c(m(x)), [w, T] = r(!1);
27
- return S?.items?.length === 0 ? /* @__PURE__ */ o("div", {
26
+ let { url: d, filter: f, itemsToShow: h, allowCategories: g, mailChimpListName: _, mailChimpUrl: v, viewAllNewsButtonText: y, hideDate: b } = s, { allItemsUrl: x, feedUrl: S } = p(d, f), { data: C, isError: w } = c(m(S)), [T, E] = r(!1);
27
+ return C?.items?.length === 0 ? /* @__PURE__ */ o("div", {
28
28
  className: "text-center SRCBorderedPanel SRCBorderedPanel--padded2x",
29
29
  children: [e, /* @__PURE__ */ a("div", {
30
30
  style: {
@@ -35,11 +35,11 @@ function h(s) {
35
35
  })]
36
36
  }) : /* @__PURE__ */ o(i, { children: [v && /* @__PURE__ */ o("div", {
37
37
  className: "FeedSubscribe",
38
- children: [!w && /* @__PURE__ */ o("a", {
38
+ children: [!T && /* @__PURE__ */ o("a", {
39
39
  className: "FeedSubscribeToNewsLink SRC-no-border-bottom-imp",
40
- onClick: () => T(!0),
40
+ onClick: () => E(!0),
41
41
  children: [/* @__PURE__ */ a(n, { title: "Subscribe to News" }), "Subscribe to News"]
42
- }), w && /* @__PURE__ */ o("div", {
42
+ }), T && /* @__PURE__ */ o("div", {
43
43
  className: "MailchimpSubscribeContainer",
44
44
  children: [
45
45
  /* @__PURE__ */ a(n, { title: "Subscribe to News" }),
@@ -59,7 +59,7 @@ function h(s) {
59
59
  children: [
60
60
  /* @__PURE__ */ a("div", {
61
61
  className: "FeedItems",
62
- children: S?.items && S.items.map((e, t) => {
62
+ children: C?.items && C.items.map((e, t) => {
63
63
  if (!(t >= h)) return /* @__PURE__ */ a("div", {
64
64
  className: "FeedItem",
65
65
  children: /* @__PURE__ */ o("div", { children: [
@@ -68,7 +68,7 @@ function h(s) {
68
68
  children: e.categories?.map((t) => {
69
69
  let n = t.toLowerCase();
70
70
  return g?.findIndex((e) => n === e.toLowerCase()) === -1 ? null : /* @__PURE__ */ a("a", {
71
- href: `${S.link}/tag/${t.replace(" ", "-")}`,
71
+ href: `${C.link}/tag/${t.replace(" ", "-")}`,
72
72
  className: "SRC-no-border-bottom-imp",
73
73
  target: "_blank",
74
74
  rel: "noopener noreferrer",
@@ -79,7 +79,7 @@ function h(s) {
79
79
  }, `${e.guid}_${t}`);
80
80
  })
81
81
  }),
82
- /* @__PURE__ */ a("p", {
82
+ !b && /* @__PURE__ */ a("p", {
83
83
  className: "FeedItemDate",
84
84
  children: l(e.isoDate).format("MMMM YYYY")
85
85
  }),
@@ -102,17 +102,17 @@ function h(s) {
102
102
  }, e.guid);
103
103
  })
104
104
  }),
105
- S?.items && S.items.length > h && b && /* @__PURE__ */ a("div", {
105
+ C?.items && C.items.length > h && x && /* @__PURE__ */ a("div", {
106
106
  className: "FeedViewAllNewsButtonContainer",
107
107
  children: /* @__PURE__ */ a(t, {
108
108
  color: "secondary",
109
109
  variant: "contained",
110
- onClick: () => window.open(b, "_blank", "noopener"),
110
+ onClick: () => window.open(x, "_blank", "noopener"),
111
111
  target: "_blank",
112
112
  children: y ?? "View All News"
113
113
  })
114
114
  }),
115
- C && /* @__PURE__ */ o("div", { children: ["Unable to load feed: ", d] })
115
+ w && /* @__PURE__ */ o("div", { children: ["Unable to load feed: ", d] })
116
116
  ]
117
117
  })] });
118
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RssFeedCards.js","names":[],"sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"sourcesContent":["import NoData from '@/assets/icons/NoData'\nimport { ReactComponent as SubscribePlus } from '@/assets/icons/subscribe_plus.svg'\nimport LargeButton from '@/components/styled/LargeButton'\nimport dayjs from 'dayjs'\nimport MailchimpSubscribe from 'react-mailchimp-subscribe'\nimport Parser from 'rss-parser'\nimport { QueryClient, queryOptions, useQuery } from '@tanstack/react-query'\nimport { useState } from 'react'\n\nconst rssParser = new Parser()\n\nexport type RssFilter = {\n type?: 'tag' | 'category'\n value: string\n}\n\nexport type RssFeedCardsProps = {\n url: string\n filter?: RssFilter // optional tag or category to use as a filter\n itemsToShow: number\n allowCategories?: string[]\n mailChimpListName?: string\n mailChimpUrl?: string\n viewAllNewsButtonText?: string\n}\n\nfunction buildRssFeedUrl(url: string, filter?: RssFilter) {\n const filterValue = filter?.value\n const filterType = filter?.type\n const tagPath = filterValue\n ? `/${filterType ?? 'tag'}/${filterValue.replace(' ', '-')}`\n : ''\n const allItemsUrl = `${url}${tagPath}`\n const feedUrl = `${allItemsUrl}/?feed=rss2`\n return { allItemsUrl, feedUrl }\n}\n\nfunction getRssFeedQueryOptions(feedUrl: string) {\n return queryOptions({\n queryKey: ['rssFeed', feedUrl],\n queryFn: () =>\n fetch(feedUrl)\n .then(response => response.text())\n .then(responseData => rssParser.parseString(responseData)),\n })\n}\n\nexport function RssFeedCards(props: RssFeedCardsProps) {\n const {\n url,\n filter,\n itemsToShow,\n allowCategories,\n mailChimpListName,\n mailChimpUrl,\n viewAllNewsButtonText,\n } = props\n\n const { allItemsUrl, feedUrl } = buildRssFeedUrl(url, filter)\n\n const { data: rssFeed, isError } = useQuery(getRssFeedQueryOptions(feedUrl))\n\n const [isShowingSubscribeUI, setIsShowingSubscribeUI] = useState(false)\n\n if (rssFeed?.items?.length === 0) {\n return (\n <div className=\"text-center SRCBorderedPanel SRCBorderedPanel--padded2x\">\n {NoData}\n <div style={{ marginTop: '20px', fontStyle: 'italic' }}>\n There are no items currently available\n </div>\n </div>\n )\n }\n return (\n <>\n {mailChimpUrl && (\n <div className=\"FeedSubscribe\">\n {!isShowingSubscribeUI && (\n <a\n className=\"FeedSubscribeToNewsLink SRC-no-border-bottom-imp\"\n onClick={() => setIsShowingSubscribeUI(true)}\n >\n <SubscribePlus title=\"Subscribe to News\" />\n Subscribe to News\n </a>\n )}\n {isShowingSubscribeUI && (\n <div className=\"MailchimpSubscribeContainer\">\n <SubscribePlus title=\"Subscribe to News\" />\n <p>\n Subscribe to receive the {mailChimpListName} by e-mail, which\n provides information and updates related to the Portal. You can\n opt out at any time by using the unsubscribe link within the\n e-mail. We will not share your information with any third\n parties or use it for any other purposes.\n </p>\n <div className=\"SRC-marginBottomTop\">\n <MailchimpSubscribe url={mailChimpUrl} />\n </div>\n </div>\n )}\n </div>\n )}\n <div className=\"Feed\">\n <div className=\"FeedItems\">\n {rssFeed?.items &&\n rssFeed.items.map((item, index) => {\n // The other is to hide the large number of items in a particular feed (usually a max of 10 are returned). See state.isShowingMoreItems\n if (index >= itemsToShow) {\n return\n }\n\n return (\n <div key={item.guid} className={`FeedItem`}>\n <div>\n {allowCategories && allowCategories.length > 0 && (\n <div className=\"FeedItemCategories\">\n {item.categories?.map((categoryName: string) => {\n // are we allowed to show this category/tag?\n const categoryNameLowerCase =\n categoryName.toLowerCase()\n if (\n allowCategories?.findIndex(\n item =>\n categoryNameLowerCase === item.toLowerCase(),\n ) === -1\n )\n return null\n // else\n return (\n <a\n href={`${rssFeed.link}/tag/${categoryName.replace(\n ' ',\n '-',\n )}`}\n className=\"SRC-no-border-bottom-imp\"\n key={`${item.guid}_${categoryName}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div className=\"FeedItemCategory\">\n {categoryName}\n </div>\n </a>\n )\n })}\n </div>\n )}\n <p className=\"FeedItemDate\">\n {dayjs(item.isoDate).format('MMMM YYYY')}\n </p>\n <p className=\"FeedItemTitle\">{item.title}</p>\n <div className=\"FeedItemDescription\">\n {item.contentSnippet?.replace(/\\[...\\]|\\[…\\]/gm, '…')}\n </div>\n <a\n className=\"FeedItemLink\"\n href={item.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Continue reading\n </a>\n </div>\n </div>\n )\n })}\n </div>\n {rssFeed?.items &&\n rssFeed.items.length > itemsToShow &&\n allItemsUrl && (\n <div className=\"FeedViewAllNewsButtonContainer\">\n <LargeButton\n color=\"secondary\"\n variant=\"contained\"\n onClick={() => window.open(allItemsUrl, '_blank', 'noopener')}\n // @ts-expect-error - target prop exists, but TS doesn't recognize on styled component\n target=\"_blank\"\n >\n {viewAllNewsButtonText ?? 'View All News'}\n </LargeButton>\n </div>\n )}\n {isError && <div>Unable to load feed: {url}</div>}\n </div>\n </>\n )\n}\n\nexport default RssFeedCards\n\n/**\n * Prefetches the RSS feed into a QueryClient for use with HydrationBoundary.\n * Uses the same query key as the RssFeedCards component.\n */\nexport async function prefetchRssFeed(\n queryClient: QueryClient,\n url: string,\n filter?: RssFilter,\n): Promise<void> {\n const { feedUrl } = buildRssFeedUrl(url, filter)\n await queryClient.prefetchQuery(getRssFeedQueryOptions(feedUrl))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RssFeedCards.js","names":[],"sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"sourcesContent":["import NoData from '@/assets/icons/NoData'\nimport { ReactComponent as SubscribePlus } from '@/assets/icons/subscribe_plus.svg'\nimport LargeButton from '@/components/styled/LargeButton'\nimport dayjs from 'dayjs'\nimport MailchimpSubscribe from 'react-mailchimp-subscribe'\nimport Parser from 'rss-parser'\nimport { QueryClient, queryOptions, useQuery } from '@tanstack/react-query'\nimport { useState } from 'react'\n\nconst rssParser = new Parser()\n\nexport type RssFilter = {\n type?: 'tag' | 'category'\n value: string\n}\n\nexport type RssFeedCardsProps = {\n url: string\n filter?: RssFilter // optional tag or category to use as a filter\n itemsToShow: number\n allowCategories?: string[]\n mailChimpListName?: string\n mailChimpUrl?: string\n viewAllNewsButtonText?: string\n hideDate?: boolean\n}\n\nfunction buildRssFeedUrl(url: string, filter?: RssFilter) {\n const filterValue = filter?.value\n const filterType = filter?.type\n const tagPath = filterValue\n ? `/${filterType ?? 'tag'}/${filterValue.replace(' ', '-')}`\n : ''\n const allItemsUrl = `${url}${tagPath}`\n const feedUrl = `${allItemsUrl}/?feed=rss2`\n return { allItemsUrl, feedUrl }\n}\n\nfunction getRssFeedQueryOptions(feedUrl: string) {\n return queryOptions({\n queryKey: ['rssFeed', feedUrl],\n queryFn: () =>\n fetch(feedUrl)\n .then(response => response.text())\n .then(responseData => rssParser.parseString(responseData)),\n })\n}\n\nexport function RssFeedCards(props: RssFeedCardsProps) {\n const {\n url,\n filter,\n itemsToShow,\n allowCategories,\n mailChimpListName,\n mailChimpUrl,\n viewAllNewsButtonText,\n hideDate,\n } = props\n\n const { allItemsUrl, feedUrl } = buildRssFeedUrl(url, filter)\n\n const { data: rssFeed, isError } = useQuery(getRssFeedQueryOptions(feedUrl))\n\n const [isShowingSubscribeUI, setIsShowingSubscribeUI] = useState(false)\n\n if (rssFeed?.items?.length === 0) {\n return (\n <div className=\"text-center SRCBorderedPanel SRCBorderedPanel--padded2x\">\n {NoData}\n <div style={{ marginTop: '20px', fontStyle: 'italic' }}>\n There are no items currently available\n </div>\n </div>\n )\n }\n return (\n <>\n {mailChimpUrl && (\n <div className=\"FeedSubscribe\">\n {!isShowingSubscribeUI && (\n <a\n className=\"FeedSubscribeToNewsLink SRC-no-border-bottom-imp\"\n onClick={() => setIsShowingSubscribeUI(true)}\n >\n <SubscribePlus title=\"Subscribe to News\" />\n Subscribe to News\n </a>\n )}\n {isShowingSubscribeUI && (\n <div className=\"MailchimpSubscribeContainer\">\n <SubscribePlus title=\"Subscribe to News\" />\n <p>\n Subscribe to receive the {mailChimpListName} by e-mail, which\n provides information and updates related to the Portal. You can\n opt out at any time by using the unsubscribe link within the\n e-mail. We will not share your information with any third\n parties or use it for any other purposes.\n </p>\n <div className=\"SRC-marginBottomTop\">\n <MailchimpSubscribe url={mailChimpUrl} />\n </div>\n </div>\n )}\n </div>\n )}\n <div className=\"Feed\">\n <div className=\"FeedItems\">\n {rssFeed?.items &&\n rssFeed.items.map((item, index) => {\n // The other is to hide the large number of items in a particular feed (usually a max of 10 are returned). See state.isShowingMoreItems\n if (index >= itemsToShow) {\n return\n }\n\n return (\n <div key={item.guid} className={`FeedItem`}>\n <div>\n {allowCategories && allowCategories.length > 0 && (\n <div className=\"FeedItemCategories\">\n {item.categories?.map((categoryName: string) => {\n // are we allowed to show this category/tag?\n const categoryNameLowerCase =\n categoryName.toLowerCase()\n if (\n allowCategories?.findIndex(\n item =>\n categoryNameLowerCase === item.toLowerCase(),\n ) === -1\n )\n return null\n // else\n return (\n <a\n href={`${rssFeed.link}/tag/${categoryName.replace(\n ' ',\n '-',\n )}`}\n className=\"SRC-no-border-bottom-imp\"\n key={`${item.guid}_${categoryName}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div className=\"FeedItemCategory\">\n {categoryName}\n </div>\n </a>\n )\n })}\n </div>\n )}\n {!hideDate && (\n <p className=\"FeedItemDate\">\n {dayjs(item.isoDate).format('MMMM YYYY')}\n </p>\n )}\n <p className=\"FeedItemTitle\">{item.title}</p>\n <div className=\"FeedItemDescription\">\n {item.contentSnippet?.replace(/\\[...\\]|\\[…\\]/gm, '…')}\n </div>\n <a\n className=\"FeedItemLink\"\n href={item.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Continue reading\n </a>\n </div>\n </div>\n )\n })}\n </div>\n {rssFeed?.items &&\n rssFeed.items.length > itemsToShow &&\n allItemsUrl && (\n <div className=\"FeedViewAllNewsButtonContainer\">\n <LargeButton\n color=\"secondary\"\n variant=\"contained\"\n onClick={() => window.open(allItemsUrl, '_blank', 'noopener')}\n // @ts-expect-error - target prop exists, but TS doesn't recognize on styled component\n target=\"_blank\"\n >\n {viewAllNewsButtonText ?? 'View All News'}\n </LargeButton>\n </div>\n )}\n {isError && <div>Unable to load feed: {url}</div>}\n </div>\n </>\n )\n}\n\nexport default RssFeedCards\n\n/**\n * Prefetches the RSS feed into a QueryClient for use with HydrationBoundary.\n * Uses the same query key as the RssFeedCards component.\n */\nexport async function prefetchRssFeed(\n queryClient: QueryClient,\n url: string,\n filter?: RssFilter,\n): Promise<void> {\n const { feedUrl } = buildRssFeedUrl(url, filter)\n await queryClient.prefetchQuery(getRssFeedQueryOptions(feedUrl))\n}\n"],"mappings":"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"}