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.
Files changed (89) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/assets/icons/CloudWarning.d.ts +5 -0
  3. package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
  4. package/dist/assets/icons/CloudWarning.js +47 -0
  5. package/dist/assets/icons/CloudWarning.js.map +1 -0
  6. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
  7. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
  8. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  9. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  10. package/dist/components/DataGrid/columns/AutocompleteColumn.js +66 -55
  11. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  12. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  13. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +1 -1
  14. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  15. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  16. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  17. package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
  18. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  19. package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
  20. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  21. package/dist/components/DataGrid/utils/columnFactory.js +47 -44
  22. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  23. package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
  24. package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
  25. package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
  26. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
  27. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  28. package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
  29. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  30. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
  31. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
  32. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
  33. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
  34. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
  35. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  36. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
  37. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  38. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
  39. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
  40. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
  41. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  42. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
  43. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  44. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  45. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
  46. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  47. package/dist/components/Forum/DiscussionReply.d.ts +1 -0
  48. package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
  49. package/dist/components/Forum/DiscussionReply.js +19 -19
  50. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  51. package/dist/components/Forum/DiscussionThread.d.ts +1 -0
  52. package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
  53. package/dist/components/Forum/DiscussionThread.js +73 -72
  54. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  55. package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
  56. package/dist/components/GenericCard/BioregistryRules.js +7 -3
  57. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  58. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  59. package/dist/components/IconSvg/IconSvg.js +2 -1
  60. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  61. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  62. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
  63. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  64. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  65. package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
  66. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  67. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  68. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  69. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  70. package/dist/synapse-queries/KeyFactory.d.ts +1 -0
  71. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  72. package/dist/synapse-queries/KeyFactory.js +3 -0
  73. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  74. package/dist/synapse-queries/forum/useThread.d.ts +1 -0
  75. package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
  76. package/dist/synapse-queries/forum/useThread.js +19 -12
  77. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  78. package/dist/tsconfig.build.tsbuildinfo +1 -1
  79. package/dist/utils/APIConstants.d.ts +1 -0
  80. package/dist/utils/APIConstants.d.ts.map +1 -1
  81. package/dist/utils/APIConstants.js +2 -2
  82. package/dist/utils/APIConstants.js.map +1 -1
  83. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  84. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
  85. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  86. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  87. package/dist/utils/functions/EntityTypeUtils.js +15 -4
  88. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  89. 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.10";
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,5 @@
1
+ import React from 'react';
2
+ import { SvgIconProps } from '@mui/material/SvgIcon';
3
+ declare const CloudWarning: (props: SvgIconProps) => React.ReactNode;
4
+ export default CloudWarning;
5
+ //# sourceMappingURL=CloudWarning.d.ts.map
@@ -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,2CAub9B;AAED,eAAe,uBAAuB,CAAA"}
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 ee } from "../../synapse-queries/QueryFilterUtils.js";
5
+ import { invalidateAllQueriesForEntity as a } from "../../synapse-queries/QueryFilterUtils.js";
6
6
  import "../../utils/index.js";
7
- import { useGetEntities as te } from "../../synapse-queries/entity/useEntity.js";
8
- import { useGetEntityChildren as ne } from "../../synapse-queries/entity/useGetEntityChildren.js";
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 a from "../ConfirmationDialog/index.js";
11
- import { formatDate as re } from "../../utils/functions/DateFormatter.js";
12
- import o from "../IconSvg/index.js";
13
- import { CopyToClipboardIcon as s } from "../CopyToClipboardIcon.js";
14
- import ie from "../FileUpload/index.js";
15
- import { useEffect as c, useMemo as l, useState as u } from "react";
16
- import { Box as d, Button as ae, Radio as oe, Typography as f } from "@mui/material";
17
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
18
- import { Direction as h, FILE_ENTITY_CONCRETE_TYPE_VALUE as g, SortBy as se } from "@sage-bionetworks/synapse-types";
19
- import { EntityType as _ } from "@sage-bionetworks/synapse-client";
20
- import { useQueryClient as v } from "@tanstack/react-query";
21
- import { InfoTwoTone as y } from "@mui/icons-material";
22
- import { Link as b } from "react-router";
23
- import x from "dayjs";
24
- import { DataGrid as S } from "@mui/x-data-grid";
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 C({ pageSize: C, challengeProjectId: w, entityType: T, onItemSelected: E }) {
27
- let D = v(), { accessToken: O, keyFactory: k } = i(), [A, ce] = u(0), [j, M] = u(), [N, P] = u(), [F, I] = u(), [L, R] = u([]), [z, B] = u(), [V, H] = u(!1), [U, W] = u(!1), [G, K] = u(), q = C, J = `${t(e.PORTAL_ENDPOINT)}Synapse:${w}`, { data: Y, refetch: le } = ne({
28
- parentId: w,
29
- nextPageToken: V ? z : null,
30
- includeTypes: [T],
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: se.MODIFIED_ON,
33
- sortDirection: h.DESC
32
+ sortBy: ae.MODIFIED_ON,
33
+ sortDirection: ie.DESC
34
34
  }, {
35
- enabled: !!w,
35
+ enabled: !!T,
36
36
  throwOnError: !0
37
37
  });
38
- c(() => {
39
- if (Y) {
40
- let e = [...L], t = Math.floor((A + 1) * q / 50) * 50;
41
- e.splice(t, t + 50, ...Y.page), R(e), H(!1), B(Y.nextPageToken);
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
- }, [Y]);
43
+ }, [X]);
44
44
  function ue() {
45
- let e = A * q;
46
- return L.slice(e, e + q);
45
+ let e = j * J;
46
+ return R.slice(e, e + J);
47
47
  }
