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
@@ -4,105 +4,118 @@ import { useSynapseContext as t } from "../../../utils/context/SynapseContext.js
4
4
  import "../../../utils/index.js";
5
5
  import { useGetEntity as n } from "../../../synapse-queries/entity/useEntity.js";
6
6
  import "../../../synapse-queries/index.js";
7
- import ee from "../../IconSvg/index.js";
7
+ import r from "../../IconSvg/index.js";
8
8
  import "../SynapseTableUtils.js";
9
- import { useQueryContext as te } from "../../QueryContext/QueryContext.js";
9
+ import { useQueryContext as ee } from "../../QueryContext/QueryContext.js";
10
10
  import "../../QueryContext/index.js";
11
- import { useGetQueryMetadata as r } from "../../QueryWrapper/useGetQueryMetadata.js";
12
- import { useQueryVisualizationContext as i } from "../../QueryVisualizationWrapper/QueryVisualizationContext.js";
11
+ import { useGetQueryMetadata as te } from "../../QueryWrapper/useGetQueryMetadata.js";
12
+ import { useQueryVisualizationContext as ne } from "../../QueryVisualizationWrapper/QueryVisualizationContext.js";
13
13
  import "../../QueryVisualizationWrapper/index.js";
14
- import { isRowSelectionVisibleAtom as a, useHasSelectedRowsAtomValue as o, useSelectedRowsAtomValue as s } from "../../QueryWrapper/TableRowSelectionState.js";
15
- import { SignInRequiredModal as c } from "../../SignInRequiredModal/SignInRequiredModal.js";
16
- import l from "../../MissingQueryResultsWarning/MissingQueryResultsWarning.js";
17
- import { ElementWithTooltip as u } from "../../widgets/ElementWithTooltip.js";
18
- import { getNumberOfResultsToInvokeAction as d, getNumberOfResultsToInvokeActionCopy as f } from "./TopLevelControlsUtils.js";
19
- import p from "../export/ExportToAnalysisPlatformDialog.js";
20
- import { CustomControlButton as m } from "../CustomControls/CustomControlButton.js";
21
- import { RowSelectionControls as h } from "../RowSelection/RowSelectionControls.js";
22
- import { DownloadOptions as g } from "../table-top/DownloadOptions.js";
23
- import { ColumnSelection as _ } from "../table-top/ColumnSelection.js";
14
+ import { isRowSelectionVisibleAtom as re, useHasSelectedRowsAtomValue as i, useSelectedRowsAtomValue as a } from "../../QueryWrapper/TableRowSelectionState.js";
15
+ import { SignInRequiredModal as o } from "../../SignInRequiredModal/SignInRequiredModal.js";
16
+ import s from "../../MissingQueryResultsWarning/MissingQueryResultsWarning.js";
17
+ import { ElementWithTooltip as c } from "../../widgets/ElementWithTooltip.js";
18
+ import { getNumberOfResultsToInvokeAction as l, getNumberOfResultsToInvokeActionCopy as u } from "./TopLevelControlsUtils.js";
19
+ import d from "../export/ExportToAnalysisPlatformDialog.js";
20
+ import { CustomControlButton as f } from "../CustomControls/CustomControlButton.js";
21
+ import { RowSelectionControls as p } from "../RowSelection/RowSelectionControls.js";
22
+ import { DownloadOptions as m } from "../table-top/DownloadOptions.js";
23
+ import { ColumnSelection as h } from "../table-top/ColumnSelection.js";
24
24
  import "../table-top/index.js";
25
- import { useState as v } from "react";
26
- import { cloneDeep as ne } from "lodash-es";
27
- import { Button as y, Divider as re, Tooltip as b, Typography as x } from "@mui/material";
28
- import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
29
- import { useAtomValue as T } from "jotai";
25
+ import { useState as g } from "react";
26
+ import { cloneDeep as ie } from "lodash-es";
27
+ import { Button as _, Divider as ae, Tooltip as oe, Typography as se } from "@mui/material";
28
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
29
+ import { useAtomValue as x } from "jotai";
30
30
  //#region src/components/SynapseTable/TopLevelControls/TopLevelControls.tsx
