synapse-react-client 4.0.10 → 4.0.11
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.
- package/dist/SWC.index.js +1 -1
- package/dist/assets/icons/CloudWarning.d.ts +5 -0
- package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
- package/dist/assets/icons/CloudWarning.js +47 -0
- package/dist/assets/icons/CloudWarning.js.map +1 -0
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +66 -55
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +47 -44
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
- package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
- package/dist/components/Forum/DiscussionReply.d.ts +1 -0
- package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionReply.js +19 -19
- package/dist/components/Forum/DiscussionReply.js.map +1 -1
- package/dist/components/Forum/DiscussionThread.d.ts +1 -0
- package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionThread.js +73 -72
- package/dist/components/Forum/DiscussionThread.js.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.js +7 -3
- package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +2 -1
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
- package/dist/synapse-queries/KeyFactory.d.ts +1 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +3 -0
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.d.ts +1 -0
- package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
- package/dist/synapse-queries/forum/useThread.js +19 -12
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.d.ts +1 -0
- package/dist/utils/APIConstants.d.ts.map +1 -1
- package/dist/utils/APIConstants.js +2 -2
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js +15 -4
- package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
- package/package.json +4 -4
package/dist/SWC.index.js
CHANGED
|
@@ -109,7 +109,7 @@ var x = { BackendDestinationEnum: r }, S = {
|
|
|
109
109
|
sendSearchResultsReturnedEvent: y,
|
|
110
110
|
sendSearchResultReturnedEvent: v,
|
|
111
111
|
sendSearchResultClickedEvent: _
|
|
112
|
-
}, T = "4.0.
|
|
112
|
+
}, T = "4.0.11";
|
|
113
113
|
//#endregion
|
|
114
114
|
export { w as Analytics, a as HttpClient, d as Palettes, o as SynapseClient, C as SynapseComponents, n as SynapseConstants, S as SynapseContext, x as SynapseEnums, m as SynapseQueries, T as SynapseReactClientVersion, p as SynapseSessionManager, i as xssOptions };
|
|
115
115
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudWarning.d.ts","sourceRoot":"","sources":["../../../src/assets/icons/CloudWarning.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAE7D,QAAA,MAAM,YAAY,GAAI,OAAO,YAAY,KAAG,KAAK,CAAC,SA+BjD,CAAA;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import "react";
|
|
2
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
3
|
+
import n from "@mui/material/SvgIcon";
|
|
4
|
+
//#region src/assets/icons/CloudWarning.tsx
|
|
5
|
+
var r = (r) => /* @__PURE__ */ t(n, {
|
|
6
|
+
...r,
|
|
7
|
+
viewBox: "0 0 40 40",
|
|
8
|
+
fill: "none",
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ e("rect", {
|
|
11
|
+
x: "1",
|
|
12
|
+
y: "1",
|
|
13
|
+
width: "38",
|
|
14
|
+
height: "38",
|
|
15
|
+
rx: "19",
|
|
16
|
+
stroke: "#EDC766",
|
|
17
|
+
strokeWidth: "2"
|
|
18
|
+
}),
|
|
19
|
+
/* @__PURE__ */ e("mask", {
|
|
20
|
+
id: "mask0_2400_5829",
|
|
21
|
+
style: { maskType: "alpha" },
|
|
22
|
+
maskUnits: "userSpaceOnUse",
|
|
23
|
+
x: "8",
|
|
24
|
+
y: "8",
|
|
25
|
+
width: "24",
|
|
26
|
+
height: "24",
|
|
27
|
+
children: /* @__PURE__ */ e("rect", {
|
|
28
|
+
x: "8",
|
|
29
|
+
y: "8",
|
|
30
|
+
width: "24",
|
|
31
|
+
height: "24",
|
|
32
|
+
fill: "#EDC766"
|
|
33
|
+
})
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ e("g", {
|
|
36
|
+
mask: "url(#mask0_2400_5829)",
|
|
37
|
+
children: /* @__PURE__ */ e("path", {
|
|
38
|
+
d: "M14.5 28C12.9833 28 11.6875 27.475 10.6125 26.425C9.5375 25.375 9 24.0917 9 22.575C9 21.275 9.39167 20.1167 10.175 19.1C10.9583 18.0833 11.9833 17.4333 13.25 17.15C13.6667 15.6167 14.5 14.375 15.75 13.425C17 12.475 18.4167 12 20 12C21.95 12 23.6042 12.6792 24.9625 14.0375C26.3208 15.3958 27 17.05 27 19C28.15 19.1333 29.1042 19.6292 29.8625 20.4875C30.6208 21.3458 31 22.35 31 23.5C31 24.75 30.5625 25.8125 29.6875 26.6875C28.8125 27.5625 27.75 28 26.5 28H14.5ZM14.5 26H26.5C27.2 26 27.7917 25.7583 28.275 25.275C28.7583 24.7917 29 24.2 29 23.5C29 22.8 28.7583 22.2083 28.275 21.725C27.7917 21.2417 27.2 21 26.5 21H25V19C25 17.6167 24.5125 16.4375 23.5375 15.4625C22.5625 14.4875 21.3833 14 20 14C18.6167 14 17.4375 14.4875 16.4625 15.4625C15.4875 16.4375 15 17.6167 15 19H14.5C13.5333 19 12.7083 19.3417 12.025 20.025C11.3417 20.7083 11 21.5333 11 22.5C11 23.4667 11.3417 24.2917 12.025 24.975C12.7083 25.6583 13.5333 26 14.5 26ZM20.7125 23.7125C20.9042 23.5208 21 23.2833 21 23C21 22.7167 20.9042 22.4792 20.7125 22.2875C20.5208 22.0958 20.2833 22 20 22C19.7167 22 19.4792 22.0958 19.2875 22.2875C19.0958 22.4792 19 22.7167 19 23C19 23.2833 19.0958 23.5208 19.2875 23.7125C19.4792 23.9042 19.7167 24 20 24C20.2833 24 20.5208 23.9042 20.7125 23.7125ZM19 20.5H21V16H19V20.5Z",
|
|
39
|
+
fill: "#EDC766"
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
});
|
|
44
|
+
//#endregion
|
|
45
|
+
export { r as default };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=CloudWarning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudWarning.js","names":[],"sources":["../../../src/assets/icons/CloudWarning.tsx"],"sourcesContent":["import React from 'react'\nimport SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon'\n\nconst CloudWarning = (props: SvgIconProps): React.ReactNode => {\n return (\n <SvgIcon {...props} viewBox=\"0 0 40 40\" fill=\"none\">\n <rect\n x=\"1\"\n y=\"1\"\n width=\"38\"\n height=\"38\"\n rx=\"19\"\n stroke=\"#EDC766\"\n strokeWidth=\"2\"\n />\n <mask\n id=\"mask0_2400_5829\"\n style={{ maskType: 'alpha' }}\n maskUnits=\"userSpaceOnUse\"\n x=\"8\"\n y=\"8\"\n width=\"24\"\n height=\"24\"\n >\n <rect x=\"8\" y=\"8\" width=\"24\" height=\"24\" fill=\"#EDC766\" />\n </mask>\n <g mask=\"url(#mask0_2400_5829)\">\n <path\n d=\"M14.5 28C12.9833 28 11.6875 27.475 10.6125 26.425C9.5375 25.375 9 24.0917 9 22.575C9 21.275 9.39167 20.1167 10.175 19.1C10.9583 18.0833 11.9833 17.4333 13.25 17.15C13.6667 15.6167 14.5 14.375 15.75 13.425C17 12.475 18.4167 12 20 12C21.95 12 23.6042 12.6792 24.9625 14.0375C26.3208 15.3958 27 17.05 27 19C28.15 19.1333 29.1042 19.6292 29.8625 20.4875C30.6208 21.3458 31 22.35 31 23.5C31 24.75 30.5625 25.8125 29.6875 26.6875C28.8125 27.5625 27.75 28 26.5 28H14.5ZM14.5 26H26.5C27.2 26 27.7917 25.7583 28.275 25.275C28.7583 24.7917 29 24.2 29 23.5C29 22.8 28.7583 22.2083 28.275 21.725C27.7917 21.2417 27.2 21 26.5 21H25V19C25 17.6167 24.5125 16.4375 23.5375 15.4625C22.5625 14.4875 21.3833 14 20 14C18.6167 14 17.4375 14.4875 16.4625 15.4625C15.4875 16.4375 15 17.6167 15 19H14.5C13.5333 19 12.7083 19.3417 12.025 20.025C11.3417 20.7083 11 21.5333 11 22.5C11 23.4667 11.3417 24.2917 12.025 24.975C12.7083 25.6583 13.5333 26 14.5 26ZM20.7125 23.7125C20.9042 23.5208 21 23.2833 21 23C21 22.7167 20.9042 22.4792 20.7125 22.2875C20.5208 22.0958 20.2833 22 20 22C19.7167 22 19.4792 22.0958 19.2875 22.2875C19.0958 22.4792 19 22.7167 19 23C19 23.2833 19.0958 23.5208 19.2875 23.7125C19.4792 23.9042 19.7167 24 20 24C20.2833 24 20.5208 23.9042 20.7125 23.7125ZM19 20.5H21V16H19V20.5Z\"\n fill=\"#EDC766\"\n />\n </g>\n </SvgIcon>\n )\n}\n\nexport default CloudWarning\n"],"mappings":";;;;AAGA,IAAM,KAAgB,MAElB,kBAAC,GAAD;CAAS,GAAI;CAAO,SAAQ;CAAY,MAAK;WAA7C;EACE,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,CAAA;EACF,kBAAC,QAAD;GACE,IAAG;GACH,OAAO,EAAE,UAAU,SAAS;GAC5B,WAAU;GACV,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;aAEP,kBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;IAAK,MAAK;IAAY,CAAA;GACrD,CAAA;EACP,kBAAC,KAAD;GAAG,MAAK;aACN,kBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACA,CAAA;EACI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubmissionDirectoryList.d.ts","sourceRoot":"","sources":["../../../src/components/ChallengeSubmission/SubmissionDirectoryList.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAuB7D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAQlD,KAAK,4BAA4B,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,UAAU,EAAE,OAAO,UAAU,CAAC,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;IACjE,cAAc,EAAE,CAAC,QAAQ,EAAE,UAAU,KAAK,IAAI,CAAA;CAC/C,CAAA;AAMD,iBAAS,uBAAuB,CAAC,EAC/B,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,cAAc,GACf,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"SubmissionDirectoryList.d.ts","sourceRoot":"","sources":["../../../src/components/ChallengeSubmission/SubmissionDirectoryList.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAuB7D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAQlD,KAAK,4BAA4B,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,UAAU,EAAE,OAAO,UAAU,CAAC,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;IACjE,cAAc,EAAE,CAAC,QAAQ,EAAE,UAAU,KAAK,IAAI,CAAA;CAC/C,CAAA;AAMD,iBAAS,uBAAuB,CAAC,EAC/B,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,cAAc,GACf,EAAE,4BAA4B,2CAmc9B;AAED,eAAe,uBAAuB,CAAA"}
|
|
@@ -2,71 +2,71 @@ import { BackendDestinationEnum as e, getEndpoint as t } from "../../utils/funct
|
|
|
2
2
|
import n from "../../synapse-client/index.js";
|
|
3
3
|
import { ErrorBanner as r } from "../error/ErrorBanner.js";
|
|
4
4
|
import { useSynapseContext as i } from "../../utils/context/SynapseContext.js";
|
|
5
|
-
import { invalidateAllQueriesForEntity as
|
|
5
|
+
import { invalidateAllQueriesForEntity as a } from "../../synapse-queries/QueryFilterUtils.js";
|
|
6
6
|
import "../../utils/index.js";
|
|
7
|
-
import { useGetEntities as
|
|
8
|
-
import { useGetEntityChildren as
|
|
7
|
+
import { useGetEntities as ee } from "../../synapse-queries/entity/useEntity.js";
|
|
8
|
+
import { useGetEntityChildren as o } from "../../synapse-queries/entity/useGetEntityChildren.js";
|
|
9
9
|
import "../../synapse-queries/index.js";
|
|
10
|
-
import
|
|
11
|
-
import { formatDate as
|
|
12
|
-
import
|
|
13
|
-
import { CopyToClipboardIcon as
|
|
14
|
-
import
|
|
15
|
-
import { useEffect as
|
|
16
|
-
import { Box as
|
|
17
|
-
import { jsx as
|
|
18
|
-
import { Direction as
|
|
19
|
-
import { EntityType as
|
|
20
|
-
import { useQueryClient as
|
|
21
|
-
import {
|
|
22
|
-
import { Link as
|
|
23
|
-
import
|
|
24
|
-
import { DataGrid as
|
|
10
|
+
import s from "../ConfirmationDialog/index.js";
|
|
11
|
+
import { formatDate as c } from "../../utils/functions/DateFormatter.js";
|
|
12
|
+
import te from "../IconSvg/index.js";
|
|
13
|
+
import { CopyToClipboardIcon as ne } from "../CopyToClipboardIcon.js";
|
|
14
|
+
import l from "../FileUpload/index.js";
|
|
15
|
+
import { useEffect as u, useMemo as d, useState as f } from "react";
|
|
16
|
+
import { Box as p, Button as re, Radio as m, Typography as h } from "@mui/material";
|
|
17
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
18
|
+
import { Direction as ie, FILE_ENTITY_CONCRETE_TYPE_VALUE as y, SortBy as ae } from "@sage-bionetworks/synapse-types";
|
|
19
|
+
import { EntityType as b } from "@sage-bionetworks/synapse-client";
|
|
20
|
+
import { useQueryClient as x } from "@tanstack/react-query";
|
|
21
|
+
import { NotesTwoTone as oe } from "@mui/icons-material";
|
|
22
|
+
import { Link as S } from "react-router";
|
|
23
|
+
import C from "dayjs";
|
|
24
|
+
import { DataGrid as se } from "@mui/x-data-grid";
|
|
25
25
|
//#region src/components/ChallengeSubmission/SubmissionDirectoryList.tsx
|
|
26
|
-
function
|
|
27
|
-
let
|
|
28
|
-
parentId:
|
|
29
|
-
nextPageToken:
|
|
30
|
-
includeTypes: [
|
|
26
|
+
function w({ pageSize: w, challengeProjectId: T, entityType: E, onItemSelected: D }) {
|
|
27
|
+
let O = x(), { accessToken: k, keyFactory: A } = i(), [j, ce] = f(0), [M, N] = f(), [P, F] = f(), [I, L] = f(), [R, z] = f([]), [B, V] = f(), [H, U] = f(!1), [W, G] = f(!1), [K, q] = f(), J = w, Y = `${t(e.PORTAL_ENDPOINT)}Synapse:${T}`, { data: X, refetch: le } = o({
|
|
28
|
+
parentId: T,
|
|
29
|
+
nextPageToken: H ? B : null,
|
|
30
|
+
includeTypes: [E],
|
|
31
31
|
includeTotalChildCount: !0,
|
|
32
|
-
sortBy:
|
|
33
|
-
sortDirection:
|
|
32
|
+
sortBy: ae.MODIFIED_ON,
|
|
33
|
+
sortDirection: ie.DESC
|
|
34
34
|
}, {
|
|
35
|
-
enabled: !!
|
|
35
|
+
enabled: !!T,
|
|
36
36
|
throwOnError: !0
|
|
37
37
|
});
|
|
38
|
-
|
|
39
|
-
if (
|
|
40
|
-
let e = [...
|
|
41
|
-
e.splice(t, t + 50, ...
|
|
38
|
+
u(() => {
|
|
39
|
+
if (X) {
|
|
40
|
+
let e = [...R], t = Math.floor((j + 1) * J / 50) * 50;
|
|
41
|
+
e.splice(t, t + 50, ...X.page), z(e), U(!1), V(X.nextPageToken);
|
|
42
42
|
}
|
|
43
|
-
}, [
|
|
43
|
+
}, [X]);
|
|
44
44
|
function ue() {
|
|
45
|
-
let e =
|
|
46
|
-
return
|
|
45
|
+
let e = j * J;
|
|
46
|
+
return R.slice(e, e + J);
|
|
47
47
|
}
|
|
48
|
-
function
|
|
49
|
-
|
|
48
|
+
function Z() {
|
|
49
|
+
F(void 0), L(void 0), z([]), V(void 0), U(!1), le();
|
|
50
50
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}, [
|
|
54
|
-
let
|
|
55
|
-
|
|
56
|
-
let t =
|
|
51
|
+
u(() => {
|
|
52
|
+
Z();
|
|
53
|
+
}, [E, w]);
|
|
54
|
+
let Q = ee(ue()), $ = d(() => Q.filter((e) => e.status === "success").map((e) => e.data), [Q]), de = Q.some((e) => e.isLoading), fe = async (e) => {
|
|
55
|
+
L(!1);
|
|
56
|
+
let t = $.find((t) => t?.id === e);
|
|
57
57
|
if (t) {
|
|
58
|
-
if (
|
|
58
|
+
if (N(t), E === b.dockerrepo) {
|
|
59
59
|
let e;
|
|
60
60
|
try {
|
|
61
|
-
e = await n.getDockerTag(t.id,
|
|
61
|
+
e = await n.getDockerTag(t.id, k, 0, 1);
|
|
62
62
|
} catch (e) {
|
|
63
|
-
return
|
|
63
|
+
return F(e.message);
|
|
64
64
|
}
|
|
65
|
-
if (e.totalNumberOfResults === 0) return
|
|
65
|
+
if (e.totalNumberOfResults === 0) return F("No commits have been made to this repository. Please select a repository with at least one commit.");
|
|
66
66
|
}
|
|
67
|
-
|
|
67
|
+
L(!0), F(void 0);
|
|
68
68
|
}
|
|
69
|
-
},
|
|
69
|
+
}, pe = [
|
|
70
70
|
{
|
|
71
71
|
field: "radiobutton",
|
|
72
72
|
headerName: "",
|
|
@@ -75,9 +75,9 @@ function C({ pageSize: C, challengeProjectId: w, entityType: T, onItemSelected:
|
|
|
75
75
|
filterable: !1,
|
|
76
76
|
hideable: !1,
|
|
77
77
|
disableColumnMenu: !0,
|
|
78
|
-
renderCell: (e) => /* @__PURE__ */
|
|
78
|
+
renderCell: (e) => /* @__PURE__ */ _(m, {
|
|
79
79
|
value: e.id,
|
|
80
|
-
checked: e.id ===
|
|
80
|
+
checked: e.id === M?.id,
|
|
81
81
|
onChange: (e) => {
|
|
82
82
|
fe(e.target.value);
|
|
83
83
|
}
|
|
@@ -85,12 +85,12 @@ function C({ pageSize: C, challengeProjectId: w, entityType: T, onItemSelected:
|
|
|
85
85
|
},
|
|
86
86
|
{
|
|
87
87
|
field: "name",
|
|
88
|
-
headerName:
|
|
88
|
+
headerName: E === b.dockerrepo ? "Docker Repository" : "File Name",
|
|
89
89
|
flex: 1,
|
|
90
90
|
filterable: !1,
|
|
91
91
|
hideable: !1,
|
|
92
92
|
disableColumnMenu: !0,
|
|
93
|
-
renderCell: (n) => /* @__PURE__ */
|
|
93
|
+
renderCell: (n) => /* @__PURE__ */ _(S, {
|
|
94
94
|
to: { pathname: `${t(e.PORTAL_ENDPOINT)}Synapse:${n.row.id}` },
|
|
95
95
|
target: "_blank",
|
|
96
96
|
children: n.row.name
|
|
@@ -112,130 +112,156 @@ function C({ pageSize: C, challengeProjectId: w, entityType: T, onItemSelected:
|
|
|
112
112
|
hideable: !1,
|
|
113
113
|
disableColumnMenu: !0
|
|
114
114
|
}
|
|
115
|
-
],
|
|
115
|
+
], me = (e) => {
|
|
116
116
|
let t = [];
|
|
117
117
|
return e.forEach((e) => {
|
|
118
118
|
t.push({
|
|
119
119
|
id: e.id,
|
|
120
|
-
name:
|
|
121
|
-
modifiedOn:
|
|
120
|
+
name: E === b.dockerrepo ? e.repositoryName ?? e.name : e.name,
|
|
121
|
+
modifiedOn: c(C(e.modifiedOn), "MM/DD/YY")
|
|
122
122
|
});
|
|
123
123
|
}), t;
|
|
124
|
-
},
|
|
125
|
-
Math.min(
|
|
126
|
-
},
|
|
127
|
-
|
|
124
|
+
}, he = (e) => {
|
|
125
|
+
Math.min(X?.totalChildCount ?? 0, (e + 1) * J) > R.length && U(!0), ce(e);
|
|
126
|
+
}, ge = () => {
|
|
127
|
+
D(M);
|
|
128
128
|
};
|
|
129
|
-
function
|
|
129
|
+
function _e(e) {
|
|
130
130
|
if (!e) return;
|
|
131
131
|
let { fileHandleId: t, fileName: r } = e, i = {
|
|
132
|
-
parentId:
|
|
132
|
+
parentId: T,
|
|
133
133
|
name: r,
|
|
134
|
-
concreteType:
|
|
134
|
+
concreteType: y,
|
|
135
135
|
dataFileHandleId: t
|
|
136
136
|
};
|
|
137
|
-
n.createEntity(i,
|
|
138
|
-
|
|
137
|
+
n.createEntity(i, k).then(() => {
|
|
138
|
+
Z();
|
|
139
139
|
}).catch((e) => {
|
|
140
|
-
|
|
140
|
+
F(e.reason);
|
|
141
141
|
});
|
|
142
142
|
}
|
|
143
|
-
async function
|
|
144
|
-
if (!
|
|
145
|
-
let { fileHandleId: e, entityId: t } =
|
|
146
|
-
if (!t) return
|
|
143
|
+
async function ve() {
|
|
144
|
+
if (!K) return;
|
|
145
|
+
let { fileHandleId: e, entityId: t } = K;
|
|
146
|
+
if (!t) return F("Error: missing entityId. Please try again.");
|
|
147
147
|
let r;
|
|
148
148
|
try {
|
|
149
|
-
r = await n.getEntity(
|
|
149
|
+
r = await n.getEntity(k, t);
|
|
150
150
|
} catch {
|
|
151
|
-
return
|
|
151
|
+
return F(`The entity ${t} could not be retrieved.`);
|
|
152
152
|
}
|
|
153
153
|
let i = {
|
|
154
154
|
id: r.id,
|
|
155
155
|
name: r.name,
|
|
156
156
|
dataFileHandleId: e,
|
|
157
|
-
concreteType:
|
|
157
|
+
concreteType: y,
|
|
158
158
|
parentId: r.parentId,
|
|
159
159
|
etag: r.etag,
|
|
160
160
|
modifiedOn: r.modifiedOn
|
|
161
161
|
};
|
|
162
162
|
try {
|
|
163
|
-
let e = await n.updateEntity(i,
|
|
164
|
-
await
|
|
163
|
+
let e = await n.updateEntity(i, k, !0);
|
|
164
|
+
await a(O, A, e.id), O.setQueryData(A.getEntityQueryKey(e.id), e), Z();
|
|
165
165
|
} catch (e) {
|
|
166
|
-
|
|
166
|
+
F(e.reason);
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
|
-
let
|
|
169
|
+
let ye = async (e) => {
|
|
170
170
|
if (e.success && e.resp) {
|
|
171
171
|
let { fileName: t } = e.resp, r = {
|
|
172
172
|
entityName: t,
|
|
173
|
-
parentId:
|
|
173
|
+
parentId: T
|
|
174
174
|
};
|
|
175
175
|
try {
|
|
176
|
-
let t = await n.lookupChildEntity(r,
|
|
177
|
-
t && (
|
|
176
|
+
let t = await n.lookupChildEntity(r, k);
|
|
177
|
+
t && (q({
|
|
178
178
|
...e.resp,
|
|
179
179
|
entityId: t.id
|
|
180
|
-
}),
|
|
180
|
+
}), G(!0));
|
|
181
181
|
} catch {
|
|
182
|
-
|
|
182
|
+
q(void 0), _e(e.resp);
|
|
183
183
|
}
|
|
184
|
-
} else !e.success && e.error ?
|
|
184
|
+
} else !e.success && e.error ? F(e.error.reason) : F("An unknown error occurred. Please try again.");
|
|
185
185
|
};
|
|
186
|
-
return /* @__PURE__ */
|
|
187
|
-
/* @__PURE__ */
|
|
186
|
+
return /* @__PURE__ */ v(p, { children: [
|
|
187
|
+
/* @__PURE__ */ v(p, {
|
|
188
188
|
sx: {
|
|
189
189
|
display: "flex",
|
|
190
190
|
backgroundColor: "#FBFBFC",
|
|
191
191
|
padding: "10px",
|
|
192
192
|
justifyContent: "space-between"
|
|
193
193
|
},
|
|
194
|
-
children: [/* @__PURE__ */
|
|
194
|
+
children: [/* @__PURE__ */ _(h, {
|
|
195
195
|
variant: "h6",
|
|
196
196
|
sx: {
|
|
197
197
|
fontSize: "18px",
|
|
198
198
|
lineHeight: "20px",
|
|
199
199
|
fontWeight: 700
|
|
200
200
|
},
|
|
201
|
-
children: "
|
|
202
|
-
}), /* @__PURE__ */
|
|
201
|
+
children: E === b.file ? "Submit File" : "Submit Docker Image"
|
|
202
|
+
}), /* @__PURE__ */ v(p, {
|
|
203
203
|
sx: { display: "flex" },
|
|
204
|
-
children: [/* @__PURE__ */
|
|
204
|
+
children: [/* @__PURE__ */ v(h, {
|
|
205
205
|
variant: "body1",
|
|
206
206
|
sx: {
|
|
207
207
|
fontSize: "14px",
|
|
208
208
|
color: "#71767F"
|
|
209
209
|
},
|
|
210
210
|
children: [
|
|
211
|
-
"Project SynID:",
|
|
211
|
+
"Your Project SynID:",
|
|
212
212
|
" ",
|
|
213
|
-
/* @__PURE__ */
|
|
214
|
-
to: { pathname:
|
|
213
|
+
/* @__PURE__ */ _(S, {
|
|
214
|
+
to: { pathname: Y },
|
|
215
215
|
target: "_blank",
|
|
216
|
-
children:
|
|
216
|
+
children: T
|
|
217
217
|
})
|
|
218
218
|
]
|
|
219
|
-
}), /* @__PURE__ */
|
|
220
|
-
value:
|
|
219
|
+
}), /* @__PURE__ */ _(ne, {
|
|
220
|
+
value: Y,
|
|
221
221
|
sx: { marginTop: "-4px" }
|
|
222
222
|
})]
|
|
223
223
|
})]
|
|
224
224
|
}),
|
|
225
|
-
/* @__PURE__ */
|
|
225
|
+
/* @__PURE__ */ v(p, {
|
|
226
|
+
sx: {
|
|
227
|
+
my: 3,
|
|
228
|
+
display: "flex"
|
|
229
|
+
},
|
|
230
|
+
children: [/* @__PURE__ */ _(oe, { sx: {
|
|
231
|
+
width: "16px",
|
|
232
|
+
height: "16px",
|
|
233
|
+
verticalAlign: "text-bottom"
|
|
234
|
+
} }), /* @__PURE__ */ v(p, {
|
|
235
|
+
sx: { ml: 1 },
|
|
236
|
+
children: [E === b.file && /* @__PURE__ */ _(g, { children: "Choose a prediction file from your submission directory below and click \"Submit Selection\" to pick an evaluation queue. If you need to add a new file, click \"Upload File\" first." }), E === b.dockerrepo && /* @__PURE__ */ v(g, { children: [
|
|
237
|
+
"Choose a Docker image from your submission directory below and click \"Submit Selection\" to pick an image version and evaluation queue. If you need to upload a new image to your project (",
|
|
238
|
+
/* @__PURE__ */ _("code", { children: T }),
|
|
239
|
+
"), see our",
|
|
240
|
+
" ",
|
|
241
|
+
/* @__PURE__ */ _(S, {
|
|
242
|
+
to: "https://github.com/Sage-Bionetworks-Challenges/sample-model-templates#build-your-model",
|
|
243
|
+
target: "_blank",
|
|
244
|
+
children: "Docker model submission guide"
|
|
245
|
+
}),
|
|
246
|
+
" ",
|
|
247
|
+
"for command-line instructions on how to build and upload."
|
|
248
|
+
] })]
|
|
249
|
+
})]
|
|
250
|
+
}),
|
|
251
|
+
/* @__PURE__ */ _(p, { children: /* @__PURE__ */ _(se, {
|
|
226
252
|
loading: de,
|
|
227
|
-
columns:
|
|
228
|
-
rows:
|
|
229
|
-
rowCount:
|
|
253
|
+
columns: pe,
|
|
254
|
+
rows: me($),
|
|
255
|
+
rowCount: X?.totalChildCount ?? 0,
|
|
230
256
|
pagination: !0,
|
|
231
257
|
paginationMode: "server",
|
|
232
258
|
paginationModel: {
|
|
233
|
-
page:
|
|
234
|
-
pageSize:
|
|
259
|
+
page: j,
|
|
260
|
+
pageSize: J
|
|
235
261
|
},
|
|
236
|
-
pageSizeOptions: [
|
|
262
|
+
pageSizeOptions: [J],
|
|
237
263
|
onPaginationModelChange: ({ page: e }) => {
|
|
238
|
-
|
|
264
|
+
he(e);
|
|
239
265
|
},
|
|
240
266
|
density: "compact",
|
|
241
267
|
autoHeight: !0,
|
|
@@ -254,75 +280,52 @@ function C({ pageSize: C, challengeProjectId: w, entityType: T, onItemSelected:
|
|
|
254
280
|
},
|
|
255
281
|
getRowClassName: (e) => e.indexRelativeToCurrentPage % 2 == 0 ? "Mui-even" : "Mui-odd"
|
|
256
282
|
}) }),
|
|
257
|
-
|
|
258
|
-
/* @__PURE__ */
|
|
283
|
+
P && /* @__PURE__ */ _(r, { error: P }),
|
|
284
|
+
/* @__PURE__ */ v(p, {
|
|
259
285
|
sx: {
|
|
260
286
|
display: "flex",
|
|
261
287
|
justifyContent: "space-between"
|
|
262
288
|
},
|
|
263
|
-
children: [
|
|
289
|
+
children: [E === b.file && /* @__PURE__ */ _(l, {
|
|
264
290
|
label: "Upload File",
|
|
265
291
|
buttonProps: {
|
|
266
292
|
variant: "outlined",
|
|
267
|
-
endIcon: /* @__PURE__ */
|
|
293
|
+
endIcon: /* @__PURE__ */ _(te, { icon: "upload" }),
|
|
268
294
|
sx: { lineHeight: 1 }
|
|
269
295
|
},
|
|
270
296
|
onComplete: (e) => {
|
|
271
|
-
|
|
297
|
+
ye(e);
|
|
272
298
|
}
|
|
273
|
-
}), /* @__PURE__ */
|
|
299
|
+
}), /* @__PURE__ */ _(re, {
|
|
274
300
|
color: "primary",
|
|
275
301
|
variant: "contained",
|
|
276
|
-
onClick:
|
|
277
|
-
disabled: !
|
|
302
|
+
onClick: ge,
|
|
303
|
+
disabled: !I,
|
|
278
304
|
children: "Submit Selection"
|
|
279
305
|
})]
|
|
280
306
|
}),
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
mt: 4,
|
|
284
|
-
display: "flex"
|
|
285
|
-
},
|
|
286
|
-
children: [/* @__PURE__ */ p(y, { sx: {
|
|
287
|
-
width: "16px",
|
|
288
|
-
height: "16px",
|
|
289
|
-
verticalAlign: "text-bottom"
|
|
290
|
-
} }), /* @__PURE__ */ m(d, {
|
|
291
|
-
sx: { ml: 2 },
|
|
292
|
-
children: [
|
|
293
|
-
"To learn more about how to create and submit the Docker containers using command line, see our",
|
|
294
|
-
" ",
|
|
295
|
-
/* @__PURE__ */ p(b, {
|
|
296
|
-
to: "https://github.com/Sage-Bionetworks-Challenges/sample-model-templates#build-your-model",
|
|
297
|
-
target: "_blank",
|
|
298
|
-
children: "Docker model submission guide"
|
|
299
|
-
}),
|
|
300
|
-
"."
|
|
301
|
-
]
|
|
302
|
-
})]
|
|
303
|
-
}),
|
|
304
|
-
/* @__PURE__ */ p(a, {
|
|
305
|
-
open: U,
|
|
307
|
+
/* @__PURE__ */ _(s, {
|
|
308
|
+
open: W,
|
|
306
309
|
title: "File exists",
|
|
307
|
-
content: /* @__PURE__ */
|
|
310
|
+
content: /* @__PURE__ */ v(h, {
|
|
308
311
|
variant: "body1",
|
|
309
312
|
sx: { fontSize: "16px" },
|
|
310
313
|
children: [
|
|
311
314
|
"A file named \"",
|
|
312
|
-
|
|
315
|
+
K?.fileName,
|
|
313
316
|
"\" (",
|
|
314
|
-
|
|
317
|
+
K?.entityId,
|
|
315
318
|
") already exists in this location. Do you want to update the existing file and create a new version?"
|
|
316
319
|
]
|
|
317
320
|
}),
|
|
318
|
-
onCancel: () =>
|
|
321
|
+
onCancel: () => G(!1),
|
|
319
322
|
onConfirm: () => {
|
|
320
|
-
|
|
323
|
+
ve(), G(!1);
|
|
321
324
|
}
|
|
322
325
|
})
|
|
323
326
|
] });
|
|
324
327
|
}
|
|
325
328
|
//#endregion
|
|
326
|
-
export {
|
|
329
|
+
export { w as default };
|
|
327
330
|
|
|
328
331
|
//# sourceMappingURL=SubmissionDirectoryList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubmissionDirectoryList.js","names":[],"sources":["../../../src/components/ChallengeSubmission/SubmissionDirectoryList.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport {\n invalidateAllQueriesForEntity,\n useGetEntities,\n useGetEntityChildren,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { InfoTwoTone } from '@mui/icons-material'\nimport { Box, Button, Radio, Typography } from '@mui/material'\nimport { DataGrid, GridCellParams, GridColDef } from '@mui/x-data-grid'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n Direction,\n Entity,\n EntityChildrenRequest,\n EntityHeader,\n EntityLookupRequest,\n FILE_ENTITY_CONCRETE_TYPE_VALUE,\n FileEntity,\n FileUploadComplete,\n SortBy,\n UploadCallbackResp,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport dayjs from 'dayjs'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link } from 'react-router'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport CopyToClipboardIcon from '../CopyToClipboardIcon'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport FileUpload from '../FileUpload'\nimport IconSvg from '../IconSvg'\nimport { EntityItem } from './ChallengeSubmission'\n\ntype SubmissionDirectoryRow = {\n id: string\n name: string\n modifiedOn: string\n}\n\ntype SubmissionDirectoryListProps = {\n pageSize: number\n challengeProjectId: string\n entityType: typeof EntityType.dockerrepo | typeof EntityType.file\n onItemSelected: (selected: EntityItem) => void\n}\n\ntype FileUploadAttempt = FileUploadComplete & {\n entityId?: string\n}\n\nfunction SubmissionDirectoryList({\n pageSize,\n challengeProjectId,\n entityType,\n onItemSelected,\n}: SubmissionDirectoryListProps) {\n const queryClient = useQueryClient()\n const { accessToken, keyFactory } = useSynapseContext()\n const [page, setPage] = useState<number>(0)\n const [selectedItem, setSelectedItem] = useState<EntityItem | undefined>()\n const [errorMessage, setErrorMessage] = useState<string>()\n const [canSubmit, setCanSubmit] = useState<boolean>()\n const [fetchedHeaders, setFetchedHeaders] = useState<EntityHeader[]>([])\n const [nextPageToken, setNextPageToken] = useState<string | undefined>()\n const [fetchNextPage, setFetchNextPage] = useState<boolean>(false)\n const [confirmOpen, setConfirmOpen] = useState<boolean>(false)\n const [uploadAttempt, setUploadAttempt] = useState<FileUploadAttempt>()\n\n const PER_PAGE = pageSize\n const HEADERS_PER_PAGE = 50\n const PROJECT_URL = `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${challengeProjectId}`\n\n const request: EntityChildrenRequest = {\n parentId: challengeProjectId,\n nextPageToken: fetchNextPage ? nextPageToken : null,\n includeTypes: [entityType],\n includeTotalChildCount: true,\n sortBy: SortBy.MODIFIED_ON,\n sortDirection: Direction.DESC,\n }\n\n const { data: headerResults, refetch } = useGetEntityChildren(request, {\n enabled: !!challengeProjectId,\n throwOnError: true,\n })\n\n useEffect(() => {\n if (headerResults) {\n const newHeaders = [...fetchedHeaders]\n const headerPage = Math.floor(((page + 1) * PER_PAGE) / HEADERS_PER_PAGE)\n const start = headerPage * HEADERS_PER_PAGE\n newHeaders.splice(start, start + HEADERS_PER_PAGE, ...headerResults.page)\n setFetchedHeaders(newHeaders)\n setFetchNextPage(false)\n setNextPageToken(headerResults.nextPageToken)\n }\n // TODO: Temporary useEffect hook to remove onSuccess QueryOption for @tanstack/react-query v5\n // Refactor this component to remove this effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [headerResults])\n\n function getPageHeaders() {\n const pageStart = page * PER_PAGE\n const pageHeaders = fetchedHeaders.slice(pageStart, pageStart + PER_PAGE)\n return pageHeaders\n }\n\n function reset() {\n setErrorMessage(undefined)\n setCanSubmit(undefined)\n setFetchedHeaders([])\n setNextPageToken(undefined)\n setFetchNextPage(false)\n refetch()\n }\n\n useEffect(() => {\n reset()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [entityType, pageSize])\n\n const queries = useGetEntities(getPageHeaders())\n const entities = useMemo(\n () =>\n queries\n .filter(q => q.status === 'success')\n .map(q => q.data) as EntityItem[],\n [queries],\n )\n const areEntitiesLoading = queries.some(q => q.isLoading)\n\n const entityChangeHandler = async (value: string) => {\n setCanSubmit(false)\n const entity = entities.find(entity => entity?.id === value)\n if (entity) {\n setSelectedItem(entity)\n if (entityType === EntityType.dockerrepo) {\n let commits\n try {\n commits = await SynapseClient.getDockerTag(\n entity.id!,\n accessToken,\n 0,\n 1,\n )\n } catch (e) {\n return setErrorMessage(e.message)\n }\n if (commits.totalNumberOfResults === 0) {\n return setErrorMessage(\n 'No commits have been made to this repository. Please select a repository with at least one commit.',\n )\n }\n }\n setCanSubmit(true)\n setErrorMessage(undefined)\n }\n }\n\n const columns: GridColDef[] = [\n {\n field: 'radiobutton',\n headerName: '',\n width: 25,\n sortable: false,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: params => {\n return (\n <Radio\n value={params.id}\n checked={params.id === selectedItem?.id}\n onChange={event => {\n entityChangeHandler(event.target.value)\n }}\n />\n )\n },\n },\n {\n field: 'name',\n headerName:\n entityType === EntityType.dockerrepo\n ? 'Docker Repository'\n : 'File Name',\n flex: 1,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: (params: GridCellParams<Entity, SubmissionDirectoryRow>) => (\n <Link\n to={{\n pathname: `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${params.row.id}`,\n }}\n target=\"_blank\"\n >\n {params.row.name}\n </Link>\n ),\n },\n {\n field: 'modifiedOn',\n headerName: 'Updated On',\n width: 100,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n {\n field: 'id',\n headerName: 'ID',\n width: 200,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n ]\n\n const getRows = (entities: EntityItem[]) => {\n const newRows: SubmissionDirectoryRow[] = []\n entities.forEach(entity => {\n newRows.push({\n id: entity.id!,\n name:\n entityType === EntityType.dockerrepo\n ? entity.repositoryName ?? entity.name\n : entity.name,\n modifiedOn: formatDate(dayjs(entity.modifiedOn), 'MM/DD/YY'),\n })\n })\n return newRows\n }\n\n const handlePageChange = (newPageNum: number) => {\n const lastIndexNeeded = Math.min(\n headerResults?.totalChildCount ?? 0,\n (newPageNum + 1) * PER_PAGE,\n )\n if (lastIndexNeeded > fetchedHeaders.length) {\n setFetchNextPage(true)\n }\n setPage(newPageNum)\n }\n\n const itemSelectedHandler = () => {\n onItemSelected(selectedItem!)\n }\n\n function createEntity(file: FileUploadAttempt) {\n // Create Entity\n if (!file) return\n const { fileHandleId, fileName } = file\n const newFileEntity: FileEntity = {\n parentId: challengeProjectId,\n name: fileName,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n dataFileHandleId: fileHandleId,\n }\n SynapseClient.createEntity(newFileEntity, accessToken)\n .then(() => {\n reset()\n })\n .catch((err: SynapseClientError) => {\n setErrorMessage(err.reason)\n })\n }\n\n async function updateEntity() {\n if (!uploadAttempt) return\n const { fileHandleId, entityId } = uploadAttempt\n if (!entityId)\n return setErrorMessage('Error: missing entityId. Please try again.')\n // Get the entity\n let entity: FileEntity\n try {\n entity = await SynapseClient.getEntity(accessToken, entityId)\n } catch (err) {\n return setErrorMessage(`The entity ${entityId} could not be retrieved.`)\n }\n\n const updateRequest: FileEntity = {\n id: entity.id,\n name: entity.name,\n dataFileHandleId: fileHandleId,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n parentId: entity.parentId,\n etag: entity.etag,\n modifiedOn: entity.modifiedOn,\n }\n\n try {\n const updatedEntity = await SynapseClient.updateEntity(\n updateRequest,\n accessToken,\n true,\n )\n await invalidateAllQueriesForEntity(\n queryClient,\n keyFactory,\n updatedEntity.id!,\n )\n queryClient.setQueryData(\n keyFactory.getEntityQueryKey(updatedEntity.id!),\n updatedEntity,\n )\n reset()\n } catch (err) {\n setErrorMessage(err.reason)\n }\n }\n\n const handleUpload = async (response: UploadCallbackResp) => {\n if (response.success && response.resp) {\n const { fileName } = response.resp\n\n // Lookup entity\n const entityLookupRequest: EntityLookupRequest = {\n entityName: fileName,\n parentId: challengeProjectId,\n }\n try {\n const entityId = await SynapseClient.lookupChildEntity(\n entityLookupRequest,\n accessToken,\n )\n // Entity exists, prompt user to update it\n if (entityId) {\n setUploadAttempt({ ...response.resp, entityId: entityId.id })\n setConfirmOpen(true)\n }\n } catch (err) {\n // An existing entity was not found for this file, create it\n setUploadAttempt(undefined)\n createEntity(response.resp)\n }\n } else if (!response.success && response.error) {\n setErrorMessage(response.error.reason as string)\n } else {\n setErrorMessage('An unknown error occurred. Please try again.')\n }\n }\n\n return (\n <Box>\n <Box\n sx={{\n display: 'flex',\n backgroundColor: '#FBFBFC',\n padding: '10px',\n justifyContent: 'space-between',\n }}\n >\n <Typography\n variant=\"h6\"\n sx={{ fontSize: '18px', lineHeight: '20px', fontWeight: 700 }}\n >\n Your Submission Directory\n </Typography>\n <Box sx={{ display: 'flex' }}>\n <Typography\n variant=\"body1\"\n sx={{ fontSize: '14px', color: '#71767F' }}\n >\n Project SynID:{' '}\n <Link to={{ pathname: PROJECT_URL }} target=\"_blank\">\n {challengeProjectId}\n </Link>\n </Typography>\n <CopyToClipboardIcon value={PROJECT_URL} sx={{ marginTop: '-4px' }} />\n </Box>\n </Box>\n <Box>\n <DataGrid\n loading={areEntitiesLoading}\n columns={columns}\n rows={getRows(entities)}\n rowCount={headerResults?.totalChildCount ?? 0}\n pagination\n paginationMode=\"server\"\n paginationModel={{ page, pageSize: PER_PAGE }}\n pageSizeOptions={[PER_PAGE]}\n onPaginationModelChange={({ page }) => {\n handlePageChange(page)\n }}\n density=\"compact\"\n autoHeight\n sx={{\n fontSize: '14px',\n border: 'none',\n height: '100%',\n '& .MuiDataGrid-columnHeader': {\n backgroundColor: '#F1F3F5',\n },\n '& .Mui-odd': {\n backgroundColor: '#FBFBFC',\n },\n '.MuiDataGrid-columnHeaderTitleContainer': {\n justifyContent: 'space-between',\n },\n '.radio': {\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n },\n }}\n getRowClassName={params =>\n params.indexRelativeToCurrentPage % 2 === 0 ? 'Mui-even' : 'Mui-odd'\n }\n />\n </Box>\n {errorMessage && <ErrorBanner error={errorMessage}></ErrorBanner>}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n {entityType === EntityType.file && (\n <FileUpload\n label=\"Upload File\"\n buttonProps={{\n variant: 'outlined',\n endIcon: <IconSvg icon=\"upload\" />,\n sx: { lineHeight: 1 },\n }}\n onComplete={resp => {\n handleUpload(resp)\n }}\n />\n )}\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={itemSelectedHandler}\n disabled={!canSubmit}\n >\n Submit Selection\n </Button>\n </Box>\n {entityType === EntityType.dockerrepo && (\n <Box\n sx={{\n mt: 4,\n display: 'flex',\n }}\n >\n <InfoTwoTone\n sx={{\n width: '16px',\n height: '16px',\n verticalAlign: 'text-bottom',\n }}\n />\n\n <Box\n sx={{\n ml: 2,\n }}\n >\n To learn more about how to create and submit the Docker containers\n using command line, see our{' '}\n <Link\n to=\"https://github.com/Sage-Bionetworks-Challenges/sample-model-templates#build-your-model\"\n target=\"_blank\"\n >\n Docker model submission guide\n </Link>\n .\n </Box>\n </Box>\n )}\n <ConfirmationDialog\n open={confirmOpen}\n title=\"File exists\"\n content={\n <Typography variant=\"body1\" sx={{ fontSize: '16px' }}>\n A file named "{uploadAttempt?.fileName}" (\n {uploadAttempt?.entityId}) already exists in this location. Do you\n want to update the existing file and create a new version?\n </Typography>\n }\n onCancel={() => setConfirmOpen(false)}\n onConfirm={() => {\n updateEntity()\n setConfirmOpen(false)\n }}\n />\n </Box>\n )\n}\n\nexport default SubmissionDirectoryList\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SubmissionDirectoryList.js","names":[],"sources":["../../../src/components/ChallengeSubmission/SubmissionDirectoryList.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport {\n invalidateAllQueriesForEntity,\n useGetEntities,\n useGetEntityChildren,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { NotesTwoTone } from '@mui/icons-material'\nimport { Box, Button, Radio, Typography } from '@mui/material'\nimport { DataGrid, GridCellParams, GridColDef } from '@mui/x-data-grid'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n Direction,\n Entity,\n EntityChildrenRequest,\n EntityHeader,\n EntityLookupRequest,\n FILE_ENTITY_CONCRETE_TYPE_VALUE,\n FileEntity,\n FileUploadComplete,\n SortBy,\n UploadCallbackResp,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport dayjs from 'dayjs'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link } from 'react-router'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport CopyToClipboardIcon from '../CopyToClipboardIcon'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport FileUpload from '../FileUpload'\nimport IconSvg from '../IconSvg'\nimport { EntityItem } from './ChallengeSubmission'\n\ntype SubmissionDirectoryRow = {\n id: string\n name: string\n modifiedOn: string\n}\n\ntype SubmissionDirectoryListProps = {\n pageSize: number\n challengeProjectId: string\n entityType: typeof EntityType.dockerrepo | typeof EntityType.file\n onItemSelected: (selected: EntityItem) => void\n}\n\ntype FileUploadAttempt = FileUploadComplete & {\n entityId?: string\n}\n\nfunction SubmissionDirectoryList({\n pageSize,\n challengeProjectId,\n entityType,\n onItemSelected,\n}: SubmissionDirectoryListProps) {\n const queryClient = useQueryClient()\n const { accessToken, keyFactory } = useSynapseContext()\n const [page, setPage] = useState<number>(0)\n const [selectedItem, setSelectedItem] = useState<EntityItem | undefined>()\n const [errorMessage, setErrorMessage] = useState<string>()\n const [canSubmit, setCanSubmit] = useState<boolean>()\n const [fetchedHeaders, setFetchedHeaders] = useState<EntityHeader[]>([])\n const [nextPageToken, setNextPageToken] = useState<string | undefined>()\n const [fetchNextPage, setFetchNextPage] = useState<boolean>(false)\n const [confirmOpen, setConfirmOpen] = useState<boolean>(false)\n const [uploadAttempt, setUploadAttempt] = useState<FileUploadAttempt>()\n\n const PER_PAGE = pageSize\n const HEADERS_PER_PAGE = 50\n const PROJECT_URL = `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${challengeProjectId}`\n\n const request: EntityChildrenRequest = {\n parentId: challengeProjectId,\n nextPageToken: fetchNextPage ? nextPageToken : null,\n includeTypes: [entityType],\n includeTotalChildCount: true,\n sortBy: SortBy.MODIFIED_ON,\n sortDirection: Direction.DESC,\n }\n\n const { data: headerResults, refetch } = useGetEntityChildren(request, {\n enabled: !!challengeProjectId,\n throwOnError: true,\n })\n\n useEffect(() => {\n if (headerResults) {\n const newHeaders = [...fetchedHeaders]\n const headerPage = Math.floor(((page + 1) * PER_PAGE) / HEADERS_PER_PAGE)\n const start = headerPage * HEADERS_PER_PAGE\n newHeaders.splice(start, start + HEADERS_PER_PAGE, ...headerResults.page)\n setFetchedHeaders(newHeaders)\n setFetchNextPage(false)\n setNextPageToken(headerResults.nextPageToken)\n }\n // TODO: Temporary useEffect hook to remove onSuccess QueryOption for @tanstack/react-query v5\n // Refactor this component to remove this effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [headerResults])\n\n function getPageHeaders() {\n const pageStart = page * PER_PAGE\n const pageHeaders = fetchedHeaders.slice(pageStart, pageStart + PER_PAGE)\n return pageHeaders\n }\n\n function reset() {\n setErrorMessage(undefined)\n setCanSubmit(undefined)\n setFetchedHeaders([])\n setNextPageToken(undefined)\n setFetchNextPage(false)\n refetch()\n }\n\n useEffect(() => {\n reset()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [entityType, pageSize])\n\n const queries = useGetEntities(getPageHeaders())\n const entities = useMemo(\n () =>\n queries\n .filter(q => q.status === 'success')\n .map(q => q.data) as EntityItem[],\n [queries],\n )\n const areEntitiesLoading = queries.some(q => q.isLoading)\n\n const entityChangeHandler = async (value: string) => {\n setCanSubmit(false)\n const entity = entities.find(entity => entity?.id === value)\n if (entity) {\n setSelectedItem(entity)\n if (entityType === EntityType.dockerrepo) {\n let commits\n try {\n commits = await SynapseClient.getDockerTag(\n entity.id!,\n accessToken,\n 0,\n 1,\n )\n } catch (e) {\n return setErrorMessage(e.message)\n }\n if (commits.totalNumberOfResults === 0) {\n return setErrorMessage(\n 'No commits have been made to this repository. Please select a repository with at least one commit.',\n )\n }\n }\n setCanSubmit(true)\n setErrorMessage(undefined)\n }\n }\n\n const columns: GridColDef[] = [\n {\n field: 'radiobutton',\n headerName: '',\n width: 25,\n sortable: false,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: params => {\n return (\n <Radio\n value={params.id}\n checked={params.id === selectedItem?.id}\n onChange={event => {\n entityChangeHandler(event.target.value)\n }}\n />\n )\n },\n },\n {\n field: 'name',\n headerName:\n entityType === EntityType.dockerrepo\n ? 'Docker Repository'\n : 'File Name',\n flex: 1,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: (params: GridCellParams<Entity, SubmissionDirectoryRow>) => (\n <Link\n to={{\n pathname: `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${params.row.id}`,\n }}\n target=\"_blank\"\n >\n {params.row.name}\n </Link>\n ),\n },\n {\n field: 'modifiedOn',\n headerName: 'Updated On',\n width: 100,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n {\n field: 'id',\n headerName: 'ID',\n width: 200,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n ]\n\n const getRows = (entities: EntityItem[]) => {\n const newRows: SubmissionDirectoryRow[] = []\n entities.forEach(entity => {\n newRows.push({\n id: entity.id!,\n name:\n entityType === EntityType.dockerrepo\n ? entity.repositoryName ?? entity.name\n : entity.name,\n modifiedOn: formatDate(dayjs(entity.modifiedOn), 'MM/DD/YY'),\n })\n })\n return newRows\n }\n\n const handlePageChange = (newPageNum: number) => {\n const lastIndexNeeded = Math.min(\n headerResults?.totalChildCount ?? 0,\n (newPageNum + 1) * PER_PAGE,\n )\n if (lastIndexNeeded > fetchedHeaders.length) {\n setFetchNextPage(true)\n }\n setPage(newPageNum)\n }\n\n const itemSelectedHandler = () => {\n onItemSelected(selectedItem!)\n }\n\n function createEntity(file: FileUploadAttempt) {\n // Create Entity\n if (!file) return\n const { fileHandleId, fileName } = file\n const newFileEntity: FileEntity = {\n parentId: challengeProjectId,\n name: fileName,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n dataFileHandleId: fileHandleId,\n }\n SynapseClient.createEntity(newFileEntity, accessToken)\n .then(() => {\n reset()\n })\n .catch((err: SynapseClientError) => {\n setErrorMessage(err.reason)\n })\n }\n\n async function updateEntity() {\n if (!uploadAttempt) return\n const { fileHandleId, entityId } = uploadAttempt\n if (!entityId)\n return setErrorMessage('Error: missing entityId. Please try again.')\n // Get the entity\n let entity: FileEntity\n try {\n entity = await SynapseClient.getEntity(accessToken, entityId)\n } catch (err) {\n return setErrorMessage(`The entity ${entityId} could not be retrieved.`)\n }\n\n const updateRequest: FileEntity = {\n id: entity.id,\n name: entity.name,\n dataFileHandleId: fileHandleId,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n parentId: entity.parentId,\n etag: entity.etag,\n modifiedOn: entity.modifiedOn,\n }\n\n try {\n const updatedEntity = await SynapseClient.updateEntity(\n updateRequest,\n accessToken,\n true,\n )\n await invalidateAllQueriesForEntity(\n queryClient,\n keyFactory,\n updatedEntity.id!,\n )\n queryClient.setQueryData(\n keyFactory.getEntityQueryKey(updatedEntity.id!),\n updatedEntity,\n )\n reset()\n } catch (err) {\n setErrorMessage(err.reason)\n }\n }\n\n const handleUpload = async (response: UploadCallbackResp) => {\n if (response.success && response.resp) {\n const { fileName } = response.resp\n\n // Lookup entity\n const entityLookupRequest: EntityLookupRequest = {\n entityName: fileName,\n parentId: challengeProjectId,\n }\n try {\n const entityId = await SynapseClient.lookupChildEntity(\n entityLookupRequest,\n accessToken,\n )\n // Entity exists, prompt user to update it\n if (entityId) {\n setUploadAttempt({ ...response.resp, entityId: entityId.id })\n setConfirmOpen(true)\n }\n } catch (err) {\n // An existing entity was not found for this file, create it\n setUploadAttempt(undefined)\n createEntity(response.resp)\n }\n } else if (!response.success && response.error) {\n setErrorMessage(response.error.reason as string)\n } else {\n setErrorMessage('An unknown error occurred. Please try again.')\n }\n }\n\n return (\n <Box>\n <Box\n sx={{\n display: 'flex',\n backgroundColor: '#FBFBFC',\n padding: '10px',\n justifyContent: 'space-between',\n }}\n >\n <Typography\n variant=\"h6\"\n sx={{ fontSize: '18px', lineHeight: '20px', fontWeight: 700 }}\n >\n {entityType === EntityType.file\n ? 'Submit File'\n : 'Submit Docker Image'}\n </Typography>\n <Box sx={{ display: 'flex' }}>\n <Typography\n variant=\"body1\"\n sx={{ fontSize: '14px', color: '#71767F' }}\n >\n Your Project SynID:{' '}\n <Link to={{ pathname: PROJECT_URL }} target=\"_blank\">\n {challengeProjectId}\n </Link>\n </Typography>\n <CopyToClipboardIcon value={PROJECT_URL} sx={{ marginTop: '-4px' }} />\n </Box>\n </Box>\n <Box\n sx={{\n my: 3,\n display: 'flex',\n }}\n >\n <NotesTwoTone\n sx={{\n width: '16px',\n height: '16px',\n verticalAlign: 'text-bottom',\n }}\n />\n <Box\n sx={{\n ml: 1,\n }}\n >\n {entityType === EntityType.file && (\n <>\n Choose a prediction file from your submission directory below and\n click \"Submit Selection\" to pick an evaluation queue. If you need\n to add a new file, click \"Upload File\" first.\n </>\n )}\n {entityType === EntityType.dockerrepo && (\n <>\n Choose a Docker image from your submission directory below and\n click \"Submit Selection\" to pick an image version and evaluation\n queue. If you need to upload a new image to your project (\n <code>{challengeProjectId}</code>), see our{' '}\n <Link\n to=\"https://github.com/Sage-Bionetworks-Challenges/sample-model-templates#build-your-model\"\n target=\"_blank\"\n >\n Docker model submission guide\n </Link>{' '}\n for command-line instructions on how to build and upload.\n </>\n )}\n </Box>\n </Box>\n <Box>\n <DataGrid\n loading={areEntitiesLoading}\n columns={columns}\n rows={getRows(entities)}\n rowCount={headerResults?.totalChildCount ?? 0}\n pagination\n paginationMode=\"server\"\n paginationModel={{ page, pageSize: PER_PAGE }}\n pageSizeOptions={[PER_PAGE]}\n onPaginationModelChange={({ page }) => {\n handlePageChange(page)\n }}\n density=\"compact\"\n autoHeight\n sx={{\n fontSize: '14px',\n border: 'none',\n height: '100%',\n '& .MuiDataGrid-columnHeader': {\n backgroundColor: '#F1F3F5',\n },\n '& .Mui-odd': {\n backgroundColor: '#FBFBFC',\n },\n '.MuiDataGrid-columnHeaderTitleContainer': {\n justifyContent: 'space-between',\n },\n '.radio': {\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n },\n }}\n getRowClassName={params =>\n params.indexRelativeToCurrentPage % 2 === 0 ? 'Mui-even' : 'Mui-odd'\n }\n />\n </Box>\n {errorMessage && <ErrorBanner error={errorMessage}></ErrorBanner>}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n {entityType === EntityType.file && (\n <FileUpload\n label=\"Upload File\"\n buttonProps={{\n variant: 'outlined',\n endIcon: <IconSvg icon=\"upload\" />,\n sx: { lineHeight: 1 },\n }}\n onComplete={resp => {\n handleUpload(resp)\n }}\n />\n )}\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={itemSelectedHandler}\n disabled={!canSubmit}\n >\n Submit Selection\n </Button>\n </Box>\n <ConfirmationDialog\n open={confirmOpen}\n title=\"File exists\"\n content={\n <Typography variant=\"body1\" sx={{ fontSize: '16px' }}>\n A file named "{uploadAttempt?.fileName}" (\n {uploadAttempt?.entityId}) already exists in this location. Do you\n want to update the existing file and create a new version?\n </Typography>\n }\n onCancel={() => setConfirmOpen(false)}\n onConfirm={() => {\n updateEntity()\n setConfirmOpen(false)\n }}\n />\n </Box>\n )\n}\n\nexport default SubmissionDirectoryList\n"],"mappings":"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"}
|