48
- function X() {
49
- P(void 0), I(void 0), R([]), B(void 0), H(!1), le();
48
+ function Z() {
49
+ F(void 0), L(void 0), z([]), V(void 0), U(!1), le();
50
50
  }
51
- c(() => {
52
- X();
53
- }, [T, C]);
54
- let Z = te(ue()), Q = l(() => Z.filter((e) => e.status === "success").map((e) => e.data), [Z]), de = Z.some((e) => e.isLoading), fe = async (e) => {
55
- I(!1);
56
- let t = Q.find((t) => t?.id === e);
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 (M(t), T === _.dockerrepo) {
58
+ if (N(t), E === b.dockerrepo) {
59
59
  let e;
60
60
  try {
61
- e = await n.getDockerTag(t.id, O, 0, 1);
61
+ e = await n.getDockerTag(t.id, k, 0, 1);
62
62
  } catch (e) {
63
- return P(e.message);
63
+ return F(e.message);
64
64
  }
65
- if (e.totalNumberOfResults === 0) return P("No commits have been made to this repository. Please select a repository with at least one commit.");
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
- I(!0), P(void 0);
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__ */ p(oe, {
78
+ renderCell: (e) => /* @__PURE__ */ _(m, {
79
79
  value: e.id,
80
- checked: e.id === j?.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: T === _.dockerrepo ? "Docker Repository" : "File Name",
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__ */ p(b, {
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
- ], pe = (e) => {
115
+ ], me = (e) => {
116
116
  let t = [];
117
117
  return e.forEach((e) => {
118
118
  t.push({
119
119
  id: e.id,
120
- name: T === _.dockerrepo ? e.repositoryName ?? e.name : e.name,
121
- modifiedOn: re(x(e.modifiedOn), "MM/DD/YY")
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
- }, me = (e) => {
125
- Math.min(Y?.totalChildCount ?? 0, (e + 1) * q) > L.length && H(!0), ce(e);
126
- }, he = () => {
127
- E(j);
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 ge(e) {
129
+ function _e(e) {
130
130
  if (!e) return;
131
131
  let { fileHandleId: t, fileName: r } = e, i = {
132
- parentId: w,
132
+ parentId: T,
133
133
  name: r,
134
- concreteType: g,
134
+ concreteType: y,
135
135
  dataFileHandleId: t
136
136
  };
137
- n.createEntity(i, O).then(() => {
138
- X();
137
+ n.createEntity(i, k).then(() => {
138
+ Z();
139
139
  }).catch((e) => {
140
- P(e.reason);
140
+ F(e.reason);
141
141
  });
142
142
  }
143
- async function _e() {
144
- if (!G) return;
145
- let { fileHandleId: e, entityId: t } = G;
146
- if (!t) return P("Error: missing entityId. Please try again.");
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(O, t);
149
+ r = await n.getEntity(k, t);
150
150
  } catch {
151
- return P(`The entity ${t} could not be retrieved.`);
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: g,
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, O, !0);
164
- await ee(D, k, e.id), D.setQueryData(k.getEntityQueryKey(e.id), e), X();
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
- P(e.reason);
166
+ F(e.reason);
167
167
  }
168
168
  }
169
- let ve = async (e) => {
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: w
173
+ parentId: T
174
174
  };
175
175
  try {
176
- let t = await n.lookupChildEntity(r, O);
177
- t && (K({
176
+ let t = await n.lookupChildEntity(r, k);
177
+ t && (q({
178
178
  ...e.resp,
179
179
  entityId: t.id
180
- }), W(!0));
180
+ }), G(!0));
181
181
  } catch {
182
- K(void 0), ge(e.resp);
182
+ q(void 0), _e(e.resp);
183
183
  }
184
- } else !e.success && e.error ? P(e.error.reason) : P("An unknown error occurred. Please try again.");
184
+ } else !e.success && e.error ? F(e.error.reason) : F("An unknown error occurred. Please try again.");
185
185
  };
186
- return /* @__PURE__ */ m(d, { children: [
187
- /* @__PURE__ */ m(d, {
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__ */ p(f, {
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: "Your Submission Directory"
202
- }), /* @__PURE__ */ m(d, {
201
+ children: E === b.file ? "Submit File" : "Submit Docker Image"
202
+ }), /* @__PURE__ */ v(p, {
203
203
  sx: { display: "flex" },
204
- children: [/* @__PURE__ */ m(f, {
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__ */ p(b, {
214
- to: { pathname: J },
213
+ /* @__PURE__ */ _(S, {
214
+ to: { pathname: Y },
215
215
  target: "_blank",
216
- children: w
216
+ children: T
217
217
  })
218
218
  ]
219
- }), /* @__PURE__ */ p(s, {
220
- value: J,
219
+ }), /* @__PURE__ */ _(ne, {
220
+ value: Y,
221
221
  sx: { marginTop: "-4px" }
222
222
  })]
223
223
  })]
224
224
  }),
225
- /* @__PURE__ */ p(d, { children: /* @__PURE__ */ p(S, {
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: pe(Q),
229
- rowCount: Y?.totalChildCount ?? 0,
253
+ columns: pe,
254
+ rows: me($),
255
+ rowCount: X?.totalChildCount ?? 0,
230
256
  pagination: !0,
231
257
  paginationMode: "server",
232
258
  paginationModel: {
233
- page: A,
234
- pageSize: q
259
+ page: j,
260
+ pageSize: J
235
261
  },
236
- pageSizeOptions: [q],
262
+ pageSizeOptions: [J],
237
263
  onPaginationModelChange: ({ page: e }) => {
238
- me(e);
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
- N && /* @__PURE__ */ p(r, { error: N }),
258
- /* @__PURE__ */ m(d, {
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: [T === _.file && /* @__PURE__ */ p(ie, {
289
+ children: [E === b.file && /* @__PURE__ */ _(l, {
264
290
  label: "Upload File",
265
291
  buttonProps: {
266
292
  variant: "outlined",
267
- endIcon: /* @__PURE__ */ p(o, { icon: "upload" }),
293
+ endIcon: /* @__PURE__ */ _(te, { icon: "upload" }),
268
294
  sx: { lineHeight: 1 }
269
295
  },
270
296
  onComplete: (e) => {
271
- ve(e);
297
+ ye(e);
272
298
  }
273
- }), /* @__PURE__ */ p(ae, {
299
+ }), /* @__PURE__ */ _(re, {
274
300
  color: "primary",
275
301
  variant: "contained",
276
- onClick: he,
277
- disabled: !F,
302
+ onClick: ge,
303
+ disabled: !I,
278
304
  children: "Submit Selection"
279
305
  })]
280
306
  }),
281
- T === _.dockerrepo && /* @__PURE__ */ m(d, {
282
- sx: {
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__ */ m(f, {
310
+ content: /* @__PURE__ */ v(h, {
308
311
  variant: "body1",
309
312
  sx: { fontSize: "16px" },
310
313
  children: [
311
314
  "A file named \"",
312
- G?.fileName,
315
+ K?.fileName,
313
316
  "\" (",
314
- G?.entityId,
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: () => W(!1),
321
+ onCancel: () => G(!1),
319
322
  onConfirm: () => {
320
- _e(), W(!1);
323
+ ve(), G(!1);
321
324
  }
322
325
  })
323
326
  ] });
324
327
  }
325
328
  //#endregion
326
- export { C as default };
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 &quot;{uploadAttempt?.fileName}&quot; (\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 &quot;{uploadAttempt?.fileName}&quot; (\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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"}