31
- var E = "SendToAnalysisPlatformTopLevelControlButton", D = (D) => {
32
- let [O, k] = v(!1), { isAuthenticated: A } = t(), { name: j, showColumnSelection: M = !1, hideDownload: N = !1, hideAddToDownloadListMenuItem: P, hideProgrammaticOptionsMenuItem: F, hideVisualizationsControl: I = !1, hideFacetFilterControl: L = !1, hideQueryCount: R = !1, hideSqlEditorControl: z = !0, customControls: B, cavaticaConnectAccountURL: V, remount: H } = D, { entityId: U, versionNumber: ie, getCurrentQueryRequest: W, hasResettableFilters: G } = te(), { data: K } = n(U, ie), { data: q } = r(), J = T(a), Y = s(), X = o(), { setShowSearchBar: ae, columnsToShowInTable: Z, setColumnsToShowInTable: oe, enabledExternalAnalysisPlatforms: se, setIsShowingExportToAnalysisPlatformModal: ce, unitDescription: le, setShowDownloadConfirmation: ue, showCopyToClipboard: de, hideSearchBarControl: fe, setShowPlots: pe, setShowSqlEditor: me, showFacetFilter: Q, setShowFacetFilter: he } = i(), ge = se.length > 0, [_e, $] = v(!1), ve = (e) => {
33
- let t = ne(Z);
34
- t.includes(e) ? t = t.filter((t) => t !== e) : t.push(e), oe(t);
35
- }, ye = d(X, Y, q?.queryCount), be = f(G, X, Y, q?.queryCount, le), xe = !R && q?.queryCount !== void 0 ? `(${q.queryCount.toLocaleString()})` : null;
36
- return /* @__PURE__ */ C("div", {
31
+ var S = "SendToAnalysisPlatformTopLevelControlButton", C = {
32
+ ml: 2,
33
+ fontWeight: 400,
34
+ fontSize: "14px",
35
+ textDecoration: "none !important"
36
+ }, w = (w) => {
37
+ let [T, E] = g(!1), { isAuthenticated: D } = t(), { name: O, showColumnSelection: k = !1, hideDownload: A = !1, hideAddToDownloadListMenuItem: j, hideProgrammaticOptionsMenuItem: M, hideVisualizationsControl: N = !1, hideFacetFilterControl: P = !1, hideQueryCount: F = !1, hideSqlEditorControl: I = !0, showQueryBuilderControl: L = !1, showQueryBuilder: R = !1, onToggleQueryBuilder: z, customControls: B, cavaticaConnectAccountURL: V, remount: H } = w, { entityId: U, versionNumber: ce, getCurrentQueryRequest: W, hasResettableFilters: G } = ee(), { data: K } = n(U, ce), { data: q } = te(), J = x(re), Y = a(), X = i(), { setShowSearchBar: le, columnsToShowInTable: Z, setColumnsToShowInTable: ue, enabledExternalAnalysisPlatforms: de, setIsShowingExportToAnalysisPlatformModal: fe, unitDescription: pe, setShowDownloadConfirmation: me, showCopyToClipboard: he, hideSearchBarControl: ge, setShowPlots: _e, setShowSqlEditor: ve, showFacetFilter: Q, setShowFacetFilter: ye } = ne(), be = de.length > 0, [xe, $] = g(!1), Se = (e) => {
38
+ let t = ie(Z);
39
+ t.includes(e) ? t = t.filter((t) => t !== e) : t.push(e), ue(t);
40
+ }, Ce = l(X, Y, q?.queryCount), we = u(G, X, Y, q?.queryCount, pe), Te = !F && q?.queryCount !== void 0 ? `(${q.queryCount.toLocaleString()})` : null;
41
+ return /* @__PURE__ */ y("div", {
37
42
  className: "TopLevelControls",
38
43
  "data-testid": "TopLevelControls",
39
- children: /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("div", {
44
+ children: /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
40
45
  className: "TopLevelControls__querycount",
41
- children: [j && /* @__PURE__ */ w(S, { children: [/* @__PURE__ */ w(x, {
42
- variant: "sectionTitle",
43
- role: "heading",
44
- children: [
45
- j,
46
- " ",
47
- xe
48
- ]
49
- }), !R && K && /* @__PURE__ */ C(l, { entity: K })] }), !L && /* @__PURE__ */ w(y, {
50
- variant: "text",
51
- onClick: () => he((e) => !e),
52
- startIcon: /* @__PURE__ */ C(ee, {
53
- icon: Q ? "close" : "filter",
54
- wrap: !1
46
+ children: [
47
+ O && /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ b(se, {
48
+ variant: "sectionTitle",
49
+ role: "heading",
50
+ children: [
51
+ O,
52
+ " ",
53
+ Te
54
+ ]
55
+ }), !F && K && /* @__PURE__ */ y(s, { entity: K })] }),
56
+ !P && /* @__PURE__ */ b(_, {
57
+ variant: "text",
58
+ onClick: () => ye((e) => !e),
59
+ startIcon: /* @__PURE__ */ y(r, {
60
+ icon: Q ? "close" : "filter",
61
+ wrap: !1
62
+ }),
63
+ sx: C,
64
+ children: [Q ? "Hide" : "Show", " filters"]
55
65
  }),
56
- sx: {
57
- ml: 2,
58
- fontWeight: 400,
59
- fontSize: "14px",
60
- textDecoration: "none !important"
61
- },
62
- children: [Q ? "Hide" : "Show", " filters"]
63
- })]
64
- }), /* @__PURE__ */ w("div", {
66
+ L && z && /* @__PURE__ */ b(_, {
67
+ variant: "text",
68
+ onClick: z,
69
+ startIcon: /* @__PURE__ */ y(r, {
70
+ icon: R ? "close" : "filter",
71
+ wrap: !1
72
+ }),
73
+ sx: C,
74
+ children: [R ? "Hide" : "Show", " Query Builder"]
75
+ })
76
+ ]
77
+ }), /* @__PURE__ */ b("div", {
65
78
  className: "TopLevelControls__actions",
66
79
  children: [
67
- ge && /* @__PURE__ */ w(S, { children: [/* @__PURE__ */ C(b, {
68
- title: /* @__PURE__ */ w(S, { children: [
80
+ be && /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(oe, {
81
+ title: /* @__PURE__ */ b(v, { children: [
69
82
  "This action will send a reference to",
70
83
  " ",
71
84
  X ? "each selected file" : "every file in the current table",
72
85
  " ",
73
86
  "to a chosen external analysis platform.",
74
87
  " ",
75
- !X && Q && /* @__PURE__ */ C(S, { children: "You can change what is sent by applying filters using the controls in the sidebar." }),
76
- X && /* @__PURE__ */ C(S, { children: "You can change what is sent by selecting a different set of files." })
88
+ !X && Q && /* @__PURE__ */ y(v, { children: "You can change what is sent by applying filters using the controls in the sidebar." }),
89
+ X && /* @__PURE__ */ y(v, { children: "You can change what is sent by selecting a different set of files." })
77
90
  ] }),
78
- children: /* @__PURE__ */ w(y, {
91
+ children: /* @__PURE__ */ b(_, {
79
92
  variant: "text",
80
- disabled: !ye,
81
- onClick: () => A ? ce(!0) : k(!0),
82
- id: E,
93
+ disabled: !Ce,
94
+ onClick: () => D ? fe(!0) : E(!0),
95
+ id: S,
83
96
  children: [
84
97
  "Send ",
85
- be,
98
+ we,
86
99
  " to Analysis Platform"
87
100
  ]
88
101
  })
89
- }), /* @__PURE__ */ C(re, {
102
+ }), /* @__PURE__ */ y(ae, {
90
103
  orientation: "vertical",
91
104
  variant: "middle",
92
105
  flexItem: !0
93
106
  })] }),
94
- O && /* @__PURE__ */ C(c, {
95
- onHide: () => k(!1),
107
+ T && /* @__PURE__ */ y(o, {
108
+ onHide: () => E(!1),
96
109
  content: "You must be signed in to send results to an analysis platform."
97
110
  }),
98
- !fe && /* @__PURE__ */ C(u, {
111
+ !ge && /* @__PURE__ */ y(c, {
99
112
  tooltipText: "Show / Hide Search Bar",
100
- callbackFn: () => ae((e) => !e),
113
+ callbackFn: () => le((e) => !e),
101
114
  darkTheme: !0,
102
115
  icon: "search"
103
116
  }),
104
- de && /* @__PURE__ */ C(u, {
105
- tooltipText: _e ? "Copied to clipboard" : "Copy this search to the clipboard",
117
+ he && /* @__PURE__ */ y(c, {
118
+ tooltipText: xe ? "Copied to clipboard" : "Copy this search to the clipboard",
106
119
  callbackFn: () => {
107
120
  e(window.location.href).then(() => {
108
121
  $(!0), setTimeout(() => {
@@ -113,29 +126,29 @@ var E = "SendToAnalysisPlatformTopLevelControlButton", D = (D) => {
113
126
  darkTheme: !0,
114
127
  icon: "clipboard"
115
128
  }),
116
- !I && /* @__PURE__ */ C(u, {
129
+ !N && /* @__PURE__ */ y(c, {
117
130
  tooltipText: "Show / Hide Visualizations",
118
- callbackFn: () => pe((e) => !e),
131
+ callbackFn: () => _e((e) => !e),
119
132
  darkTheme: !0,
120
133
  icon: "chart"
121
134
  }),
122
- !N && /* @__PURE__ */ C(g, {
135
+ !A && /* @__PURE__ */ y(m, {
123
136
  darkTheme: !0,
124
- onDownloadFiles: () => ue(!0),
125
- hideAddToDownloadListMenuItem: P,
126
- hideProgrammaticOptionsMenuItem: F
137
+ onDownloadFiles: () => me(!0),
138
+ hideAddToDownloadListMenuItem: j,
139
+ hideProgrammaticOptionsMenuItem: M
127
140
  }),
128
- !z && /* @__PURE__ */ C(u, {
141
+ !I && /* @__PURE__ */ y(c, {
129
142
  tooltipText: "Show / Hide the Advanced Query Editor",
130
- callbackFn: () => me((e) => !e),
143
+ callbackFn: () => ve((e) => !e),
131
144
  darkTheme: !0,
132
145
  icon: "sqleditor"
133
146
  }),
134
- J && /* @__PURE__ */ C(h, {
147
+ J && /* @__PURE__ */ y(p, {
135
148
  customControls: B,
136
149
  remount: H
137
150
  }),
138
- !J && B && B.length > 0 && /* @__PURE__ */ C(S, { children: B.map((e) => /* @__PURE__ */ C(m, {
151
+ !J && B && B.length > 0 && /* @__PURE__ */ y(v, { children: B.map((e) => /* @__PURE__ */ y(f, {
139
152
  variant: "text",
140
153
  callbackData: {
141
154
  tableId: U,
@@ -149,18 +162,18 @@ var E = "SendToAnalysisPlatformTopLevelControlButton", D = (D) => {
149
162
  control: e,
150
163
  startIcon: e.icon
151
164
  }, e.buttonText)) }),
152
- M && /* @__PURE__ */ C(_, {
165
+ k && /* @__PURE__ */ y(h, {
153
166
  headers: q?.selectColumns,
154
167
  isColumnSelected: Z,
155
- toggleColumnSelection: ve,
168
+ toggleColumnSelection: Se,
156
169
  darkTheme: !0
157
170
  }),
158
- /* @__PURE__ */ C(p, { platformInstructionProps: { cavaticaConnectAccountURL: V } })
171
+ /* @__PURE__ */ y(d, { platformInstructionProps: { cavaticaConnectAccountURL: V } })
159
172
  ]
160
173
  })] })
161
174
  });
162
175
  };
163
176
  //#endregion
164
- export { D as default };
177
+ export { w as default };
165
178
 
166
179
  //# sourceMappingURL=TopLevelControls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TopLevelControls.js","names":[],"sources":["../../../../src/components/SynapseTable/TopLevelControls/TopLevelControls.tsx"],"sourcesContent":["import React from 'react'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SQL_EDITOR } from '@/utils/SynapseConstants'\nimport { Button, Divider, Tooltip, Typography } from '@mui/material'\nimport {\n QueryBundleRequest,\n QueryResultBundle,\n Row,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport { useAtomValue } from 'jotai'\nimport { cloneDeep } from 'lodash-es'\nimport { ReactNode, useState } from 'react'\nimport IconSvg from '../../IconSvg'\nimport MissingQueryResultsWarning from '../../MissingQueryResultsWarning/MissingQueryResultsWarning'\nimport { useQueryContext } from '../../QueryContext'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport {\n isRowSelectionVisibleAtom,\n useHasSelectedRowsAtomValue,\n useSelectedRowsAtomValue,\n} from '../../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport { ElementWithTooltip } from '../../widgets/ElementWithTooltip'\nimport ExportToAnalysisPlatformDialog from '../export/ExportToAnalysisPlatformDialog'\nimport { RowSelectionControls } from '../RowSelection/RowSelectionControls'\nimport { ColumnSelection, DownloadOptions } from '../table-top'\nimport {\n getNumberOfResultsToInvokeAction,\n getNumberOfResultsToInvokeActionCopy,\n} from './TopLevelControlsUtils'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\nimport { CustomControlButton } from '../CustomControls/CustomControlButton'\nimport { useSynapseContext } from '@/utils'\nimport { SignInRequiredModal } from '@/components/SignInRequiredModal/SignInRequiredModal'\nimport { SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE } from '../SynapseTableUtils'\n\nconst SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID =\n 'SendToAnalysisPlatformTopLevelControlButton'\n\nexport type TopLevelControlsProps = {\n name?: string\n hideDownload?: boolean\n /** If true, the \"Add ... files to Download List\" option in the Download menu will be hidden */\n hideAddToDownloadListMenuItem?: boolean\n /** If true, the \"Programmatic Options\" option in the Download menu will be hidden */\n hideProgrammaticOptionsMenuItem?: boolean\n hideVisualizationsControl?: boolean\n hideFacetFilterControl?: boolean\n hideQueryCount?: boolean\n hideSqlEditorControl?: boolean\n customControls?: CustomControl[]\n showColumnSelection?: boolean\n cavaticaConnectAccountURL?: string\n remount?: () => void\n}\n\nexport type Control = {\n key: string\n icon: string\n tooltipText: string\n}\n\nexport type CustomControlCallbackData = {\n tableId: string\n queryMetadata: Omit<QueryResultBundle, 'queryResult'> | undefined\n selectedRows: Row[] | undefined\n refresh: () => void\n request?: QueryBundleRequest\n}\n\n// note, all custom controls should check for selected rows in the event (to support row selection)\nexport type CustomControl = {\n buttonText: string\n onClick: (event: CustomControlCallbackData) => void\n classNames?: string\n icon?: ReactNode\n buttonID?: string // optionally set the ID property of the element\n title?: string // optionally set the title for the custom control\n description?: string // optionally set the description for the custom control\n}\n\nconst TopLevelControls = (props: TopLevelControlsProps): React.ReactNode => {\n const [showLoginModal, setShowLoginModal] = useState(false)\n const { isAuthenticated } = useSynapseContext()\n\n const {\n name,\n showColumnSelection = false,\n hideDownload = false,\n hideAddToDownloadListMenuItem,\n hideProgrammaticOptionsMenuItem,\n hideVisualizationsControl = false,\n hideFacetFilterControl = false,\n hideQueryCount = false,\n hideSqlEditorControl = true,\n customControls,\n cavaticaConnectAccountURL,\n remount,\n } = props\n\n const {\n entityId,\n versionNumber,\n getCurrentQueryRequest,\n hasResettableFilters,\n } = useQueryContext()\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n const selectedRows = useSelectedRowsAtomValue()\n const hasSelectedRows = useHasSelectedRowsAtomValue()\n\n const {\n setShowSearchBar,\n columnsToShowInTable,\n setColumnsToShowInTable,\n enabledExternalAnalysisPlatforms,\n setIsShowingExportToAnalysisPlatformModal,\n unitDescription,\n setShowDownloadConfirmation,\n showCopyToClipboard,\n hideSearchBarControl,\n setShowPlots,\n setShowSqlEditor,\n showFacetFilter,\n setShowFacetFilter,\n } = useQueryVisualizationContext()\n\n const showExportToAnalysisPlatformButton =\n enabledExternalAnalysisPlatforms.length > 0\n\n const [hasRecentlyCopiedToClipboard, setHasRecentlyCopiedToClipboard] =\n useState(false)\n\n /**\n * Handles the toggle of a column select, this will cause the table to\n * either show the column or hide depending on the prior state of the column\n */\n const toggleColumnSelection = (columnName: string) => {\n let columnsToShowInTableCopy = cloneDeep(columnsToShowInTable)\n if (columnsToShowInTableCopy.includes(columnName)) {\n columnsToShowInTableCopy = columnsToShowInTableCopy.filter(\n el => el !== columnName,\n )\n } else {\n columnsToShowInTableCopy.push(columnName)\n }\n setColumnsToShowInTable(columnsToShowInTableCopy)\n }\n\n const numberOfResultsToInvokeAction = getNumberOfResultsToInvokeAction(\n hasSelectedRows,\n selectedRows,\n queryMetadata?.queryCount,\n )\n const numberOfResultsToInvokeActionAsText =\n getNumberOfResultsToInvokeActionCopy(\n hasResettableFilters,\n hasSelectedRows,\n selectedRows,\n queryMetadata?.queryCount,\n unitDescription,\n )\n\n const queryCountDisplay =\n !hideQueryCount && queryMetadata?.queryCount !== undefined\n ? `(${queryMetadata.queryCount.toLocaleString()})`\n : null\n\n return (\n <div className={`TopLevelControls`} data-testid=\"TopLevelControls\">\n <div>\n <div className=\"TopLevelControls__querycount\">\n {name && (\n <>\n <Typography variant=\"sectionTitle\" role=\"heading\">\n {name} {queryCountDisplay}\n </Typography>\n {!hideQueryCount && entity && (\n <MissingQueryResultsWarning entity={entity} />\n )}\n </>\n )}\n {!hideFacetFilterControl && (\n <Button\n variant={'text'}\n onClick={() => setShowFacetFilter(value => !value)}\n startIcon={\n <IconSvg\n icon={showFacetFilter ? 'close' : 'filter'}\n wrap={false}\n />\n }\n sx={{\n ml: 2,\n fontWeight: 400,\n fontSize: '14px',\n textDecoration: 'none !important',\n }}\n >\n {showFacetFilter ? 'Hide' : 'Show'} filters\n </Button>\n )}\n </div>\n <div className=\"TopLevelControls__actions\">\n {showExportToAnalysisPlatformButton && (\n <>\n <Tooltip\n title={\n <>\n This action will send a reference to{' '}\n {hasSelectedRows\n ? 'each selected file'\n : 'every file in the current table'}{' '}\n to a chosen external analysis platform.{' '}\n {!hasSelectedRows && showFacetFilter && (\n <>\n You can change what is sent by applying filters using\n the controls in the sidebar.\n </>\n )}\n {hasSelectedRows && (\n <>\n You can change what is sent by selecting a different set\n of files.\n </>\n )}\n </>\n }\n >\n <Button\n variant=\"text\"\n disabled={!numberOfResultsToInvokeAction}\n onClick={() => {\n return isAuthenticated\n ? setIsShowingExportToAnalysisPlatformModal(true)\n : setShowLoginModal(true)\n }}\n id={SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID}\n >\n Send {numberOfResultsToInvokeActionAsText} to Analysis\n Platform\n </Button>\n </Tooltip>\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\n </>\n )}\n {showLoginModal && (\n <SignInRequiredModal\n onHide={() => setShowLoginModal(false)}\n content={SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE}\n />\n )}\n {!hideSearchBarControl && (\n <ElementWithTooltip\n tooltipText={'Show / Hide Search Bar'}\n callbackFn={() => setShowSearchBar(value => !value)}\n darkTheme={true}\n icon={'search'}\n />\n )}\n {showCopyToClipboard && (\n <ElementWithTooltip\n tooltipText={\n hasRecentlyCopiedToClipboard\n ? 'Copied to clipboard'\n : 'Copy this search to the clipboard'\n }\n callbackFn={() => {\n copyStringToClipboard(window.location.href).then(() => {\n setHasRecentlyCopiedToClipboard(true)\n setTimeout(() => {\n setHasRecentlyCopiedToClipboard(false)\n }, 3000)\n })\n }}\n darkTheme={true}\n icon={'clipboard'}\n />\n )}\n {!hideVisualizationsControl && (\n <ElementWithTooltip\n tooltipText={'Show / Hide Visualizations'}\n callbackFn={() => setShowPlots(value => !value)}\n darkTheme={true}\n icon={'chart'}\n />\n )}\n {!hideDownload && (\n <DownloadOptions\n darkTheme={true}\n onDownloadFiles={() => setShowDownloadConfirmation(true)}\n hideAddToDownloadListMenuItem={hideAddToDownloadListMenuItem}\n hideProgrammaticOptionsMenuItem={hideProgrammaticOptionsMenuItem}\n />\n )}\n\n {!hideSqlEditorControl && (\n <ElementWithTooltip\n tooltipText={'Show / Hide the Advanced Query Editor'}\n callbackFn={() => setShowSqlEditor(value => !value)}\n darkTheme={true}\n icon={SQL_EDITOR}\n />\n )}\n\n {isRowSelectionVisible && (\n <RowSelectionControls\n customControls={customControls}\n remount={remount}\n />\n )}\n {!isRowSelectionVisible &&\n customControls &&\n customControls.length > 0 && (\n <>\n {customControls.map(customControl => {\n return (\n <CustomControlButton\n key={customControl.buttonText}\n variant=\"text\"\n callbackData={{\n tableId: entityId!,\n queryMetadata: queryMetadata,\n selectedRows,\n refresh: () => {\n if (remount) {\n remount()\n }\n },\n request: getCurrentQueryRequest(),\n }}\n control={customControl}\n startIcon={customControl.icon}\n />\n )\n })}\n </>\n )}\n {showColumnSelection && (\n <ColumnSelection\n headers={queryMetadata?.selectColumns}\n isColumnSelected={columnsToShowInTable}\n toggleColumnSelection={toggleColumnSelection}\n darkTheme={true}\n />\n )}\n <ExportToAnalysisPlatformDialog\n platformInstructionProps={{\n cavaticaConnectAccountURL: cavaticaConnectAccountURL,\n }}\n />\n </div>\n </div>\n </div>\n )\n}\n\nexport default TopLevelControls\n"],"mappings":"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"}
1
+ {"version":3,"file":"TopLevelControls.js","names":[],"sources":["../../../../src/components/SynapseTable/TopLevelControls/TopLevelControls.tsx"],"sourcesContent":["import React from 'react'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SQL_EDITOR } from '@/utils/SynapseConstants'\nimport { Button, Divider, Tooltip, Typography } from '@mui/material'\nimport {\n QueryBundleRequest,\n QueryResultBundle,\n Row,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport { useAtomValue } from 'jotai'\nimport { cloneDeep } from 'lodash-es'\nimport { ReactNode, useState } from 'react'\nimport IconSvg from '../../IconSvg'\nimport MissingQueryResultsWarning from '../../MissingQueryResultsWarning/MissingQueryResultsWarning'\nimport { useQueryContext } from '../../QueryContext'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport {\n isRowSelectionVisibleAtom,\n useHasSelectedRowsAtomValue,\n useSelectedRowsAtomValue,\n} from '../../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport { ElementWithTooltip } from '../../widgets/ElementWithTooltip'\nimport ExportToAnalysisPlatformDialog from '../export/ExportToAnalysisPlatformDialog'\nimport { RowSelectionControls } from '../RowSelection/RowSelectionControls'\nimport { ColumnSelection, DownloadOptions } from '../table-top'\nimport {\n getNumberOfResultsToInvokeAction,\n getNumberOfResultsToInvokeActionCopy,\n} from './TopLevelControlsUtils'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\nimport { CustomControlButton } from '../CustomControls/CustomControlButton'\nimport { useSynapseContext } from '@/utils'\nimport { SignInRequiredModal } from '@/components/SignInRequiredModal/SignInRequiredModal'\nimport { SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE } from '../SynapseTableUtils'\n\nconst SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID =\n 'SendToAnalysisPlatformTopLevelControlButton'\n\nconst FILTER_TOGGLE_BUTTON_SX = {\n ml: 2,\n fontWeight: 400,\n fontSize: '14px',\n textDecoration: 'none !important',\n} as const\n\nexport type TopLevelControlsProps = {\n name?: string\n hideDownload?: boolean\n /** If true, the \"Add ... files to Download List\" option in the Download menu will be hidden */\n hideAddToDownloadListMenuItem?: boolean\n /** If true, the \"Programmatic Options\" option in the Download menu will be hidden */\n hideProgrammaticOptionsMenuItem?: boolean\n hideVisualizationsControl?: boolean\n hideFacetFilterControl?: boolean\n hideQueryCount?: boolean\n hideSqlEditorControl?: boolean\n /** When true, shows a `Show / Hide Query Builder` toggle. */\n showQueryBuilderControl?: boolean\n /** Current QB visibility, driven by the parent. Required when `showQueryBuilderControl` is true. */\n showQueryBuilder?: boolean\n /** Callback invoked when the QB toggle is clicked. Required when `showQueryBuilderControl` is true. */\n onToggleQueryBuilder?: () => void\n customControls?: CustomControl[]\n showColumnSelection?: boolean\n cavaticaConnectAccountURL?: string\n remount?: () => void\n}\n\nexport type Control = {\n key: string\n icon: string\n tooltipText: string\n}\n\nexport type CustomControlCallbackData = {\n tableId: string\n queryMetadata: Omit<QueryResultBundle, 'queryResult'> | undefined\n selectedRows: Row[] | undefined\n refresh: () => void\n request?: QueryBundleRequest\n}\n\n// note, all custom controls should check for selected rows in the event (to support row selection)\nexport type CustomControl = {\n buttonText: string\n onClick: (event: CustomControlCallbackData) => void\n classNames?: string\n icon?: ReactNode\n buttonID?: string // optionally set the ID property of the element\n title?: string // optionally set the title for the custom control\n description?: string // optionally set the description for the custom control\n}\n\nconst TopLevelControls = (props: TopLevelControlsProps): React.ReactNode => {\n const [showLoginModal, setShowLoginModal] = useState(false)\n const { isAuthenticated } = useSynapseContext()\n\n const {\n name,\n showColumnSelection = false,\n hideDownload = false,\n hideAddToDownloadListMenuItem,\n hideProgrammaticOptionsMenuItem,\n hideVisualizationsControl = false,\n hideFacetFilterControl = false,\n hideQueryCount = false,\n hideSqlEditorControl = true,\n showQueryBuilderControl = false,\n showQueryBuilder = false,\n onToggleQueryBuilder,\n customControls,\n cavaticaConnectAccountURL,\n remount,\n } = props\n\n const {\n entityId,\n versionNumber,\n getCurrentQueryRequest,\n hasResettableFilters,\n } = useQueryContext()\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n const selectedRows = useSelectedRowsAtomValue()\n const hasSelectedRows = useHasSelectedRowsAtomValue()\n\n const {\n setShowSearchBar,\n columnsToShowInTable,\n setColumnsToShowInTable,\n enabledExternalAnalysisPlatforms,\n setIsShowingExportToAnalysisPlatformModal,\n unitDescription,\n setShowDownloadConfirmation,\n showCopyToClipboard,\n hideSearchBarControl,\n setShowPlots,\n setShowSqlEditor,\n showFacetFilter,\n setShowFacetFilter,\n } = useQueryVisualizationContext()\n\n const showExportToAnalysisPlatformButton =\n enabledExternalAnalysisPlatforms.length > 0\n\n const [hasRecentlyCopiedToClipboard, setHasRecentlyCopiedToClipboard] =\n useState(false)\n\n /**\n * Handles the toggle of a column select, this will cause the table to\n * either show the column or hide depending on the prior state of the column\n */\n const toggleColumnSelection = (columnName: string) => {\n let columnsToShowInTableCopy = cloneDeep(columnsToShowInTable)\n if (columnsToShowInTableCopy.includes(columnName)) {\n columnsToShowInTableCopy = columnsToShowInTableCopy.filter(\n el => el !== columnName,\n )\n } else {\n columnsToShowInTableCopy.push(columnName)\n }\n setColumnsToShowInTable(columnsToShowInTableCopy)\n }\n\n const numberOfResultsToInvokeAction = getNumberOfResultsToInvokeAction(\n hasSelectedRows,\n selectedRows,\n queryMetadata?.queryCount,\n )\n const numberOfResultsToInvokeActionAsText =\n getNumberOfResultsToInvokeActionCopy(\n hasResettableFilters,\n hasSelectedRows,\n selectedRows,\n queryMetadata?.queryCount,\n unitDescription,\n )\n\n const queryCountDisplay =\n !hideQueryCount && queryMetadata?.queryCount !== undefined\n ? `(${queryMetadata.queryCount.toLocaleString()})`\n : null\n\n return (\n <div className={`TopLevelControls`} data-testid=\"TopLevelControls\">\n <div>\n <div className=\"TopLevelControls__querycount\">\n {name && (\n <>\n <Typography variant=\"sectionTitle\" role=\"heading\">\n {name} {queryCountDisplay}\n </Typography>\n {!hideQueryCount && entity && (\n <MissingQueryResultsWarning entity={entity} />\n )}\n </>\n )}\n {!hideFacetFilterControl && (\n <Button\n variant={'text'}\n onClick={() => setShowFacetFilter(value => !value)}\n startIcon={\n <IconSvg\n icon={showFacetFilter ? 'close' : 'filter'}\n wrap={false}\n />\n }\n sx={FILTER_TOGGLE_BUTTON_SX}\n >\n {showFacetFilter ? 'Hide' : 'Show'} filters\n </Button>\n )}\n {showQueryBuilderControl && onToggleQueryBuilder && (\n <Button\n variant={'text'}\n onClick={onToggleQueryBuilder}\n startIcon={\n <IconSvg\n icon={showQueryBuilder ? 'close' : 'filter'}\n wrap={false}\n />\n }\n sx={FILTER_TOGGLE_BUTTON_SX}\n >\n {showQueryBuilder ? 'Hide' : 'Show'} Query Builder\n </Button>\n )}\n </div>\n <div className=\"TopLevelControls__actions\">\n {showExportToAnalysisPlatformButton && (\n <>\n <Tooltip\n title={\n <>\n This action will send a reference to{' '}\n {hasSelectedRows\n ? 'each selected file'\n : 'every file in the current table'}{' '}\n to a chosen external analysis platform.{' '}\n {!hasSelectedRows && showFacetFilter && (\n <>\n You can change what is sent by applying filters using\n the controls in the sidebar.\n </>\n )}\n {hasSelectedRows && (\n <>\n You can change what is sent by selecting a different set\n of files.\n </>\n )}\n </>\n }\n >\n <Button\n variant=\"text\"\n disabled={!numberOfResultsToInvokeAction}\n onClick={() => {\n return isAuthenticated\n ? setIsShowingExportToAnalysisPlatformModal(true)\n : setShowLoginModal(true)\n }}\n id={SEND_TO_ANALYSIS_PLATFORM_BUTTON_ID}\n >\n Send {numberOfResultsToInvokeActionAsText} to Analysis\n Platform\n </Button>\n </Tooltip>\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\n </>\n )}\n {showLoginModal && (\n <SignInRequiredModal\n onHide={() => setShowLoginModal(false)}\n content={SEND_TO_ANALYSIS_PLATFORM_SIGN_IN_MESSAGE}\n />\n )}\n {!hideSearchBarControl && (\n <ElementWithTooltip\n tooltipText={'Show / Hide Search Bar'}\n callbackFn={() => setShowSearchBar(value => !value)}\n darkTheme={true}\n icon={'search'}\n />\n )}\n {showCopyToClipboard && (\n <ElementWithTooltip\n tooltipText={\n hasRecentlyCopiedToClipboard\n ? 'Copied to clipboard'\n : 'Copy this search to the clipboard'\n }\n callbackFn={() => {\n copyStringToClipboard(window.location.href).then(() => {\n setHasRecentlyCopiedToClipboard(true)\n setTimeout(() => {\n setHasRecentlyCopiedToClipboard(false)\n }, 3000)\n })\n }}\n darkTheme={true}\n icon={'clipboard'}\n />\n )}\n {!hideVisualizationsControl && (\n <ElementWithTooltip\n tooltipText={'Show / Hide Visualizations'}\n callbackFn={() => setShowPlots(value => !value)}\n darkTheme={true}\n icon={'chart'}\n />\n )}\n {!hideDownload && (\n <DownloadOptions\n darkTheme={true}\n onDownloadFiles={() => setShowDownloadConfirmation(true)}\n hideAddToDownloadListMenuItem={hideAddToDownloadListMenuItem}\n hideProgrammaticOptionsMenuItem={hideProgrammaticOptionsMenuItem}\n />\n )}\n\n {!hideSqlEditorControl && (\n <ElementWithTooltip\n tooltipText={'Show / Hide the Advanced Query Editor'}\n callbackFn={() => setShowSqlEditor(value => !value)}\n darkTheme={true}\n icon={SQL_EDITOR}\n />\n )}\n\n {isRowSelectionVisible && (\n <RowSelectionControls\n customControls={customControls}\n remount={remount}\n />\n )}\n {!isRowSelectionVisible &&\n customControls &&\n customControls.length > 0 && (\n <>\n {customControls.map(customControl => {\n return (\n <CustomControlButton\n key={customControl.buttonText}\n variant=\"text\"\n callbackData={{\n tableId: entityId!,\n queryMetadata: queryMetadata,\n selectedRows,\n refresh: () => {\n if (remount) {\n remount()\n }\n },\n request: getCurrentQueryRequest(),\n }}\n control={customControl}\n startIcon={customControl.icon}\n />\n )\n })}\n </>\n )}\n {showColumnSelection && (\n <ColumnSelection\n headers={queryMetadata?.selectColumns}\n isColumnSelected={columnsToShowInTable}\n toggleColumnSelection={toggleColumnSelection}\n darkTheme={true}\n />\n )}\n <ExportToAnalysisPlatformDialog\n platformInstructionProps={{\n cavaticaConnectAccountURL: cavaticaConnectAccountURL,\n }}\n />\n </div>\n </div>\n </div>\n )\n}\n\nexport default TopLevelControls\n"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * Lists the requester's active eDUC signatures (routed / signed but not yet submitted).
3
3
  *
4
- * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`
5
- * because filtering is done client-side pending PLFM-9907 (which will add an `isEDuc` server-side
6
- * filter). Once server-side filtering ships, callers can switch back to a per-page infinite query
7
- * with a "Show More" button.
4
+ * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`,
5
+ * pushing the `isEDuc: true` filter to the server so the walk skips non-eDUC requests. Status is
6
+ * still filtered client-side because the list endpoint has no server-side status filter.
8
7
  *
9
8
  * Renders nothing when the fully-loaded, filtered list is empty.
10
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"InFlightEDucSignaturesTable.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"names":[],"mappings":"AA8IA;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,mDA8J1C"}
1
+ {"version":3,"file":"InFlightEDucSignaturesTable.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"names":[],"mappings":"AA8IA;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,mDA6J1C"}
@@ -104,7 +104,7 @@ function F(e) {
104
104
  ];
105
105
  }
106
106
  function I() {
107
- let { data: c, isLoading: l, error: u } = n(), [S, D] = p(), [O, M] = p(), { data: N, isFetching: P, error: I } = t(S ?? "", {
107
+ let { data: c, isLoading: l, error: u } = n({ isEDuc: !0 }), [S, D] = p(), [O, M] = p(), { data: N, isFetching: P, error: I } = t(S ?? "", {
108
108
  enabled: !!S,
109
109
  staleTime: Infinity
110
110
  });
@@ -124,7 +124,7 @@ function I() {
124
124
  },
125
125
  onCancel: (e) => M(e),
126
126
  modifyLoadingArId: z
127
- }), [z]), V = f(() => (c ?? []).filter((e) => e.isEDuc === !0 && e.status !== void 0 && j.includes(e.status)), [c]), H = A({
127
+ }), [z]), V = f(() => (c ?? []).filter((e) => e.status !== void 0 && j.includes(e.status)), [c]), H = A({
128
128
  data: V,
129
129
  columns: B,
130
130
  getCoreRowModel: k(),
@@ -1 +1 @@
1
- {"version":3,"file":"InFlightEDucSignaturesTable.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"sourcesContent":["import AccessRequirementList, {\n RequestDataStep,\n} from '@/components/AccessRequirementList/AccessRequirementList'\nimport { SkeletonTable } from '@/components/Skeleton'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport {\n useListAllUserDataAccessRequests,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Link as MuiLink,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessRequestSummary,\n AccessRequestSummaryStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link as RouterLink } from 'react-router'\nimport {\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n} from './RouteConstants'\n\nconst IN_FLIGHT_STATUSES: readonly AccessRequestSummaryStatusEnum[] = [\n 'sent',\n 'delivered',\n 'completed',\n] as const\n\nconst STATUS_DISPLAY: Record<string, string> = {\n sent: 'Signatures pending',\n delivered: 'Signatures pending',\n completed: 'Ready to submit',\n}\n\nconst signatureDeepLink = (requestId: string) =>\n `/${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/${requestId}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`\n\nconst columnHelper = createColumnHelper<AccessRequestSummary>()\n\ntype ActionCallbacks = {\n onModify: (summary: AccessRequestSummary) => void\n onCancel: (summary: AccessRequestSummary) => void\n modifyLoadingArId: string | undefined\n}\n\nfunction buildColumns(actions: ActionCallbacks) {\n return [\n columnHelper.accessor('accessRequirementName', {\n header: props => <ColumnHeader {...props} title={'Request type'} />,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'signatureProgress',\n header: props => <ColumnHeader {...props} title={'Signature progress'} />,\n enableSorting: false,\n cell: ctx => {\n const acquired = ctx.row.original.signaturesAcquired ?? 0\n const requested = ctx.row.original.signaturesRequested ?? 0\n return `${acquired} of ${requested}`\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('status', {\n header: props => <ColumnHeader {...props} title={'Current status'} />,\n enableSorting: false,\n cell: ctx => {\n const status = ctx.getValue()\n return status ? (STATUS_DISPLAY[status] ?? status) : ''\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n enableSorting: false,\n enableColumnFilter: false,\n cell: ctx => {\n const summary = ctx.row.original\n const requestId = summary.requestId\n if (!requestId) return null\n const isModifyLoading =\n actions.modifyLoadingArId !== undefined &&\n actions.modifyLoadingArId === summary.accessRequirementId\n return (\n <Stack\n direction={'column'}\n sx={{ alignItems: 'flex-start', gap: 0.5 }}\n >\n <MuiLink component={RouterLink} to={signatureDeepLink(requestId)}>\n Review Signatures and Submit\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onModify(summary)}\n disabled={\n !summary.accessRequirementId ||\n actions.modifyLoadingArId !== undefined\n }\n sx={{ textAlign: 'left' }}\n >\n {isModifyLoading ? 'Loading…' : 'Modify Request'}\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onCancel(summary)}\n sx={{ textAlign: 'left' }}\n >\n Cancel Request\n </MuiLink>\n </Stack>\n )\n },\n size: 220,\n }),\n ]\n}\n\n/**\n * Lists the requester's active eDUC signatures (routed / signed but not yet submitted).\n *\n * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`\n * because filtering is done client-side pending PLFM-9907 (which will add an `isEDuc` server-side\n * filter). Once server-side filtering ships, callers can switch back to a per-page infinite query\n * with a \"Show More\" button.\n *\n * Renders nothing when the fully-loaded, filtered list is empty.\n */\nexport function InFlightEDucSignaturesTable() {\n const {\n data: summaries,\n isLoading,\n error,\n } = useListAllUserDataAccessRequests()\n\n const [modifyingArId, setModifyingArId] = useState<string | undefined>()\n const [cancellingSummary, setCancellingSummary] = useState<\n AccessRequestSummary | undefined\n >()\n\n const {\n data: modifyAccessRequirement,\n isFetching: isFetchingModifyAr,\n error: modifyArError,\n } = useGetAccessRequirements<ManagedACTAccessRequirement>(\n modifyingArId ?? '',\n { enabled: Boolean(modifyingArId), staleTime: Infinity },\n )\n\n // Bail out of the Modify flow if the AR fetch fails so the user isn't stuck on a disabled button.\n useEffect(() => {\n if (modifyArError && modifyingArId) {\n displayToast(\n `Sorry, we couldn't load your request. ${modifyArError.reason ?? ''}`.trim(),\n 'danger',\n )\n setModifyingArId(undefined)\n }\n }, [modifyArError, modifyingArId])\n\n const { mutate: voidSignature, isPending: isVoiding } =\n useVoidDataAccessRequestSignature({\n onSuccess: () => {\n displayToast('Your access request has been cancelled.', 'success')\n setCancellingSummary(undefined)\n },\n onError: e => {\n displayToast(\n `Sorry, we couldn't cancel your request. ${e.reason ?? ''}`.trim(),\n 'danger',\n )\n },\n })\n\n const modifyLoadingArId = isFetchingModifyAr ? modifyingArId : undefined\n\n const columns = useMemo(\n () =>\n buildColumns({\n onModify: summary => {\n if (summary.accessRequirementId) {\n setModifyingArId(summary.accessRequirementId)\n }\n },\n onCancel: summary => setCancellingSummary(summary),\n modifyLoadingArId,\n }),\n [modifyLoadingArId],\n )\n\n const rows = useMemo(\n () =>\n (summaries ?? []).filter(\n summary =>\n summary.isEDuc === true &&\n summary.status !== undefined &&\n (IN_FLIGHT_STATUSES as readonly string[]).includes(summary.status),\n ),\n [summaries],\n )\n\n const table = useReactTable({\n data: rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n if (error) {\n return (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn&apos;t load your in-flight eDUC signatures.\n </strong>\n <br />\n {error.reason}\n </Alert>\n )\n }\n\n if (isLoading) {\n return <SkeletonTable numCols={columns.length} fullWidthCells />\n }\n\n if (rows.length === 0) {\n return null\n }\n\n return (\n <Box>\n <Stack sx={{ gap: 2 }}>\n <Typography variant=\"headline1\" gutterBottom>\n In-flight eDUC signatures\n </Typography>\n <StyledTanStackTable table={table} fullWidth={true} />\n </Stack>\n {modifyAccessRequirement && (\n <AccessRequirementList\n renderAsModal\n onHide={() => setModifyingArId(undefined)}\n initialWizardEntry={{\n step: RequestDataStep.UPDATE_RESEARCH_PROJECT,\n managedACTAccessRequirement: modifyAccessRequirement,\n }}\n />\n )}\n <Dialog\n open={Boolean(cancellingSummary)}\n onClose={() => setCancellingSummary(undefined)}\n >\n <DialogTitle>Cancel request?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Cancelling this request will void the electronic signature envelope\n for{' '}\n <strong>\n {cancellingSummary?.accessRequirementName ?? 'this request'}\n </strong>\n . Any signatures already collected will be discarded. You can start\n a new request at any time. This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant={'outlined'}\n onClick={() => setCancellingSummary(undefined)}\n disabled={isVoiding}\n >\n Keep Request\n </Button>\n <Button\n variant={'contained'}\n color={'error'}\n loading={isVoiding}\n onClick={() => {\n if (cancellingSummary?.requestId) {\n voidSignature(cancellingSummary.requestId)\n }\n }}\n >\n Cancel Request\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InFlightEDucSignaturesTable.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.tsx"],"sourcesContent":["import AccessRequirementList, {\n RequestDataStep,\n} from '@/components/AccessRequirementList/AccessRequirementList'\nimport { SkeletonTable } from '@/components/Skeleton'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport {\n useListAllUserDataAccessRequests,\n useVoidDataAccessRequestSignature,\n} from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Link as MuiLink,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessRequestSummary,\n AccessRequestSummaryStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link as RouterLink } from 'react-router'\nimport {\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n} from './RouteConstants'\n\nconst IN_FLIGHT_STATUSES: readonly AccessRequestSummaryStatusEnum[] = [\n 'sent',\n 'delivered',\n 'completed',\n] as const\n\nconst STATUS_DISPLAY: Record<string, string> = {\n sent: 'Signatures pending',\n delivered: 'Signatures pending',\n completed: 'Ready to submit',\n}\n\nconst signatureDeepLink = (requestId: string) =>\n `/${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/${requestId}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`\n\nconst columnHelper = createColumnHelper<AccessRequestSummary>()\n\ntype ActionCallbacks = {\n onModify: (summary: AccessRequestSummary) => void\n onCancel: (summary: AccessRequestSummary) => void\n modifyLoadingArId: string | undefined\n}\n\nfunction buildColumns(actions: ActionCallbacks) {\n return [\n columnHelper.accessor('accessRequirementName', {\n header: props => <ColumnHeader {...props} title={'Request type'} />,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'signatureProgress',\n header: props => <ColumnHeader {...props} title={'Signature progress'} />,\n enableSorting: false,\n cell: ctx => {\n const acquired = ctx.row.original.signaturesAcquired ?? 0\n const requested = ctx.row.original.signaturesRequested ?? 0\n return `${acquired} of ${requested}`\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.accessor('status', {\n header: props => <ColumnHeader {...props} title={'Current status'} />,\n enableSorting: false,\n cell: ctx => {\n const status = ctx.getValue()\n return status ? (STATUS_DISPLAY[status] ?? status) : ''\n },\n enableColumnFilter: false,\n size: 150,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n enableSorting: false,\n enableColumnFilter: false,\n cell: ctx => {\n const summary = ctx.row.original\n const requestId = summary.requestId\n if (!requestId) return null\n const isModifyLoading =\n actions.modifyLoadingArId !== undefined &&\n actions.modifyLoadingArId === summary.accessRequirementId\n return (\n <Stack\n direction={'column'}\n sx={{ alignItems: 'flex-start', gap: 0.5 }}\n >\n <MuiLink component={RouterLink} to={signatureDeepLink(requestId)}>\n Review Signatures and Submit\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onModify(summary)}\n disabled={\n !summary.accessRequirementId ||\n actions.modifyLoadingArId !== undefined\n }\n sx={{ textAlign: 'left' }}\n >\n {isModifyLoading ? 'Loading…' : 'Modify Request'}\n </MuiLink>\n <MuiLink\n component={'button'}\n type={'button'}\n onClick={() => actions.onCancel(summary)}\n sx={{ textAlign: 'left' }}\n >\n Cancel Request\n </MuiLink>\n </Stack>\n )\n },\n size: 220,\n }),\n ]\n}\n\n/**\n * Lists the requester's active eDUC signatures (routed / signed but not yet submitted).\n *\n * The underlying query walks every page of `POST /dataAccessRequest/list` inside its `queryFn`,\n * pushing the `isEDuc: true` filter to the server so the walk skips non-eDUC requests. Status is\n * still filtered client-side because the list endpoint has no server-side status filter.\n *\n * Renders nothing when the fully-loaded, filtered list is empty.\n */\nexport function InFlightEDucSignaturesTable() {\n const {\n data: summaries,\n isLoading,\n error,\n } = useListAllUserDataAccessRequests({ isEDuc: true })\n\n const [modifyingArId, setModifyingArId] = useState<string | undefined>()\n const [cancellingSummary, setCancellingSummary] = useState<\n AccessRequestSummary | undefined\n >()\n\n const {\n data: modifyAccessRequirement,\n isFetching: isFetchingModifyAr,\n error: modifyArError,\n } = useGetAccessRequirements<ManagedACTAccessRequirement>(\n modifyingArId ?? '',\n { enabled: Boolean(modifyingArId), staleTime: Infinity },\n )\n\n // Bail out of the Modify flow if the AR fetch fails so the user isn't stuck on a disabled button.\n useEffect(() => {\n if (modifyArError && modifyingArId) {\n displayToast(\n `Sorry, we couldn't load your request. ${modifyArError.reason ?? ''}`.trim(),\n 'danger',\n )\n setModifyingArId(undefined)\n }\n }, [modifyArError, modifyingArId])\n\n const { mutate: voidSignature, isPending: isVoiding } =\n useVoidDataAccessRequestSignature({\n onSuccess: () => {\n displayToast('Your access request has been cancelled.', 'success')\n setCancellingSummary(undefined)\n },\n onError: e => {\n displayToast(\n `Sorry, we couldn't cancel your request. ${e.reason ?? ''}`.trim(),\n 'danger',\n )\n },\n })\n\n const modifyLoadingArId = isFetchingModifyAr ? modifyingArId : undefined\n\n const columns = useMemo(\n () =>\n buildColumns({\n onModify: summary => {\n if (summary.accessRequirementId) {\n setModifyingArId(summary.accessRequirementId)\n }\n },\n onCancel: summary => setCancellingSummary(summary),\n modifyLoadingArId,\n }),\n [modifyLoadingArId],\n )\n\n const rows = useMemo(\n () =>\n (summaries ?? []).filter(\n summary =>\n summary.status !== undefined &&\n (IN_FLIGHT_STATUSES as readonly string[]).includes(summary.status),\n ),\n [summaries],\n )\n\n const table = useReactTable({\n data: rows,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n })\n\n if (error) {\n return (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn&apos;t load your in-flight eDUC signatures.\n </strong>\n <br />\n {error.reason}\n </Alert>\n )\n }\n\n if (isLoading) {\n return <SkeletonTable numCols={columns.length} fullWidthCells />\n }\n\n if (rows.length === 0) {\n return null\n }\n\n return (\n <Box>\n <Stack sx={{ gap: 2 }}>\n <Typography variant=\"headline1\" gutterBottom>\n In-flight eDUC signatures\n </Typography>\n <StyledTanStackTable table={table} fullWidth={true} />\n </Stack>\n {modifyAccessRequirement && (\n <AccessRequirementList\n renderAsModal\n onHide={() => setModifyingArId(undefined)}\n initialWizardEntry={{\n step: RequestDataStep.UPDATE_RESEARCH_PROJECT,\n managedACTAccessRequirement: modifyAccessRequirement,\n }}\n />\n )}\n <Dialog\n open={Boolean(cancellingSummary)}\n onClose={() => setCancellingSummary(undefined)}\n >\n <DialogTitle>Cancel request?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Cancelling this request will void the electronic signature envelope\n for{' '}\n <strong>\n {cancellingSummary?.accessRequirementName ?? 'this request'}\n </strong>\n . Any signatures already collected will be discarded. You can start\n a new request at any time. This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant={'outlined'}\n onClick={() => setCancellingSummary(undefined)}\n disabled={isVoiding}\n >\n Keep Request\n </Button>\n <Button\n variant={'contained'}\n color={'error'}\n loading={isVoiding}\n onClick={() => {\n if (cancellingSummary?.requestId) {\n voidSignature(cancellingSummary.requestId)\n }\n }}\n >\n Cancel Request\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )\n}\n"],"mappings":"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"}
@@ -22,7 +22,7 @@ function D() {
22
22
  }) : /* @__PURE__ */ g(v, { to: "/" });
23
23
  }
24
24
  function O() {
25
- let { requestId: e } = T(), a = w(), { data: o, isLoading: s } = n(), c = o?.find((t) => t.requestId === e), l = c?.accessRequirementId, { data: u, isLoading: d } = t(l ?? "", {
25
+ let { requestId: e } = T(), a = w(), { data: o, isLoading: s } = n({ isEDuc: !0 }), c = o?.find((t) => t.requestId === e), l = c?.accessRequirementId, { data: u, isLoading: d } = t(l ?? "", {
26
26
  enabled: !!l,
27
27
  staleTime: Infinity
28
28
  });
@@ -1 +1 @@
1
- {"version":3,"file":"UserAccessRequestHistoryPlace.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.tsx"],"sourcesContent":["import {\n BreadcrumbItem,\n Breadcrumbs,\n} from '@/components/Breadcrumbs/Breadcrumbs'\nimport { useListAllUserDataAccessRequests } from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport { AuthenticationGuard } from '@/utils/AppUtils'\nimport { Box } from '@mui/material'\nimport { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types'\nimport { useMemo } from 'react'\nimport {\n createBrowserRouter,\n createMemoryRouter,\n Navigate,\n Outlet,\n RouteObject,\n RouterProvider,\n useLocation,\n useNavigate,\n useParams,\n} from 'react-router'\nimport { RouterProvider as DOMRouterProvider } from 'react-router/dom'\nimport AccessRequirementList, {\n RequestDataStep,\n} from '../../AccessRequirementList/AccessRequirementList'\nimport SubmissionPage from '../SubmissionPage/SubmissionPage'\nimport {\n REQUEST_ID_PARAM,\n SUBMISSION_ID_PARAM,\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n USER_ACCESS_HISTORY_SUBMISSION_SUBPATH,\n} from './RouteConstants'\nimport { UserAccessRequestHistoryPage } from './UserAccessRequestHistoryPage'\n\ntype ReviewerDashboardProps = {\n /** Used to determine the base path for the component. Default is RequestHistory:default */\n routerBaseName?: string\n /** If true use a MemoryRouter, which prevents the browser URL from updating. For demo/test purposes only. */\n useMemoryRouter?: boolean\n}\n\nfunction UserSubmissionPageRouteRenderer() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n if (!submissionId) {\n return <Navigate to=\"/\" />\n }\n return <SubmissionPage submissionId={submissionId} isReviewer={false} />\n}\n\n/**\n * Deep-link route element for `/request/:requestId/signature`. Rendered inside\n * `UserAccessRequestHistoryPage`'s `<Outlet />` so the page stays mounted while the dialog is open.\n * Looks up the request in the user's own access-request list, then mounts the signature-status\n * wizard step for the AR. Requests that don't belong to the user (or don't exist) redirect back\n * to the history index. The surrounding `AuthenticationGuard` handles unauthenticated visitors.\n */\nfunction RequestSignatureRouteRenderer() {\n const { requestId } = useParams<{ [REQUEST_ID_PARAM]: string }>()\n const navigate = useNavigate()\n\n const { data: summaries, isLoading: isLoadingSummaries } =\n useListAllUserDataAccessRequests()\n const summary = summaries?.find(s => s.requestId === requestId)\n const accessRequirementId = summary?.accessRequirementId\n\n const { data: accessRequirement, isLoading: isLoadingAr } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n accessRequirementId ?? '',\n { enabled: Boolean(accessRequirementId), staleTime: Infinity },\n )\n\n // Wait for the summary + AR to load before mounting the dialog. `UserAccessRequestHistoryPage`\n // renders its own skeletons in the meantime, so no visible spinner is needed here.\n if (isLoadingSummaries || (accessRequirementId && isLoadingAr)) {\n return null\n }\n\n // Summary not found in the user's own requests, or its access requirement failed to load.\n if (!summary || !accessRequirementId || !accessRequirement) {\n return <Navigate to=\"/\" replace />\n }\n\n return (\n <AccessRequirementList\n renderAsModal\n onHide={() => {\n void navigate('/')\n }}\n initialWizardEntry={{\n step: RequestDataStep.SIGNATURE_STATUS,\n managedACTAccessRequirement: accessRequirement,\n }}\n />\n )\n}\n\n/**\n * Layout for UserAccessRequestHistory pages. Includes header with title.\n * @constructor\n */\nfunction UserAccessRequestHistoryPageLayout() {\n return (\n <>\n <div className=\"pageHeader\">\n <div className=\"grid\">\n <h3 className=\"pageHeaderTitle\">Access Requests</h3>\n </div>\n </div>\n <Box sx={{ px: 5, py: 3 }}>\n <Outlet />\n </Box>\n </>\n )\n}\n\n/**\n * Breadcrumb layout for UserAccessRequestHistory pages. Displays breadcrumbs for navigation.\n */\nfunction UserAccessRequestHistoryBreadcrumbLayout() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n const location = useLocation()\n\n const breadcrumbItems: BreadcrumbItem[] = [\n {\n text: 'Access Request History',\n to: '/',\n current: location.pathname === '/',\n },\n ]\n if (submissionId) {\n const submissionPath = `/${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}/${submissionId}`\n breadcrumbItems.push({\n text: `Request #${submissionId}`,\n to: submissionPath,\n current: location.pathname === submissionPath,\n })\n }\n\n return (\n <>\n <Breadcrumbs\n items={breadcrumbItems}\n sx={{\n mt: 2,\n mb: 4,\n ['& .MuiLink-root']: {\n color: 'text.secondary',\n letterSpacing: 0,\n '&:visited': {\n color: 'text.secondary',\n },\n },\n '& .MuiSvgIcon-root': {\n color: 'grey.500',\n },\n }}\n />\n <Outlet />\n </>\n )\n}\n\nconst routes: RouteObject[] = [\n {\n element: <UserAccessRequestHistoryPageLayout />,\n children: [\n {\n path: '/',\n children: [\n {\n // Keep the history page mounted across the index ↔ signature-deep-link transition.\n element: <UserAccessRequestHistoryPage />,\n children: [\n { index: true, element: null },\n {\n path: `${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/:${REQUEST_ID_PARAM}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`,\n element: (\n <AuthenticationGuard>\n <RequestSignatureRouteRenderer />\n </AuthenticationGuard>\n ),\n },\n ],\n },\n {\n // Do not display the breadcrumbs on the `index` page\n element: <UserAccessRequestHistoryBreadcrumbLayout />,\n children: [\n {\n path: `${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}`,\n children: [\n {\n path: `:${SUBMISSION_ID_PARAM}`,\n element: <UserSubmissionPageRouteRenderer />,\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n]\n\n/**\n * Component that renders User Access Request history table & submission page. Handles routing internally.\n */\nexport function UserAccessRequestHistoryPlace(props: ReviewerDashboardProps) {\n const {\n routerBaseName = '/RequestHistory:default',\n useMemoryRouter = false,\n } = props\n\n const router = useMemo(() => {\n if (useMemoryRouter) {\n return createMemoryRouter(routes, {\n basename: routerBaseName,\n })\n } else {\n return createBrowserRouter(routes, {\n basename: routerBaseName,\n })\n }\n }, [useMemoryRouter, routerBaseName])\n\n if (useMemoryRouter) {\n return <RouterProvider router={router} />\n }\n\n return <DOMRouterProvider router={router} />\n}\n\nexport default UserAccessRequestHistoryPlace\n"],"mappings":"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"}
1
+ {"version":3,"file":"UserAccessRequestHistoryPlace.js","names":[],"sources":["../../../../src/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.tsx"],"sourcesContent":["import {\n BreadcrumbItem,\n Breadcrumbs,\n} from '@/components/Breadcrumbs/Breadcrumbs'\nimport { useListAllUserDataAccessRequests } from '@/synapse-queries'\nimport { useGetAccessRequirements } from '@/synapse-queries/dataaccess/useAccessRequirements'\nimport { AuthenticationGuard } from '@/utils/AppUtils'\nimport { Box } from '@mui/material'\nimport { ManagedACTAccessRequirement } from '@sage-bionetworks/synapse-types'\nimport { useMemo } from 'react'\nimport {\n createBrowserRouter,\n createMemoryRouter,\n Navigate,\n Outlet,\n RouteObject,\n RouterProvider,\n useLocation,\n useNavigate,\n useParams,\n} from 'react-router'\nimport { RouterProvider as DOMRouterProvider } from 'react-router/dom'\nimport AccessRequirementList, {\n RequestDataStep,\n} from '../../AccessRequirementList/AccessRequirementList'\nimport SubmissionPage from '../SubmissionPage/SubmissionPage'\nimport {\n REQUEST_ID_PARAM,\n SUBMISSION_ID_PARAM,\n USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH,\n USER_ACCESS_HISTORY_REQUEST_SUBPATH,\n USER_ACCESS_HISTORY_SUBMISSION_SUBPATH,\n} from './RouteConstants'\nimport { UserAccessRequestHistoryPage } from './UserAccessRequestHistoryPage'\n\ntype ReviewerDashboardProps = {\n /** Used to determine the base path for the component. Default is RequestHistory:default */\n routerBaseName?: string\n /** If true use a MemoryRouter, which prevents the browser URL from updating. For demo/test purposes only. */\n useMemoryRouter?: boolean\n}\n\nfunction UserSubmissionPageRouteRenderer() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n if (!submissionId) {\n return <Navigate to=\"/\" />\n }\n return <SubmissionPage submissionId={submissionId} isReviewer={false} />\n}\n\n/**\n * Deep-link route element for `/request/:requestId/signature`. Rendered inside\n * `UserAccessRequestHistoryPage`'s `<Outlet />` so the page stays mounted while the dialog is open.\n * Looks up the request in the user's own access-request list, then mounts the signature-status\n * wizard step for the AR. Requests that don't belong to the user (or don't exist) redirect back\n * to the history index. The surrounding `AuthenticationGuard` handles unauthenticated visitors.\n */\nfunction RequestSignatureRouteRenderer() {\n const { requestId } = useParams<{ [REQUEST_ID_PARAM]: string }>()\n const navigate = useNavigate()\n\n const { data: summaries, isLoading: isLoadingSummaries } =\n useListAllUserDataAccessRequests({ isEDuc: true })\n const summary = summaries?.find(s => s.requestId === requestId)\n const accessRequirementId = summary?.accessRequirementId\n\n const { data: accessRequirement, isLoading: isLoadingAr } =\n useGetAccessRequirements<ManagedACTAccessRequirement>(\n accessRequirementId ?? '',\n { enabled: Boolean(accessRequirementId), staleTime: Infinity },\n )\n\n // Wait for the summary + AR to load before mounting the dialog. `UserAccessRequestHistoryPage`\n // renders its own skeletons in the meantime, so no visible spinner is needed here.\n if (isLoadingSummaries || (accessRequirementId && isLoadingAr)) {\n return null\n }\n\n // Summary not found in the user's own requests, or its access requirement failed to load.\n if (!summary || !accessRequirementId || !accessRequirement) {\n return <Navigate to=\"/\" replace />\n }\n\n return (\n <AccessRequirementList\n renderAsModal\n onHide={() => {\n void navigate('/')\n }}\n initialWizardEntry={{\n step: RequestDataStep.SIGNATURE_STATUS,\n managedACTAccessRequirement: accessRequirement,\n }}\n />\n )\n}\n\n/**\n * Layout for UserAccessRequestHistory pages. Includes header with title.\n * @constructor\n */\nfunction UserAccessRequestHistoryPageLayout() {\n return (\n <>\n <div className=\"pageHeader\">\n <div className=\"grid\">\n <h3 className=\"pageHeaderTitle\">Access Requests</h3>\n </div>\n </div>\n <Box sx={{ px: 5, py: 3 }}>\n <Outlet />\n </Box>\n </>\n )\n}\n\n/**\n * Breadcrumb layout for UserAccessRequestHistory pages. Displays breadcrumbs for navigation.\n */\nfunction UserAccessRequestHistoryBreadcrumbLayout() {\n const { submissionId } = useParams<{ [SUBMISSION_ID_PARAM]: string }>()\n const location = useLocation()\n\n const breadcrumbItems: BreadcrumbItem[] = [\n {\n text: 'Access Request History',\n to: '/',\n current: location.pathname === '/',\n },\n ]\n if (submissionId) {\n const submissionPath = `/${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}/${submissionId}`\n breadcrumbItems.push({\n text: `Request #${submissionId}`,\n to: submissionPath,\n current: location.pathname === submissionPath,\n })\n }\n\n return (\n <>\n <Breadcrumbs\n items={breadcrumbItems}\n sx={{\n mt: 2,\n mb: 4,\n ['& .MuiLink-root']: {\n color: 'text.secondary',\n letterSpacing: 0,\n '&:visited': {\n color: 'text.secondary',\n },\n },\n '& .MuiSvgIcon-root': {\n color: 'grey.500',\n },\n }}\n />\n <Outlet />\n </>\n )\n}\n\nconst routes: RouteObject[] = [\n {\n element: <UserAccessRequestHistoryPageLayout />,\n children: [\n {\n path: '/',\n children: [\n {\n // Keep the history page mounted across the index ↔ signature-deep-link transition.\n element: <UserAccessRequestHistoryPage />,\n children: [\n { index: true, element: null },\n {\n path: `${USER_ACCESS_HISTORY_REQUEST_SUBPATH}/:${REQUEST_ID_PARAM}/${USER_ACCESS_HISTORY_REQUEST_SIGNATURE_SUBPATH}`,\n element: (\n <AuthenticationGuard>\n <RequestSignatureRouteRenderer />\n </AuthenticationGuard>\n ),\n },\n ],\n },\n {\n // Do not display the breadcrumbs on the `index` page\n element: <UserAccessRequestHistoryBreadcrumbLayout />,\n children: [\n {\n path: `${USER_ACCESS_HISTORY_SUBMISSION_SUBPATH}`,\n children: [\n {\n path: `:${SUBMISSION_ID_PARAM}`,\n element: <UserSubmissionPageRouteRenderer />,\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n]\n\n/**\n * Component that renders User Access Request history table & submission page. Handles routing internally.\n */\nexport function UserAccessRequestHistoryPlace(props: ReviewerDashboardProps) {\n const {\n routerBaseName = '/RequestHistory:default',\n useMemoryRouter = false,\n } = props\n\n const router = useMemo(() => {\n if (useMemoryRouter) {\n return createMemoryRouter(routes, {\n basename: routerBaseName,\n })\n } else {\n return createBrowserRouter(routes, {\n basename: routerBaseName,\n })\n }\n }, [useMemoryRouter, routerBaseName])\n\n if (useMemoryRouter) {\n return <RouterProvider router={router} />\n }\n\n return <DOMRouterProvider router={router} />\n}\n\nexport default UserAccessRequestHistoryPlace\n"],"mappings":";;;;;;;;;;;;;;;;AA0CA,SAAS,IAAkC;CACzC,IAAM,EAAE,oBAAiB,EAA6C;CAItE,OAHK,IAGE,kBAAC,GAAD;EAA8B;EAAc,YAAY;CAAQ,CAAA,IAF9D,kBAAC,GAAD,EAAU,IAAG,IAAK,CAAA;AAG7B;AASA,SAAS,IAAgC;CACvC,IAAM,EAAE,iBAAc,EAA0C,GAC1D,IAAW,EAAY,GAEvB,EAAE,MAAM,GAAW,WAAW,MAClC,EAAiC,EAAE,QAAQ,GAAK,CAAC,GAC7C,IAAU,GAAW,MAAK,MAAK,EAAE,cAAc,CAAS,GACxD,IAAsB,GAAS,qBAE/B,EAAE,MAAM,GAAmB,WAAW,MAC1C,EACE,KAAuB,IACvB;EAAE,SAAS,EAAQ;EAAsB,WAAW;CAAS,CAC/D;CAaF,OATI,KAAuB,KAAuB,IACzC,OAIL,CAAC,KAAW,CAAC,KAAuB,CAAC,IAChC,kBAAC,GAAD;EAAU,IAAG;EAAI,SAAA;CAAS,CAAA,IAIjC,kBAAC,GAAD;EACE,eAAA;EACA,cAAc;GACZ,EAAc,GAAG;EACnB;EACA,oBAAoB;GAClB,MAAM,EAAgB;GACtB,6BAA6B;EAC/B;CACD,CAAA;AAEL;AAMA,SAAS,IAAqC;CAC5C,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,MAAD;IAAI,WAAU;cAAkB;GAAmB,CAAA;EAChD,CAAA;CACF,CAAA,GACL,kBAAC,GAAD;EAAK,IAAI;GAAE,IAAI;GAAG,IAAI;EAAE;YACtB,kBAAC,GAAD,CAAS,CAAA;CACN,CAAA,CACL,EAAA,CAAA;AAEN;AAKA,SAAS,IAA2C;CAClD,IAAM,EAAE,oBAAiB,EAA6C,GAChE,IAAW,EAAY,GAEvB,IAAoC,CACxC;EACE,MAAM;EACN,IAAI;EACJ,SAAS,EAAS,aAAa;CACjC,CACF;CACA,IAAI,GAAc;EAChB,IAAM,IAAiB,IAAI,EAAuC,GAAG;EACrE,EAAgB,KAAK;GACnB,MAAM,YAAY;GAClB,IAAI;GACJ,SAAS,EAAS,aAAa;EACjC,CAAC;CACH;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,OAAO;EACP,IAAI;GACF,IAAI;GACJ,IAAI;GACH,mBAAoB;IACnB,OAAO;IACP,eAAe;IACf,aAAa,EACX,OAAO,iBACT;GACF;GACA,sBAAsB,EACpB,OAAO,WACT;EACF;CACD,CAAA,GACD,kBAAC,GAAD,CAAS,CAAA,CACT,EAAA,CAAA;AAEN;AAEA,IAAM,IAAwB,CAC5B;CACE,SAAS,kBAAC,GAAD,CAAqC,CAAA;CAC9C,UAAU,CACR;EACE,MAAM;EACN,UAAU,CACR;GAEE,SAAS,kBAAC,GAAD,CAA+B,CAAA;GACxC,UAAU,CACR;IAAE,OAAO;IAAM,SAAS;GAAK,GAC7B;IACE,MAAM,GAAG,EAAoC,IAAI,EAAiB,GAAG;IACrE,SACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,CAAgC,CAAA,EACb,CAAA;GAEzB,CACF;EACF,GACA;GAEE,SAAS,kBAAC,GAAD,CAA2C,CAAA;GACpD,UAAU,CACR;IACE,MAAM,GAAG;IACT,UAAU,CACR;KACE,MAAM,IAAI;KACV,SAAS,kBAAC,GAAD,CAAkC,CAAA;IAC7C,CACF;GACF,CACF;EACF,CACF;CACF,CACF;AACF,CACF;AAKA,SAAgB,EAA8B,GAA+B;CAC3E,IAAM,EACJ,oBAAiB,2BACjB,qBAAkB,OAChB,GAEE,IAAS,QACT,IACK,EAAmB,GAAQ,EAChC,UAAU,EACZ,CAAC,IAEM,EAAoB,GAAQ,EACjC,UAAU,EACZ,CAAC,GAEF,CAAC,GAAiB,CAAc,CAAC;CAMpC,OAHS,EADL,IACM,IAGF,GAHC,EAAwB,UAAS,CAAA;AAI5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityActionMenu.d.ts","sourceRoot":"","sources":["../../../../../src/components/entity/page/action_menu/EntityActionMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhE,OAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAqB,MAAM,4BAA4B,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAK/C,KAAK,gCAAgC,GAAG,UAAU,GAAG,SAAS,CAAA;AAE9D,KAAK,yCAAyC,GAAG;IAC/C,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAExE,MAAM,MAAM,oBAAoB,GAAG,MAAM,CACvC,gCAAgC,EAChC,yCAAyC,CAC1C,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,eAAe,EAAE,CAAA;IAChC,mBAAmB,EAAE,eAAe,EAAE,EAAE,CAAA;IACxC,kBAAkB,EAAE,eAAe,EAAE,EAAE,CAAA;IACvC,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,QAAQ,CAAA;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACvC,mBAAmB,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IAC5C,kBAAkB,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAElC,mBAAmB,EAAE,sBAAsB,CAAA;IAE3C,iBAAiB,EAAE,oBAAoB,CAAA;IAEvC,MAAM,EAAE,sBAAsB,CAAA;CAC/B,CAAA;AAMD,iBAAS,kBAAkB,CACzB,mBAAmB,EAAE,sBAAsB,EAC3C,MAAM,EAAE,sBAAsB,GAC7B,sBAAsB,CAmBxB;AAED;;;;;GAKG;AACH,iBAAS,4BAA4B,CACnC,KAAK,EAAE,eAAe,EAAE,EACxB,mBAAmB,EAAE,sBAAsB,GAC1C,gBAAgB,EAAE,CAqBpB;AAED;;;;;;GAMG;AACH,iBAAS,sBAAsB,CAC7B,WAAW,EAAE,eAAe,EAAE,EAAE,EAChC,mBAAmB,EAAE,sBAAsB,GAC1C,gBAAgB,EAAE,EAAE,CAYtB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CA6IpE;AAED,eAAO,MAAM,yBAAyB;;;;CAIrC,CAAA"}
1
+ {"version":3,"file":"EntityActionMenu.d.ts","sourceRoot":"","sources":["../../../../../src/components/entity/page/action_menu/EntityActionMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhE,OAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAqB,MAAM,4BAA4B,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAK/C,KAAK,gCAAgC,GAAG,UAAU,GAAG,SAAS,CAAA;AAE9D,KAAK,yCAAyC,GAAG;IAC/C,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAExE,MAAM,MAAM,oBAAoB,GAAG,MAAM,CACvC,gCAAgC,EAChC,yCAAyC,CAC1C,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,eAAe,EAAE,CAAA;IAChC,mBAAmB,EAAE,eAAe,EAAE,EAAE,CAAA;IACxC,kBAAkB,EAAE,eAAe,EAAE,EAAE,CAAA;IACvC,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,QAAQ,CAAA;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACvC,mBAAmB,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IAC5C,kBAAkB,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAElC,mBAAmB,EAAE,sBAAsB,CAAA;IAE3C,iBAAiB,EAAE,oBAAoB,CAAA;IAEvC,MAAM,EAAE,sBAAsB,CAAA;CAC/B,CAAA;AAMD,iBAAS,kBAAkB,CACzB,mBAAmB,EAAE,sBAAsB,EAC3C,MAAM,EAAE,sBAAsB,GAC7B,sBAAsB,CAmBxB;AAED;;;;;GAKG;AACH,iBAAS,4BAA4B,CACnC,KAAK,EAAE,eAAe,EAAE,EACxB,mBAAmB,EAAE,sBAAsB,GAC1C,gBAAgB,EAAE,CAqBpB;AAED;;;;;;GAMG;AACH,iBAAS,sBAAsB,CAC7B,WAAW,EAAE,eAAe,EAAE,EAAE,EAChC,mBAAmB,EAAE,sBAAsB,GAC1C,gBAAgB,EAAE,EAAE,CAYtB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAqJpE;AAED,eAAO,MAAM,yBAAyB;;;;CAIrC,CAAA"}
@@ -92,7 +92,9 @@ function c(o) {
92
92
  "& .MuiButton-root": {
93
93
  borderRadius: "6px",
94
94
  fontWeight: 540,
95
- padding: "10px 12px"
95
+ padding: "8px",
96
+ height: "28px",
97
+ "& svg": { fontSize: "16px" }
96
98
  },
97
99
  "& .MuiButton-outlined": {
98
100
  ...h,
@@ -110,7 +112,12 @@ function c(o) {
110
112
  textDecoration: "none"
111
113
  }
112
114
  },
113
- "& .MuiButton-root .MuiTypography-root": { fontWeight: 540 }
115
+ "& .MuiButton-root .MuiTypography-root": {
116
+ fontWeight: 540,
117
+ fontSize: "12px",
118
+ lineHeight: "12px",
119
+ letterSpacing: "-0.24px"
120
+ }
114
121
  },
115
122
  children: /* @__PURE__ */ r(t, {
116
123
  iconButtons: f,