synapse-react-client 4.0.18 → 4.0.19
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.d.ts +2 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +3 -1
- package/dist/SWC.index.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.css +1 -0
- package/dist/components/DataExplorer/DataExplorer.d.ts +13 -0
- package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.js +119 -0
- package/dist/components/DataExplorer/DataExplorer.js.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.module.js +22 -0
- package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.module.scss +156 -0
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +106 -102
- 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 +97 -89
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +19 -8
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js +64 -43
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.d.ts.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +9 -9
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +8 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +67 -65
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +1 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +9 -9
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/MultiValueField.js +4 -4
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +25 -25
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts +18 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js +116 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js.map +1 -0
- package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts +5 -5
- package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +27 -76
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts +19 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js +41 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js.map +1 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts +12 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js +25 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js.map +1 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts +18 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js +55 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js.map +1 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts +19 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.js +35 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.js.map +1 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts +22 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.js +32 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.js.map +1 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts +14 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js +23 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js.map +1 -0
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +67 -67
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +37 -34
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.d.ts +6 -3
- package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.js +2 -2
- package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/featureflag/FeatureFlags.d.ts +2 -1
- package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
- package/dist/utils/featureflag/FeatureFlags.js +1 -1
- package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
- package/package.json +4 -4
|
@@ -9,39 +9,39 @@ import { FinderScope as o } from "../../../../components/EntityFinder/tree/Entit
|
|
|
9
9
|
import s from "../../../../components/WizardChoiceButton/WizardChoiceButton.js";
|
|
10
10
|
import ee from "../../../../components/WizardChoiceButton/WizardChoiceButtonGroup.js";
|
|
11
11
|
import { useCreateCurationTask as te, useUpdateCurationTask as ne } from "../../../../synapse-queries/curation/task/useCurationTask.js";
|
|
12
|
-
import { ASSIGNEE_TOOLTIP as re,
|
|
12
|
+
import { ASSIGNEE_TOOLTIP as re, AUTH_MODE_NONE_TITLE as ie, AUTH_MODE_NONE_TOOLTIP as ae, AUTH_MODE_SESSION_OWNER_TITLE as oe, AUTH_MODE_SESSION_OWNER_TOOLTIP as se, AUTH_MODE_SOURCE_BENEFACTOR_TITLE as ce, AUTH_MODE_SOURCE_BENEFACTOR_TOOLTIP as le, COLLABORATORS_TOOLTIP as ue, CREATE_CURATION_TASK_DIALOG_TITLE as de, EDIT_CURATION_TASK_DIALOG_TITLE as fe, FILE_BASED_FILE_VIEW_INPUT_DESCRIPTION as pe, FILE_BASED_TASK_DESCRIPTION as me, FILE_BASED_TASK_TITLE as he, FILE_BASED_UPLOAD_FOLDER_INPUT_DESCRIPTION as ge, FILE_VIEW_FINDER_PROMPT as _e, FILE_VIEW_FINDER_TITLE as ve, RECORD_BASED_RECORD_SET_INPUT_DESCRIPTION as ye, RECORD_BASED_TASK_DESCRIPTION as be, RECORD_BASED_TASK_TITLE as xe, RECORD_SET_FINDER_PROMPT as Se, RECORD_SET_FINDER_TITLE as Ce, SELECT_TASK_TYPE_DESCRIPTION as we, TASK_INSTRUCTIONS_INPUT_DESCRIPTION as Te, TASK_NAME_INPUT_DESCRIPTION as Ee, UPLOAD_FOLDER_FINDER_PROMPT as De, UPLOAD_FOLDER_FINDER_TITLE as Oe } from "../utils/constants.js";
|
|
13
13
|
import c from "../../../../components/EntityFinder/EntityIdTextField.js";
|
|
14
14
|
import { useState as l } from "react";
|
|
15
|
-
import { Alert as u, Box as d, Button as f, FormControl as
|
|
15
|
+
import { Alert as u, Box as d, Button as f, FormControl as ke, FormControlLabel as p, FormLabel as Ae, Grid as m, IconButton as je, InputLabel as h, Radio as g, RadioGroup as Me, Stack as _, Tooltip as v, Typography as y } from "@mui/material";
|
|
16
16
|
import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
17
17
|
import { TYPE_FILTER as C } from "@sage-bionetworks/synapse-types";
|
|
18
18
|
import { EntityType as w, FileBasedMetadataTaskPropertiesConcreteTypeEnum as T, RecordBasedMetadataTaskPropertiesConcreteTypeEnum as E } from "@sage-bionetworks/synapse-client";
|
|
19
19
|
import { HelpTwoTone as D } from "@mui/icons-material";
|
|
20
|
-
import
|
|
20
|
+
import Ne from "@mui/icons-material/Close";
|
|
21
21
|
//#region src/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.tsx
|
|
22
22
|
var O = T.org_sagebionetworks_repo_model_curation_metadata_FileBasedMetadataTaskProperties, k = E.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties;
|
|
23
|
-
function
|
|
23
|
+
function Pe(e) {
|
|
24
24
|
return e === "SESSION_OWNER" || e === "SOURCE_BENEFACTOR" ? e : "NONE";
|
|
25
25
|
}
|
|
26
26
|
function A(T) {
|
|
27
|
-
let { open: E, onCancel: A, onSuccess: j, projectId:
|
|
27
|
+
let { open: E, onCancel: A, onSuccess: j, projectId: Fe, task: M } = T, N = M !== void 0, [P, F] = l(() => M ? "COMMON_MUTABLE_FIELDS" : "SELECT_TYPE"), [I, L] = l(() => {
|
|
28
28
|
let e = M?.taskProperties?.concreteType;
|
|
29
29
|
return e === O || e === k ? e : null;
|
|
30
|
-
}), [R,
|
|
30
|
+
}), [R, Ie] = l(() => M?.dataType ?? ""), [z, Le] = l(() => M?.instructions ?? ""), [B, Re] = l(() => M?.assigneePrincipalId), V = Pe(M?.taskProperties?.suggestedAuthorizationMode), [H, ze] = l(V), [Be] = l(V), [U, Ve] = l(() => {
|
|
31
31
|
let e = M?.taskProperties;
|
|
32
32
|
return e?.concreteType === O ? e.uploadFolderId ?? "" : "";
|
|
33
|
-
}), [W,
|
|
33
|
+
}), [W, He] = l(() => {
|
|
34
34
|
let e = M?.taskProperties;
|
|
35
35
|
return e?.concreteType === O ? e.fileViewId ?? "" : "";
|
|
36
|
-
}), [G,
|
|
36
|
+
}), [G, Ue] = l(() => {
|
|
37
37
|
let e = M?.taskProperties;
|
|
38
38
|
return e?.concreteType === k ? e.recordSetId ?? "" : "";
|
|
39
|
-
}), [K, q] = l(() => M?.taskProperties?.collaboratorPrincipalIds ?? []), [J, Y] = l(null), { mutate:
|
|
39
|
+
}), [K, q] = l(() => M?.taskProperties?.collaboratorPrincipalIds ?? []), [J, Y] = l(null), { mutate: We, isPending: Ge, error: Ke } = te({ onSuccess: (e) => {
|
|
40
40
|
j(e);
|
|
41
|
-
} }), { mutate:
|
|
41
|
+
} }), { mutate: qe, isPending: Je, error: Ye } = ne({ onSuccess: (e) => {
|
|
42
42
|
j(e);
|
|
43
|
-
} }), X =
|
|
44
|
-
function
|
|
43
|
+
} }), X = Ge || Je, Z = Ke ?? Ye, Xe = I === O && U && W || I === k && G;
|
|
44
|
+
function Ze() {
|
|
45
45
|
let e = H === "NONE" ? void 0 : H, t = I, n, r = K.length > 0 ? K : void 0;
|
|
46
46
|
return n = t === O ? {
|
|
47
47
|
concreteType: O,
|
|
@@ -56,20 +56,20 @@ function A(T) {
|
|
|
56
56
|
collaboratorPrincipalIds: r
|
|
57
57
|
}, {
|
|
58
58
|
...N ? M : {},
|
|
59
|
-
projectId:
|
|
59
|
+
projectId: Fe,
|
|
60
60
|
dataType: R || void 0,
|
|
61
61
|
instructions: z || void 0,
|
|
62
62
|
assigneePrincipalId: B || void 0,
|
|
63
63
|
taskProperties: n
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
|
-
function
|
|
67
|
-
let e =
|
|
68
|
-
N ?
|
|
66
|
+
function Qe() {
|
|
67
|
+
let e = Ze();
|
|
68
|
+
N ? qe(e) : We(e);
|
|
69
69
|
}
|
|
70
|
-
let
|
|
70
|
+
let $e = N && H !== Be, et = /* @__PURE__ */ S(ke, { children: [/* @__PURE__ */ x(Ae, { children: "Authorization Mode" }), /* @__PURE__ */ S(Me, {
|
|
71
71
|
value: H,
|
|
72
|
-
onChange: (e, t) =>
|
|
72
|
+
onChange: (e, t) => ze(t),
|
|
73
73
|
children: [
|
|
74
74
|
/* @__PURE__ */ x(p, {
|
|
75
75
|
value: "NONE",
|
|
@@ -82,9 +82,9 @@ function A(T) {
|
|
|
82
82
|
},
|
|
83
83
|
children: [/* @__PURE__ */ x(y, {
|
|
84
84
|
variant: "body1",
|
|
85
|
-
children:
|
|
85
|
+
children: ie
|
|
86
86
|
}), /* @__PURE__ */ x(v, {
|
|
87
|
-
title:
|
|
87
|
+
title: ae,
|
|
88
88
|
children: /* @__PURE__ */ x(D, { sx: { color: "grey.700" } })
|
|
89
89
|
})]
|
|
90
90
|
})
|
|
@@ -100,9 +100,9 @@ function A(T) {
|
|
|
100
100
|
},
|
|
101
101
|
children: [/* @__PURE__ */ x(y, {
|
|
102
102
|
variant: "body1",
|
|
103
|
-
children:
|
|
103
|
+
children: oe
|
|
104
104
|
}), /* @__PURE__ */ x(v, {
|
|
105
|
-
title:
|
|
105
|
+
title: se,
|
|
106
106
|
children: /* @__PURE__ */ x(D, { sx: { color: "grey.700" } })
|
|
107
107
|
})]
|
|
108
108
|
})
|
|
@@ -118,15 +118,15 @@ function A(T) {
|
|
|
118
118
|
},
|
|
119
119
|
children: [/* @__PURE__ */ x(y, {
|
|
120
120
|
variant: "body1",
|
|
121
|
-
children:
|
|
121
|
+
children: ce
|
|
122
122
|
}), /* @__PURE__ */ x(v, {
|
|
123
|
-
title:
|
|
123
|
+
title: le,
|
|
124
124
|
children: /* @__PURE__ */ x(D, { sx: { color: "grey.700" } })
|
|
125
125
|
})]
|
|
126
126
|
})
|
|
127
127
|
})
|
|
128
128
|
]
|
|
129
|
-
})] }),
|
|
129
|
+
})] }), tt = /* @__PURE__ */ S(d, { children: [/* @__PURE__ */ S(d, {
|
|
130
130
|
sx: {
|
|
131
131
|
display: "flex",
|
|
132
132
|
alignItems: "center",
|
|
@@ -142,18 +142,18 @@ function A(T) {
|
|
|
142
142
|
}), /* @__PURE__ */ x(i, {
|
|
143
143
|
inputId: "dlg-set-task-assignee",
|
|
144
144
|
defaultValue: B,
|
|
145
|
-
onChange: (e) =>
|
|
145
|
+
onChange: (e) => Re(e ?? void 0),
|
|
146
146
|
typeFilter: C.ALL
|
|
147
|
-
}, E.toString())] }),
|
|
147
|
+
}, E.toString())] }), nt = /* @__PURE__ */ S(_, {
|
|
148
148
|
gap: 2,
|
|
149
149
|
children: [
|
|
150
150
|
/* @__PURE__ */ x(n, {
|
|
151
151
|
label: "Task Name",
|
|
152
152
|
fullWidth: !0,
|
|
153
153
|
value: R,
|
|
154
|
-
onChange: (e) =>
|
|
154
|
+
onChange: (e) => Ie(e.target.value),
|
|
155
155
|
required: !0,
|
|
156
|
-
description:
|
|
156
|
+
description: Ee
|
|
157
157
|
}),
|
|
158
158
|
/* @__PURE__ */ x(n, {
|
|
159
159
|
label: "Instructions",
|
|
@@ -161,8 +161,8 @@ function A(T) {
|
|
|
161
161
|
multiline: !0,
|
|
162
162
|
minRows: 3,
|
|
163
163
|
value: z,
|
|
164
|
-
onChange: (e) =>
|
|
165
|
-
description:
|
|
164
|
+
onChange: (e) => Le(e.target.value),
|
|
165
|
+
description: Te
|
|
166
166
|
}),
|
|
167
167
|
/* @__PURE__ */ S(d, {
|
|
168
168
|
display: "none",
|
|
@@ -173,7 +173,7 @@ function A(T) {
|
|
|
173
173
|
gap: .5
|
|
174
174
|
},
|
|
175
175
|
children: [/* @__PURE__ */ x(h, { children: "Collaborators" }), /* @__PURE__ */ x(v, {
|
|
176
|
-
title:
|
|
176
|
+
title: ue,
|
|
177
177
|
children: /* @__PURE__ */ x("div", { children: /* @__PURE__ */ x(D, { sx: { color: "grey.700" } }) })
|
|
178
178
|
})]
|
|
179
179
|
}), /* @__PURE__ */ S(_, {
|
|
@@ -202,26 +202,26 @@ function A(T) {
|
|
|
202
202
|
direction: "row",
|
|
203
203
|
alignItems: "center",
|
|
204
204
|
justifyContent: "space-between",
|
|
205
|
-
children: [/* @__PURE__ */ x(r, { principalId: e }), /* @__PURE__ */ x(
|
|
205
|
+
children: [/* @__PURE__ */ x(r, { principalId: e }), /* @__PURE__ */ x(je, {
|
|
206
206
|
size: "small",
|
|
207
207
|
onClick: () => q((t) => t.filter((t) => t !== e)),
|
|
208
|
-
children: /* @__PURE__ */ x(
|
|
208
|
+
children: /* @__PURE__ */ x(Ne, { fontSize: "small" })
|
|
209
209
|
})]
|
|
210
210
|
}, e))]
|
|
211
211
|
})]
|
|
212
212
|
})
|
|
213
213
|
]
|
|
214
|
-
}),
|
|
214
|
+
}), rt = /* @__PURE__ */ S(_, {
|
|
215
215
|
gap: 2,
|
|
216
216
|
children: [/* @__PURE__ */ x(c, {
|
|
217
217
|
label: "Upload Folder ID",
|
|
218
218
|
value: U,
|
|
219
|
-
description:
|
|
220
|
-
onChange:
|
|
219
|
+
description: ge,
|
|
220
|
+
onChange: Ve,
|
|
221
221
|
disabled: N,
|
|
222
222
|
entityFinderModalProps: {
|
|
223
|
-
title:
|
|
224
|
-
promptCopy:
|
|
223
|
+
title: Oe,
|
|
224
|
+
promptCopy: De,
|
|
225
225
|
confirmButtonCopy: "Select",
|
|
226
226
|
configuration: {
|
|
227
227
|
initialScope: o.ALL_PROJECTS,
|
|
@@ -235,12 +235,12 @@ function A(T) {
|
|
|
235
235
|
}), /* @__PURE__ */ x(c, {
|
|
236
236
|
label: "File View ID",
|
|
237
237
|
value: W,
|
|
238
|
-
description:
|
|
239
|
-
onChange:
|
|
238
|
+
description: pe,
|
|
239
|
+
onChange: He,
|
|
240
240
|
disabled: N,
|
|
241
241
|
entityFinderModalProps: {
|
|
242
|
-
title:
|
|
243
|
-
promptCopy:
|
|
242
|
+
title: ve,
|
|
243
|
+
promptCopy: _e,
|
|
244
244
|
confirmButtonCopy: "Select",
|
|
245
245
|
configuration: {
|
|
246
246
|
initialScope: o.ALL_PROJECTS,
|
|
@@ -252,15 +252,15 @@ function A(T) {
|
|
|
252
252
|
}
|
|
253
253
|
}
|
|
254
254
|
})]
|
|
255
|
-
}),
|
|
255
|
+
}), it = /* @__PURE__ */ x(c, {
|
|
256
256
|
label: "Record Set ID",
|
|
257
257
|
value: G,
|
|
258
|
-
description:
|
|
259
|
-
onChange:
|
|
258
|
+
description: ye,
|
|
259
|
+
onChange: Ue,
|
|
260
260
|
disabled: N,
|
|
261
261
|
entityFinderModalProps: {
|
|
262
|
-
title:
|
|
263
|
-
promptCopy:
|
|
262
|
+
title: Ce,
|
|
263
|
+
promptCopy: Se,
|
|
264
264
|
confirmButtonCopy: "Select",
|
|
265
265
|
configuration: {
|
|
266
266
|
initialScope: o.ALL_PROJECTS,
|
|
@@ -271,28 +271,28 @@ function A(T) {
|
|
|
271
271
|
selectableTypes: [w.recordset]
|
|
272
272
|
}
|
|
273
273
|
}
|
|
274
|
-
}),
|
|
274
|
+
}), at = /* @__PURE__ */ S(_, {
|
|
275
275
|
gap: 2,
|
|
276
276
|
children: [/* @__PURE__ */ x(y, {
|
|
277
277
|
variant: "body1",
|
|
278
|
-
children:
|
|
278
|
+
children: we
|
|
279
279
|
}), /* @__PURE__ */ S(ee, { children: [/* @__PURE__ */ x(s, {
|
|
280
|
-
title:
|
|
281
|
-
description:
|
|
280
|
+
title: he,
|
|
281
|
+
description: me,
|
|
282
282
|
onClick: () => {
|
|
283
283
|
L(O), F("TYPE_SPECIFIC_FIELDS");
|
|
284
284
|
}
|
|
285
285
|
}), /* @__PURE__ */ x(s, {
|
|
286
|
-
title:
|
|
287
|
-
description:
|
|
286
|
+
title: xe,
|
|
287
|
+
description: be,
|
|
288
288
|
onClick: () => {
|
|
289
289
|
L(k), F("TYPE_SPECIFIC_FIELDS");
|
|
290
290
|
}
|
|
291
291
|
})] })]
|
|
292
|
-
}),
|
|
292
|
+
}), ot = /* @__PURE__ */ S(_, {
|
|
293
293
|
gap: 2,
|
|
294
|
-
children: [I === O &&
|
|
295
|
-
}),
|
|
294
|
+
children: [I === O && rt, I === k && it]
|
|
295
|
+
}), st = /* @__PURE__ */ S(_, {
|
|
296
296
|
gap: 3,
|
|
297
297
|
children: [
|
|
298
298
|
/* @__PURE__ */ S(m, {
|
|
@@ -306,7 +306,7 @@ function A(T) {
|
|
|
306
306
|
},
|
|
307
307
|
children: /* @__PURE__ */ x(_, {
|
|
308
308
|
gap: 2,
|
|
309
|
-
children:
|
|
309
|
+
children: nt
|
|
310
310
|
})
|
|
311
311
|
}), /* @__PURE__ */ x(m, {
|
|
312
312
|
size: {
|
|
@@ -315,7 +315,7 @@ function A(T) {
|
|
|
315
315
|
},
|
|
316
316
|
children: /* @__PURE__ */ S(_, {
|
|
317
317
|
gap: 3,
|
|
318
|
-
children: [
|
|
318
|
+
children: [tt, et]
|
|
319
319
|
})
|
|
320
320
|
})]
|
|
321
321
|
}),
|
|
@@ -323,7 +323,7 @@ function A(T) {
|
|
|
323
323
|
severity: "error",
|
|
324
324
|
children: "This task has an unrecognized task type and cannot be edited here."
|
|
325
325
|
}),
|
|
326
|
-
|
|
326
|
+
$e && /* @__PURE__ */ x(u, {
|
|
327
327
|
severity: "warning",
|
|
328
328
|
children: "Changing the Authorization Mode will clear the active session ID on this task. Any in-progress grid session linked to this task will no longer be associated with it."
|
|
329
329
|
}),
|
|
@@ -332,16 +332,16 @@ function A(T) {
|
|
|
332
332
|
children: Z.reason ?? "An error occurred. Please try again."
|
|
333
333
|
})
|
|
334
334
|
]
|
|
335
|
-
}),
|
|
335
|
+
}), ct = N ? fe : de, Q = null;
|
|
336
336
|
switch (P) {
|
|
337
337
|
case "SELECT_TYPE":
|
|
338
|
-
Q =
|
|
338
|
+
Q = at;
|
|
339
339
|
break;
|
|
340
340
|
case "TYPE_SPECIFIC_FIELDS":
|
|
341
|
-
Q =
|
|
341
|
+
Q = ot;
|
|
342
342
|
break;
|
|
343
343
|
case "COMMON_MUTABLE_FIELDS":
|
|
344
|
-
Q =
|
|
344
|
+
Q = st;
|
|
345
345
|
break;
|
|
346
346
|
}
|
|
347
347
|
let $ = null;
|
|
@@ -358,7 +358,7 @@ function A(T) {
|
|
|
358
358
|
}), /* @__PURE__ */ x(f, {
|
|
359
359
|
variant: "contained",
|
|
360
360
|
onClick: () => F("COMMON_MUTABLE_FIELDS"),
|
|
361
|
-
disabled: X || !
|
|
361
|
+
disabled: X || !Xe,
|
|
362
362
|
children: "Next"
|
|
363
363
|
})] });
|
|
364
364
|
break;
|
|
@@ -370,7 +370,7 @@ function A(T) {
|
|
|
370
370
|
children: "Back"
|
|
371
371
|
}), /* @__PURE__ */ x(f, {
|
|
372
372
|
variant: "contained",
|
|
373
|
-
onClick:
|
|
373
|
+
onClick: Qe,
|
|
374
374
|
disabled: X || I === null,
|
|
375
375
|
children: "Save"
|
|
376
376
|
})] });
|
|
@@ -378,7 +378,7 @@ function A(T) {
|
|
|
378
378
|
}
|
|
379
379
|
return /* @__PURE__ */ x(t, {
|
|
380
380
|
open: E,
|
|
381
|
-
title:
|
|
381
|
+
title: ct,
|
|
382
382
|
maxWidth: "md",
|
|
383
383
|
fullWidth: !0,
|
|
384
384
|
onCancel: A,
|
package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateOrUpdateCurationTaskDialog.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport EntityIdTextField from '@/components/EntityFinder/EntityIdTextField'\nimport { FinderScope } from '@/components/EntityFinder/tree/EntityTree'\nimport { VersionSelectionType } from '@/components/EntityFinder/VersionSelectionType'\nimport { TextField } from '@/components/TextField'\nimport UserOrTeamBadge from '@/components/UserOrTeamBadge/UserOrTeamBadge'\nimport UserSearchBox from '@/components/UserSearchBox/UserSearchBox'\nimport WizardChoiceButton from '@/components/WizardChoiceButton/WizardChoiceButton'\nimport WizardChoiceButtonGroup from '@/components/WizardChoiceButton/WizardChoiceButtonGroup'\nimport {\n useCreateCurationTask,\n useUpdateCurationTask,\n} from '@/synapse-queries/curation/task/useCurationTask'\nimport { EntityTypeGroup } from '@/utils/functions/EntityTypeUtils'\nimport { HelpTwoTone } from '@mui/icons-material'\nimport Close from '@mui/icons-material/Close'\nimport {\n Alert,\n Box,\n Button,\n FormControl,\n FormControlLabel,\n FormLabel,\n Grid,\n IconButton,\n InputLabel,\n Radio,\n RadioGroup,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport {\n CurationTask,\n CurationTaskProperties,\n EntityType,\n FileBasedMetadataTaskPropertiesConcreteTypeEnum,\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { TYPE_FILTER } from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport {\n ASSIGNEE_TOOLTIP,\n AUTH_MODE_CHANGED_WARNING,\n AUTH_MODE_NONE_TOOLTIP,\n AUTH_MODE_SESSION_OWNER_TOOLTIP,\n AUTH_MODE_SOURCE_BENEFACTOR_TOOLTIP,\n COLLABORATORS_TOOLTIP,\n CREATE_CURATION_TASK_DIALOG_TITLE,\n EDIT_CURATION_TASK_DIALOG_TITLE,\n FILE_BASED_FILE_VIEW_INPUT_DESCRIPTION,\n FILE_BASED_TASK_DESCRIPTION,\n FILE_BASED_TASK_TITLE,\n FILE_BASED_UPLOAD_FOLDER_INPUT_DESCRIPTION,\n FILE_VIEW_FINDER_PROMPT,\n FILE_VIEW_FINDER_TITLE,\n GENERIC_SAVE_ERROR_MESSAGE,\n RECORD_BASED_RECORD_SET_INPUT_DESCRIPTION,\n RECORD_BASED_TASK_DESCRIPTION,\n RECORD_BASED_TASK_TITLE,\n RECORD_SET_FINDER_PROMPT,\n RECORD_SET_FINDER_TITLE,\n SELECT_TASK_TYPE_DESCRIPTION,\n TASK_INSTRUCTIONS_INPUT_DESCRIPTION,\n TASK_NAME_INPUT_DESCRIPTION,\n UNRECOGNIZED_TASK_TYPE_ERROR,\n UPLOAD_FOLDER_FINDER_PROMPT,\n UPLOAD_FOLDER_FINDER_TITLE,\n} from '../utils/constants'\n\nexport type CreateOrUpdateCurationTaskDialogProps = {\n open: boolean\n onCancel: () => void\n onSuccess: (task: CurationTask) => void\n projectId: string\n task?: CurationTask\n}\n\nconst FILE_BASED_CONCRETE_TYPE =\n FileBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_FileBasedMetadataTaskProperties\nconst RECORD_BASED_CONCRETE_TYPE =\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties\n\n/** Null represents the \"Legacy\" / unset option for suggestedAuthorizationMode */\ntype AuthorizationModeOption = 'SESSION_OWNER' | 'SOURCE_BENEFACTOR' | 'NONE'\n\nfunction toAuthorizationModeOption(\n value: string | undefined,\n): AuthorizationModeOption {\n if (value === 'SESSION_OWNER' || value === 'SOURCE_BENEFACTOR') return value\n return 'NONE'\n}\n\ntype CreateOrUpdateCurationTaskDialogStep =\n | 'SELECT_TYPE'\n | 'TYPE_SPECIFIC_FIELDS'\n | 'COMMON_MUTABLE_FIELDS'\n\n/**\n * Dialog component that guides a user through creating a new CurationTask or editing an existing one.\n */\nexport default function CreateOrUpdateCurationTaskDialog(\n props: CreateOrUpdateCurationTaskDialogProps,\n) {\n const { open, onCancel, onSuccess, projectId, task } = props\n const isEditMode = task !== undefined\n\n // In create mode: track which step we're on (1 = type selection, 2 = type-specific fields, 3 = common mutable fields)\n const [step, setStep] = useState<CreateOrUpdateCurationTaskDialogStep>(() =>\n task ? 'COMMON_MUTABLE_FIELDS' : 'SELECT_TYPE',\n )\n\n // Derive initial concrete type from the existing task (null in create mode\n // until the user picks a type in step 1)\n const [selectedConcreteType, setSelectedConcreteType] = useState<\n CurationTaskProperties['concreteType'] | null\n >(() => {\n const ct = task?.taskProperties?.concreteType\n if (ct === FILE_BASED_CONCRETE_TYPE || ct === RECORD_BASED_CONCRETE_TYPE)\n return ct\n return null\n })\n\n // Common task fields — lazily initialized from the existing task\n const [dataType, setDataType] = useState(() => task?.dataType ?? '')\n const [instructions, setInstructions] = useState(\n () => task?.instructions ?? '',\n )\n const [assigneePrincipalId, setAssigneePrincipalId] = useState<\n string | undefined\n >(() => task?.assigneePrincipalId)\n\n const initialAuthMode = toAuthorizationModeOption(\n task?.taskProperties?.suggestedAuthorizationMode,\n )\n const [authorizationMode, setAuthorizationMode] =\n useState<AuthorizationModeOption>(initialAuthMode)\n // Track the original value to detect unsaved changes\n const [originalAuthorizationMode] =\n useState<AuthorizationModeOption>(initialAuthMode)\n\n // FileBasedMetadataTaskProperties fields\n const [uploadFolderId, setUploadFolderId] = useState(() => {\n const tp = task?.taskProperties\n return tp?.concreteType === FILE_BASED_CONCRETE_TYPE\n ? (tp.uploadFolderId ?? '')\n : ''\n })\n const [fileViewId, setFileViewId] = useState(() => {\n const tp = task?.taskProperties\n return tp?.concreteType === FILE_BASED_CONCRETE_TYPE\n ? (tp.fileViewId ?? '')\n : ''\n })\n\n // RecordBasedMetadataTaskProperties fields\n const [recordSetId, setRecordSetId] = useState(() => {\n const tp = task?.taskProperties\n return tp?.concreteType === RECORD_BASED_CONCRETE_TYPE\n ? (tp.recordSetId ?? '')\n : ''\n })\n\n // Shared taskProperties fields\n const [collaboratorPrincipalIds, setCollaboratorPrincipalIds] = useState<\n string[]\n >(() => {\n const ids = task?.taskProperties?.collaboratorPrincipalIds\n return ids ?? []\n })\n const [pendingCollaboratorId, setPendingCollaboratorId] = useState<\n string | null\n >(null)\n\n const {\n mutate: createTask,\n isPending: isCreatePending,\n error: createError,\n } = useCreateCurationTask({\n onSuccess: created => {\n onSuccess(created)\n },\n })\n\n const {\n mutate: updateTask,\n isPending: isUpdatePending,\n error: updateError,\n } = useUpdateCurationTask({\n onSuccess: updated => {\n onSuccess(updated)\n },\n })\n\n const isPending = isCreatePending || isUpdatePending\n const error = createError ?? updateError\n\n const isTaskPropertiesValid =\n (selectedConcreteType === FILE_BASED_CONCRETE_TYPE &&\n uploadFolderId &&\n fileViewId) ||\n (selectedConcreteType === RECORD_BASED_CONCRETE_TYPE && recordSetId)\n\n function buildTaskPayload(): CurationTask {\n const suggestedAuthorizationMode =\n authorizationMode === 'NONE' ? undefined : authorizationMode\n\n const concreteType = selectedConcreteType!\n let taskProperties: CurationTask['taskProperties']\n const collaborators =\n collaboratorPrincipalIds.length > 0 ? collaboratorPrincipalIds : undefined\n\n if (concreteType === FILE_BASED_CONCRETE_TYPE) {\n taskProperties = {\n concreteType: FILE_BASED_CONCRETE_TYPE,\n uploadFolderId: uploadFolderId || undefined,\n fileViewId: fileViewId || undefined,\n suggestedAuthorizationMode,\n collaboratorPrincipalIds: collaborators,\n }\n } else {\n taskProperties = {\n concreteType: RECORD_BASED_CONCRETE_TYPE,\n recordSetId: recordSetId || undefined,\n suggestedAuthorizationMode,\n collaboratorPrincipalIds: collaborators,\n }\n }\n\n return {\n // Spread the existing task to carry over server-managed fields (taskId, etc.)\n ...(isEditMode ? task : {}),\n projectId,\n dataType: dataType || undefined,\n instructions: instructions || undefined,\n assigneePrincipalId: assigneePrincipalId || undefined,\n taskProperties,\n }\n }\n\n function handleSave() {\n const payload = buildTaskPayload()\n if (isEditMode) {\n updateTask(payload)\n } else {\n createTask(payload)\n }\n }\n\n const authModeChanged =\n isEditMode && authorizationMode !== originalAuthorizationMode\n\n // ── Authorization Mode radio group (shared between columns) ────────────\n const authModeField = (\n <FormControl>\n <FormLabel>Authorization Mode</FormLabel>\n <RadioGroup\n value={authorizationMode}\n onChange={(_e, v) => setAuthorizationMode(v as AuthorizationModeOption)}\n >\n <FormControlLabel\n value=\"NONE\"\n control={<Radio />}\n label={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Typography variant=\"body1\">None (Legacy)</Typography>\n <Tooltip title={AUTH_MODE_NONE_TOOLTIP}>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </Tooltip>\n </Box>\n }\n />\n <FormControlLabel\n value=\"SESSION_OWNER\"\n control={<Radio />}\n label={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Typography variant=\"body1\">Session Owner</Typography>\n <Tooltip title={AUTH_MODE_SESSION_OWNER_TOOLTIP}>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </Tooltip>\n </Box>\n }\n />\n <FormControlLabel\n value=\"SOURCE_BENEFACTOR\"\n control={<Radio />}\n label={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Typography variant=\"body1\">Source Benefactor</Typography>\n <Tooltip title={AUTH_MODE_SOURCE_BENEFACTOR_TOOLTIP}>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </Tooltip>\n </Box>\n }\n />\n </RadioGroup>\n </FormControl>\n )\n\n const assigneeField = (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <InputLabel htmlFor=\"dlg-set-task-assignee\">Assignee</InputLabel>\n <Tooltip title={ASSIGNEE_TOOLTIP}>\n <div>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </div>\n </Tooltip>\n </Box>\n <UserSearchBox\n inputId=\"dlg-set-task-assignee\"\n key={open.toString()}\n defaultValue={assigneePrincipalId}\n onChange={id => setAssigneePrincipalId(id ?? undefined)}\n typeFilter={TYPE_FILTER.ALL}\n />\n </Box>\n )\n\n // ── Form fields (used in both step 3 create and edit mode) ──────────────\n const commonFields = (\n <Stack gap={2}>\n <TextField\n label=\"Task Name\"\n fullWidth\n value={dataType}\n onChange={e => setDataType(e.target.value)}\n required\n description={TASK_NAME_INPUT_DESCRIPTION}\n />\n <TextField\n label=\"Instructions\"\n fullWidth\n multiline\n minRows={3}\n value={instructions}\n onChange={e => setInstructions(e.target.value)}\n description={TASK_INSTRUCTIONS_INPUT_DESCRIPTION}\n />\n {/* TODO: Display the below 'collaborators' once multiple owners are supported */}\n <Box display=\"none\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <InputLabel>Collaborators</InputLabel>\n <Tooltip title={COLLABORATORS_TOOLTIP}>\n <div>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </div>\n </Tooltip>\n </Box>\n <Stack gap={1}>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Box flex={1}>\n <UserSearchBox\n value={pendingCollaboratorId}\n onChange={id => setPendingCollaboratorId(id)}\n typeFilter={TYPE_FILTER.ALL}\n placeholder=\"Search for a user or team\"\n />\n </Box>\n <Button\n variant=\"outlined\"\n onClick={() => {\n if (\n pendingCollaboratorId &&\n !collaboratorPrincipalIds.includes(pendingCollaboratorId)\n ) {\n setCollaboratorPrincipalIds(prev => [\n ...prev,\n pendingCollaboratorId,\n ])\n }\n setPendingCollaboratorId(null)\n }}\n disabled={!pendingCollaboratorId}\n >\n Add\n </Button>\n </Stack>\n {collaboratorPrincipalIds.map(id => (\n <Stack\n key={id}\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <UserOrTeamBadge principalId={id} />\n <IconButton\n size=\"small\"\n onClick={() =>\n setCollaboratorPrincipalIds(prev =>\n prev.filter(x => x !== id),\n )\n }\n >\n <Close fontSize=\"small\" />\n </IconButton>\n </Stack>\n ))}\n </Stack>\n </Box>\n </Stack>\n )\n\n // ── TaskProperties fields ────────────────────────────────────────────────\n const fileBasedFields = (\n <Stack gap={2}>\n <EntityIdTextField\n label=\"Upload Folder ID\"\n value={uploadFolderId}\n description={FILE_BASED_UPLOAD_FOLDER_INPUT_DESCRIPTION}\n onChange={setUploadFolderId}\n disabled={isEditMode}\n entityFinderModalProps={{\n title: UPLOAD_FOLDER_FINDER_TITLE,\n promptCopy: UPLOAD_FOLDER_FINDER_PROMPT,\n confirmButtonCopy: 'Select',\n configuration: {\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: 'root',\n selectMultiple: false,\n treeOnly: false,\n versionSelection: VersionSelectionType.DISALLOWED,\n selectableTypes: EntityTypeGroup.CONTAINER,\n },\n }}\n />\n <EntityIdTextField\n label=\"File View ID\"\n value={fileViewId}\n description={FILE_BASED_FILE_VIEW_INPUT_DESCRIPTION}\n onChange={setFileViewId}\n disabled={isEditMode}\n entityFinderModalProps={{\n title: FILE_VIEW_FINDER_TITLE,\n promptCopy: FILE_VIEW_FINDER_PROMPT,\n confirmButtonCopy: 'Select',\n configuration: {\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: 'root',\n selectMultiple: false,\n treeOnly: false,\n versionSelection: VersionSelectionType.DISALLOWED,\n selectableTypes: [EntityType.entityview],\n },\n }}\n />\n </Stack>\n )\n\n const recordBasedFields = (\n <EntityIdTextField\n label=\"Record Set ID\"\n value={recordSetId}\n description={RECORD_BASED_RECORD_SET_INPUT_DESCRIPTION}\n onChange={setRecordSetId}\n disabled={isEditMode}\n entityFinderModalProps={{\n title: RECORD_SET_FINDER_TITLE,\n promptCopy: RECORD_SET_FINDER_PROMPT,\n confirmButtonCopy: 'Select',\n configuration: {\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: 'root',\n selectMultiple: false,\n treeOnly: false,\n versionSelection: VersionSelectionType.DISALLOWED,\n selectableTypes: [EntityType.recordset],\n },\n }}\n />\n )\n\n // ── Step 1: Type selection ───────────────────────────────────────────────\n const step1Content = (\n <Stack gap={2}>\n <Typography variant=\"body1\">{SELECT_TASK_TYPE_DESCRIPTION}</Typography>\n <WizardChoiceButtonGroup>\n <WizardChoiceButton\n title={FILE_BASED_TASK_TITLE}\n description={FILE_BASED_TASK_DESCRIPTION}\n onClick={() => {\n setSelectedConcreteType(FILE_BASED_CONCRETE_TYPE)\n setStep('TYPE_SPECIFIC_FIELDS')\n }}\n />\n <WizardChoiceButton\n title={RECORD_BASED_TASK_TITLE}\n description={RECORD_BASED_TASK_DESCRIPTION}\n onClick={() => {\n setSelectedConcreteType(RECORD_BASED_CONCRETE_TYPE)\n setStep('TYPE_SPECIFIC_FIELDS')\n }}\n />\n </WizardChoiceButtonGroup>\n </Stack>\n )\n\n // ── Step 2: Type-specific fields ───────────────────────────────────────────────\n const step2Content = (\n <Stack gap={2}>\n {selectedConcreteType === FILE_BASED_CONCRETE_TYPE && fileBasedFields}\n {selectedConcreteType === RECORD_BASED_CONCRETE_TYPE && recordBasedFields}\n </Stack>\n )\n\n // ── Step 3 / edit form content ───────────────────────────────────────────\n const step3Content = (\n <Stack gap={3}>\n <Grid container spacing={3} alignItems=\"flex-start\">\n <Grid size={{ xs: 12, sm: 6 }}>\n <Stack gap={2}>{commonFields}</Stack>\n </Grid>\n <Grid size={{ xs: 12, sm: 6 }}>\n <Stack gap={3}>\n {assigneeField}\n {authModeField}\n </Stack>\n </Grid>\n </Grid>\n\n {isEditMode && selectedConcreteType === null && (\n <Alert severity=\"error\">{UNRECOGNIZED_TASK_TYPE_ERROR}</Alert>\n )}\n {authModeChanged && (\n <Alert severity=\"warning\">{AUTH_MODE_CHANGED_WARNING}</Alert>\n )}\n {error && (\n <Alert severity=\"error\">\n {error.reason ?? GENERIC_SAVE_ERROR_MESSAGE}\n </Alert>\n )}\n </Stack>\n )\n\n const title = isEditMode\n ? EDIT_CURATION_TASK_DIALOG_TITLE\n : CREATE_CURATION_TASK_DIALOG_TITLE\n\n let dialogContent = null\n switch (step) {\n case 'SELECT_TYPE':\n dialogContent = step1Content\n break\n case 'TYPE_SPECIFIC_FIELDS':\n dialogContent = step2Content\n break\n case 'COMMON_MUTABLE_FIELDS':\n dialogContent = step3Content\n break\n }\n\n let dialogActions = null\n switch (step) {\n case 'SELECT_TYPE':\n dialogActions = null\n break\n case 'TYPE_SPECIFIC_FIELDS': {\n dialogActions = (\n <>\n <Button\n variant=\"outlined\"\n onClick={() => setStep('SELECT_TYPE')}\n disabled={isPending}\n >\n Back\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => setStep('COMMON_MUTABLE_FIELDS')}\n disabled={isPending || !isTaskPropertiesValid}\n >\n Next\n </Button>\n </>\n )\n break\n }\n case 'COMMON_MUTABLE_FIELDS': {\n dialogActions = (\n <>\n {!isEditMode && (\n <Button\n variant=\"outlined\"\n onClick={() => setStep('TYPE_SPECIFIC_FIELDS')}\n disabled={isPending}\n >\n Back\n </Button>\n )}\n <Button\n variant=\"contained\"\n onClick={handleSave}\n disabled={isPending || selectedConcreteType === null}\n >\n Save\n </Button>\n </>\n )\n break\n }\n }\n\n return (\n <DialogBase\n open={open}\n title={title}\n maxWidth=\"md\"\n fullWidth\n onCancel={onCancel}\n content={dialogContent}\n actions={\n <Stack direction=\"row\" gap={1} justifyContent=\"flex-end\" width=\"100%\">\n {dialogActions}\n </Stack>\n }\n />\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreateOrUpdateCurationTaskDialog.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport EntityIdTextField from '@/components/EntityFinder/EntityIdTextField'\nimport { FinderScope } from '@/components/EntityFinder/tree/EntityTree'\nimport { VersionSelectionType } from '@/components/EntityFinder/VersionSelectionType'\nimport { TextField } from '@/components/TextField'\nimport UserOrTeamBadge from '@/components/UserOrTeamBadge/UserOrTeamBadge'\nimport UserSearchBox from '@/components/UserSearchBox/UserSearchBox'\nimport WizardChoiceButton from '@/components/WizardChoiceButton/WizardChoiceButton'\nimport WizardChoiceButtonGroup from '@/components/WizardChoiceButton/WizardChoiceButtonGroup'\nimport {\n useCreateCurationTask,\n useUpdateCurationTask,\n} from '@/synapse-queries/curation/task/useCurationTask'\nimport { EntityTypeGroup } from '@/utils/functions/EntityTypeUtils'\nimport { HelpTwoTone } from '@mui/icons-material'\nimport Close from '@mui/icons-material/Close'\nimport {\n Alert,\n Box,\n Button,\n FormControl,\n FormControlLabel,\n FormLabel,\n Grid,\n IconButton,\n InputLabel,\n Radio,\n RadioGroup,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport {\n CurationTask,\n CurationTaskProperties,\n EntityType,\n FileBasedMetadataTaskPropertiesConcreteTypeEnum,\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { TYPE_FILTER } from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport {\n ASSIGNEE_TOOLTIP,\n AUTH_MODE_CHANGED_WARNING,\n AUTH_MODE_NONE_TITLE,\n AUTH_MODE_NONE_TOOLTIP,\n AUTH_MODE_SESSION_OWNER_TITLE,\n AUTH_MODE_SESSION_OWNER_TOOLTIP,\n AUTH_MODE_SOURCE_BENEFACTOR_TITLE,\n AUTH_MODE_SOURCE_BENEFACTOR_TOOLTIP,\n COLLABORATORS_TOOLTIP,\n CREATE_CURATION_TASK_DIALOG_TITLE,\n EDIT_CURATION_TASK_DIALOG_TITLE,\n FILE_BASED_FILE_VIEW_INPUT_DESCRIPTION,\n FILE_BASED_TASK_DESCRIPTION,\n FILE_BASED_TASK_TITLE,\n FILE_BASED_UPLOAD_FOLDER_INPUT_DESCRIPTION,\n FILE_VIEW_FINDER_PROMPT,\n FILE_VIEW_FINDER_TITLE,\n GENERIC_SAVE_ERROR_MESSAGE,\n RECORD_BASED_RECORD_SET_INPUT_DESCRIPTION,\n RECORD_BASED_TASK_DESCRIPTION,\n RECORD_BASED_TASK_TITLE,\n RECORD_SET_FINDER_PROMPT,\n RECORD_SET_FINDER_TITLE,\n SELECT_TASK_TYPE_DESCRIPTION,\n TASK_INSTRUCTIONS_INPUT_DESCRIPTION,\n TASK_NAME_INPUT_DESCRIPTION,\n UNRECOGNIZED_TASK_TYPE_ERROR,\n UPLOAD_FOLDER_FINDER_PROMPT,\n UPLOAD_FOLDER_FINDER_TITLE,\n} from '../utils/constants'\n\nexport type CreateOrUpdateCurationTaskDialogProps = {\n open: boolean\n onCancel: () => void\n onSuccess: (task: CurationTask) => void\n projectId: string\n task?: CurationTask\n}\n\nconst FILE_BASED_CONCRETE_TYPE =\n FileBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_FileBasedMetadataTaskProperties\nconst RECORD_BASED_CONCRETE_TYPE =\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties\n\n/** Null represents the \"Legacy\" / unset option for suggestedAuthorizationMode */\ntype AuthorizationModeOption = 'SESSION_OWNER' | 'SOURCE_BENEFACTOR' | 'NONE'\n\nfunction toAuthorizationModeOption(\n value: string | undefined,\n): AuthorizationModeOption {\n if (value === 'SESSION_OWNER' || value === 'SOURCE_BENEFACTOR') return value\n return 'NONE'\n}\n\ntype CreateOrUpdateCurationTaskDialogStep =\n | 'SELECT_TYPE'\n | 'TYPE_SPECIFIC_FIELDS'\n | 'COMMON_MUTABLE_FIELDS'\n\n/**\n * Dialog component that guides a user through creating a new CurationTask or editing an existing one.\n */\nexport default function CreateOrUpdateCurationTaskDialog(\n props: CreateOrUpdateCurationTaskDialogProps,\n) {\n const { open, onCancel, onSuccess, projectId, task } = props\n const isEditMode = task !== undefined\n\n // In create mode: track which step we're on (1 = type selection, 2 = type-specific fields, 3 = common mutable fields)\n const [step, setStep] = useState<CreateOrUpdateCurationTaskDialogStep>(() =>\n task ? 'COMMON_MUTABLE_FIELDS' : 'SELECT_TYPE',\n )\n\n // Derive initial concrete type from the existing task (null in create mode\n // until the user picks a type in step 1)\n const [selectedConcreteType, setSelectedConcreteType] = useState<\n CurationTaskProperties['concreteType'] | null\n >(() => {\n const ct = task?.taskProperties?.concreteType\n if (ct === FILE_BASED_CONCRETE_TYPE || ct === RECORD_BASED_CONCRETE_TYPE)\n return ct\n return null\n })\n\n // Common task fields — lazily initialized from the existing task\n const [dataType, setDataType] = useState(() => task?.dataType ?? '')\n const [instructions, setInstructions] = useState(\n () => task?.instructions ?? '',\n )\n const [assigneePrincipalId, setAssigneePrincipalId] = useState<\n string | undefined\n >(() => task?.assigneePrincipalId)\n\n const initialAuthMode = toAuthorizationModeOption(\n task?.taskProperties?.suggestedAuthorizationMode,\n )\n const [authorizationMode, setAuthorizationMode] =\n useState<AuthorizationModeOption>(initialAuthMode)\n // Track the original value to detect unsaved changes\n const [originalAuthorizationMode] =\n useState<AuthorizationModeOption>(initialAuthMode)\n\n // FileBasedMetadataTaskProperties fields\n const [uploadFolderId, setUploadFolderId] = useState(() => {\n const tp = task?.taskProperties\n return tp?.concreteType === FILE_BASED_CONCRETE_TYPE\n ? (tp.uploadFolderId ?? '')\n : ''\n })\n const [fileViewId, setFileViewId] = useState(() => {\n const tp = task?.taskProperties\n return tp?.concreteType === FILE_BASED_CONCRETE_TYPE\n ? (tp.fileViewId ?? '')\n : ''\n })\n\n // RecordBasedMetadataTaskProperties fields\n const [recordSetId, setRecordSetId] = useState(() => {\n const tp = task?.taskProperties\n return tp?.concreteType === RECORD_BASED_CONCRETE_TYPE\n ? (tp.recordSetId ?? '')\n : ''\n })\n\n // Shared taskProperties fields\n const [collaboratorPrincipalIds, setCollaboratorPrincipalIds] = useState<\n string[]\n >(() => {\n const ids = task?.taskProperties?.collaboratorPrincipalIds\n return ids ?? []\n })\n const [pendingCollaboratorId, setPendingCollaboratorId] = useState<\n string | null\n >(null)\n\n const {\n mutate: createTask,\n isPending: isCreatePending,\n error: createError,\n } = useCreateCurationTask({\n onSuccess: created => {\n onSuccess(created)\n },\n })\n\n const {\n mutate: updateTask,\n isPending: isUpdatePending,\n error: updateError,\n } = useUpdateCurationTask({\n onSuccess: updated => {\n onSuccess(updated)\n },\n })\n\n const isPending = isCreatePending || isUpdatePending\n const error = createError ?? updateError\n\n const isTaskPropertiesValid =\n (selectedConcreteType === FILE_BASED_CONCRETE_TYPE &&\n uploadFolderId &&\n fileViewId) ||\n (selectedConcreteType === RECORD_BASED_CONCRETE_TYPE && recordSetId)\n\n function buildTaskPayload(): CurationTask {\n const suggestedAuthorizationMode =\n authorizationMode === 'NONE' ? undefined : authorizationMode\n\n const concreteType = selectedConcreteType!\n let taskProperties: CurationTask['taskProperties']\n const collaborators =\n collaboratorPrincipalIds.length > 0 ? collaboratorPrincipalIds : undefined\n\n if (concreteType === FILE_BASED_CONCRETE_TYPE) {\n taskProperties = {\n concreteType: FILE_BASED_CONCRETE_TYPE,\n uploadFolderId: uploadFolderId || undefined,\n fileViewId: fileViewId || undefined,\n suggestedAuthorizationMode,\n collaboratorPrincipalIds: collaborators,\n }\n } else {\n taskProperties = {\n concreteType: RECORD_BASED_CONCRETE_TYPE,\n recordSetId: recordSetId || undefined,\n suggestedAuthorizationMode,\n collaboratorPrincipalIds: collaborators,\n }\n }\n\n return {\n // Spread the existing task to carry over server-managed fields (taskId, etc.)\n ...(isEditMode ? task : {}),\n projectId,\n dataType: dataType || undefined,\n instructions: instructions || undefined,\n assigneePrincipalId: assigneePrincipalId || undefined,\n taskProperties,\n }\n }\n\n function handleSave() {\n const payload = buildTaskPayload()\n if (isEditMode) {\n updateTask(payload)\n } else {\n createTask(payload)\n }\n }\n\n const authModeChanged =\n isEditMode && authorizationMode !== originalAuthorizationMode\n\n // ── Authorization Mode radio group (shared between columns) ────────────\n const authModeField = (\n <FormControl>\n <FormLabel>Authorization Mode</FormLabel>\n <RadioGroup\n value={authorizationMode}\n onChange={(_e, v) => setAuthorizationMode(v as AuthorizationModeOption)}\n >\n <FormControlLabel\n value=\"NONE\"\n control={<Radio />}\n label={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Typography variant=\"body1\">{AUTH_MODE_NONE_TITLE}</Typography>\n <Tooltip title={AUTH_MODE_NONE_TOOLTIP}>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </Tooltip>\n </Box>\n }\n />\n <FormControlLabel\n value=\"SESSION_OWNER\"\n control={<Radio />}\n label={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Typography variant=\"body1\">\n {AUTH_MODE_SESSION_OWNER_TITLE}\n </Typography>\n <Tooltip title={AUTH_MODE_SESSION_OWNER_TOOLTIP}>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </Tooltip>\n </Box>\n }\n />\n <FormControlLabel\n value=\"SOURCE_BENEFACTOR\"\n control={<Radio />}\n label={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <Typography variant=\"body1\">\n {AUTH_MODE_SOURCE_BENEFACTOR_TITLE}\n </Typography>\n <Tooltip title={AUTH_MODE_SOURCE_BENEFACTOR_TOOLTIP}>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </Tooltip>\n </Box>\n }\n />\n </RadioGroup>\n </FormControl>\n )\n\n const assigneeField = (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <InputLabel htmlFor=\"dlg-set-task-assignee\">Assignee</InputLabel>\n <Tooltip title={ASSIGNEE_TOOLTIP}>\n <div>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </div>\n </Tooltip>\n </Box>\n <UserSearchBox\n inputId=\"dlg-set-task-assignee\"\n key={open.toString()}\n defaultValue={assigneePrincipalId}\n onChange={id => setAssigneePrincipalId(id ?? undefined)}\n typeFilter={TYPE_FILTER.ALL}\n />\n </Box>\n )\n\n // ── Form fields (used in both step 3 create and edit mode) ──────────────\n const commonFields = (\n <Stack gap={2}>\n <TextField\n label=\"Task Name\"\n fullWidth\n value={dataType}\n onChange={e => setDataType(e.target.value)}\n required\n description={TASK_NAME_INPUT_DESCRIPTION}\n />\n <TextField\n label=\"Instructions\"\n fullWidth\n multiline\n minRows={3}\n value={instructions}\n onChange={e => setInstructions(e.target.value)}\n description={TASK_INSTRUCTIONS_INPUT_DESCRIPTION}\n />\n {/* TODO: Display the below 'collaborators' once multiple owners are supported */}\n <Box display=\"none\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <InputLabel>Collaborators</InputLabel>\n <Tooltip title={COLLABORATORS_TOOLTIP}>\n <div>\n <HelpTwoTone sx={{ color: 'grey.700' }} />\n </div>\n </Tooltip>\n </Box>\n <Stack gap={1}>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Box flex={1}>\n <UserSearchBox\n value={pendingCollaboratorId}\n onChange={id => setPendingCollaboratorId(id)}\n typeFilter={TYPE_FILTER.ALL}\n placeholder=\"Search for a user or team\"\n />\n </Box>\n <Button\n variant=\"outlined\"\n onClick={() => {\n if (\n pendingCollaboratorId &&\n !collaboratorPrincipalIds.includes(pendingCollaboratorId)\n ) {\n setCollaboratorPrincipalIds(prev => [\n ...prev,\n pendingCollaboratorId,\n ])\n }\n setPendingCollaboratorId(null)\n }}\n disabled={!pendingCollaboratorId}\n >\n Add\n </Button>\n </Stack>\n {collaboratorPrincipalIds.map(id => (\n <Stack\n key={id}\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <UserOrTeamBadge principalId={id} />\n <IconButton\n size=\"small\"\n onClick={() =>\n setCollaboratorPrincipalIds(prev =>\n prev.filter(x => x !== id),\n )\n }\n >\n <Close fontSize=\"small\" />\n </IconButton>\n </Stack>\n ))}\n </Stack>\n </Box>\n </Stack>\n )\n\n // ── TaskProperties fields ────────────────────────────────────────────────\n const fileBasedFields = (\n <Stack gap={2}>\n <EntityIdTextField\n label=\"Upload Folder ID\"\n value={uploadFolderId}\n description={FILE_BASED_UPLOAD_FOLDER_INPUT_DESCRIPTION}\n onChange={setUploadFolderId}\n disabled={isEditMode}\n entityFinderModalProps={{\n title: UPLOAD_FOLDER_FINDER_TITLE,\n promptCopy: UPLOAD_FOLDER_FINDER_PROMPT,\n confirmButtonCopy: 'Select',\n configuration: {\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: 'root',\n selectMultiple: false,\n treeOnly: false,\n versionSelection: VersionSelectionType.DISALLOWED,\n selectableTypes: EntityTypeGroup.CONTAINER,\n },\n }}\n />\n <EntityIdTextField\n label=\"File View ID\"\n value={fileViewId}\n description={FILE_BASED_FILE_VIEW_INPUT_DESCRIPTION}\n onChange={setFileViewId}\n disabled={isEditMode}\n entityFinderModalProps={{\n title: FILE_VIEW_FINDER_TITLE,\n promptCopy: FILE_VIEW_FINDER_PROMPT,\n confirmButtonCopy: 'Select',\n configuration: {\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: 'root',\n selectMultiple: false,\n treeOnly: false,\n versionSelection: VersionSelectionType.DISALLOWED,\n selectableTypes: [EntityType.entityview],\n },\n }}\n />\n </Stack>\n )\n\n const recordBasedFields = (\n <EntityIdTextField\n label=\"Record Set ID\"\n value={recordSetId}\n description={RECORD_BASED_RECORD_SET_INPUT_DESCRIPTION}\n onChange={setRecordSetId}\n disabled={isEditMode}\n entityFinderModalProps={{\n title: RECORD_SET_FINDER_TITLE,\n promptCopy: RECORD_SET_FINDER_PROMPT,\n confirmButtonCopy: 'Select',\n configuration: {\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: 'root',\n selectMultiple: false,\n treeOnly: false,\n versionSelection: VersionSelectionType.DISALLOWED,\n selectableTypes: [EntityType.recordset],\n },\n }}\n />\n )\n\n // ── Step 1: Type selection ───────────────────────────────────────────────\n const step1Content = (\n <Stack gap={2}>\n <Typography variant=\"body1\">{SELECT_TASK_TYPE_DESCRIPTION}</Typography>\n <WizardChoiceButtonGroup>\n <WizardChoiceButton\n title={FILE_BASED_TASK_TITLE}\n description={FILE_BASED_TASK_DESCRIPTION}\n onClick={() => {\n setSelectedConcreteType(FILE_BASED_CONCRETE_TYPE)\n setStep('TYPE_SPECIFIC_FIELDS')\n }}\n />\n <WizardChoiceButton\n title={RECORD_BASED_TASK_TITLE}\n description={RECORD_BASED_TASK_DESCRIPTION}\n onClick={() => {\n setSelectedConcreteType(RECORD_BASED_CONCRETE_TYPE)\n setStep('TYPE_SPECIFIC_FIELDS')\n }}\n />\n </WizardChoiceButtonGroup>\n </Stack>\n )\n\n // ── Step 2: Type-specific fields ───────────────────────────────────────────────\n const step2Content = (\n <Stack gap={2}>\n {selectedConcreteType === FILE_BASED_CONCRETE_TYPE && fileBasedFields}\n {selectedConcreteType === RECORD_BASED_CONCRETE_TYPE && recordBasedFields}\n </Stack>\n )\n\n // ── Step 3 / edit form content ───────────────────────────────────────────\n const step3Content = (\n <Stack gap={3}>\n <Grid container spacing={3} alignItems=\"flex-start\">\n <Grid size={{ xs: 12, sm: 6 }}>\n <Stack gap={2}>{commonFields}</Stack>\n </Grid>\n <Grid size={{ xs: 12, sm: 6 }}>\n <Stack gap={3}>\n {assigneeField}\n {authModeField}\n </Stack>\n </Grid>\n </Grid>\n\n {isEditMode && selectedConcreteType === null && (\n <Alert severity=\"error\">{UNRECOGNIZED_TASK_TYPE_ERROR}</Alert>\n )}\n {authModeChanged && (\n <Alert severity=\"warning\">{AUTH_MODE_CHANGED_WARNING}</Alert>\n )}\n {error && (\n <Alert severity=\"error\">\n {error.reason ?? GENERIC_SAVE_ERROR_MESSAGE}\n </Alert>\n )}\n </Stack>\n )\n\n const title = isEditMode\n ? EDIT_CURATION_TASK_DIALOG_TITLE\n : CREATE_CURATION_TASK_DIALOG_TITLE\n\n let dialogContent = null\n switch (step) {\n case 'SELECT_TYPE':\n dialogContent = step1Content\n break\n case 'TYPE_SPECIFIC_FIELDS':\n dialogContent = step2Content\n break\n case 'COMMON_MUTABLE_FIELDS':\n dialogContent = step3Content\n break\n }\n\n let dialogActions = null\n switch (step) {\n case 'SELECT_TYPE':\n dialogActions = null\n break\n case 'TYPE_SPECIFIC_FIELDS': {\n dialogActions = (\n <>\n <Button\n variant=\"outlined\"\n onClick={() => setStep('SELECT_TYPE')}\n disabled={isPending}\n >\n Back\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => setStep('COMMON_MUTABLE_FIELDS')}\n disabled={isPending || !isTaskPropertiesValid}\n >\n Next\n </Button>\n </>\n )\n break\n }\n case 'COMMON_MUTABLE_FIELDS': {\n dialogActions = (\n <>\n {!isEditMode && (\n <Button\n variant=\"outlined\"\n onClick={() => setStep('TYPE_SPECIFIC_FIELDS')}\n disabled={isPending}\n >\n Back\n </Button>\n )}\n <Button\n variant=\"contained\"\n onClick={handleSave}\n disabled={isPending || selectedConcreteType === null}\n >\n Save\n </Button>\n </>\n )\n break\n }\n }\n\n return (\n <DialogBase\n open={open}\n title={title}\n maxWidth=\"md\"\n fullWidth\n onCancel={onCancel}\n content={dialogContent}\n actions={\n <Stack direction=\"row\" gap={1} justifyContent=\"flex-end\" width=\"100%\">\n {dialogActions}\n </Stack>\n }\n />\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataTasksPage.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MetadataTasksPage.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CAqFtE"}
|
|
@@ -1,66 +1,69 @@
|
|
|
1
1
|
import { displayToast as e } from "../../../../components/ToastMessage/ToastMessage.js";
|
|
2
2
|
import { useGlobalIsEditingContext as t } from "../../../../utils/context/GlobalIsEditingContext.js";
|
|
3
3
|
import { useGetEntityPermissions as n } from "../../../../synapse-queries/entity/useEntity.js";
|
|
4
|
-
import r from "../../../../
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
4
|
+
import { useGetFeatureFlag as r } from "../../../../synapse-queries/featureflags/useGetFeatureFlag.js";
|
|
5
|
+
import "../../../../synapse-queries/index.js";
|
|
6
|
+
import { FeatureFlagEnum as i } from "../../../../utils/featureflag/FeatureFlags.js";
|
|
7
|
+
import a from "../../../../components/TanStackTable/StyledTanStackTable.js";
|
|
8
|
+
import o from "../../../../components/layout/InfiniteTableLayout.js";
|
|
9
|
+
import s from "./CreateOrUpdateCurationTaskDialog.js";
|
|
10
|
+
import { useMetadataTaskTable as c } from "../hooks/useMetadataTaskTable.js";
|
|
11
|
+
import { useState as l } from "react";
|
|
12
|
+
import { Button as u, FormControlLabel as d, Stack as f, Switch as p } from "@mui/material";
|
|
13
|
+
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
14
|
+
import { AddCircleTwoTone as _ } from "@mui/icons-material";
|
|
12
15
|
//#region src/features/entity/metadata-task/components/MetadataTasksPage.tsx
|
|
13
|
-
function
|
|
14
|
-
let { projectId:
|
|
15
|
-
projectId:
|
|
16
|
+
function v(v) {
|
|
17
|
+
let { projectId: y } = v, [b, x] = l({
|
|
18
|
+
projectId: y,
|
|
16
19
|
assignedToMe: !1
|
|
17
|
-
}), [
|
|
18
|
-
return /* @__PURE__ */
|
|
20
|
+
}), [S, C] = l(!1), { setIsEditing: w } = t(), { data: T } = n(y), { table: E, isLoading: D, hasNextPage: O, fetchNextPage: k, isFetchingNextPage: A } = c({ listCurationTaskRequest: b }), j = r(i.CURATION_TASK_PAGE_SHOW_NEW_TASK_BUTTON);
|
|
21
|
+
return /* @__PURE__ */ g(f, { children: [/* @__PURE__ */ g(f, {
|
|
19
22
|
direction: "row",
|
|
20
23
|
justifyContent: "flex-end",
|
|
21
|
-
children: [/* @__PURE__ */
|
|
22
|
-
control: /* @__PURE__ */ p
|
|
23
|
-
checked: !!
|
|
24
|
+
children: [/* @__PURE__ */ h(d, {
|
|
25
|
+
control: /* @__PURE__ */ h(p, {
|
|
26
|
+
checked: !!b.assignedToMe,
|
|
24
27
|
onChange: (e, t) => {
|
|
25
|
-
|
|
28
|
+
x((e) => ({
|
|
26
29
|
...e,
|
|
27
30
|
assignedToMe: t
|
|
28
31
|
}));
|
|
29
32
|
}
|
|
30
33
|
}),
|
|
31
34
|
label: "View only tasks assigned to me"
|
|
32
|
-
}),
|
|
33
|
-
projectId:
|
|
34
|
-
open:
|
|
35
|
+
}), j && T?.canAddChild && /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(s, {
|
|
36
|
+
projectId: y,
|
|
37
|
+
open: S,
|
|
35
38
|
onSuccess: () => {
|
|
36
|
-
e("Curation task created successfully", "success"),
|
|
39
|
+
e("Curation task created successfully", "success"), C(!1), w(!1);
|
|
37
40
|
},
|
|
38
41
|
onCancel: () => {
|
|
39
|
-
|
|
42
|
+
C(!1), w(!1);
|
|
40
43
|
}
|
|
41
|
-
}, String(
|
|
44
|
+
}, String(S)), /* @__PURE__ */ h(u, {
|
|
42
45
|
variant: "outlined",
|
|
43
46
|
onClick: () => {
|
|
44
|
-
|
|
47
|
+
C(!0), w(!0);
|
|
45
48
|
},
|
|
46
|
-
startIcon: /* @__PURE__ */
|
|
49
|
+
startIcon: /* @__PURE__ */ h(_, {}),
|
|
47
50
|
children: "New Task"
|
|
48
51
|
})] })]
|
|
49
|
-
}), /* @__PURE__ */
|
|
50
|
-
table: /* @__PURE__ */
|
|
51
|
-
table:
|
|
52
|
+
}), /* @__PURE__ */ h(o, {
|
|
53
|
+
table: /* @__PURE__ */ h(a, {
|
|
54
|
+
table: E,
|
|
52
55
|
styledTableContainerProps: { sx: { my: 2 } }
|
|
53
56
|
}),
|
|
54
|
-
isLoading:
|
|
55
|
-
isEmpty: !
|
|
56
|
-
hasNextPage:
|
|
57
|
+
isLoading: D,
|
|
58
|
+
isEmpty: !D && E.getRowModel().rows.length === 0,
|
|
59
|
+
hasNextPage: O,
|
|
57
60
|
onFetchNextPageClicked: () => {
|
|
58
|
-
|
|
61
|
+
k();
|
|
59
62
|
},
|
|
60
|
-
isFetchingNextPage:
|
|
63
|
+
isFetchingNextPage: A
|
|
61
64
|
})] });
|
|
62
65
|
}
|
|
63
66
|
//#endregion
|
|
64
|
-
export {
|
|
67
|
+
export { v as default };
|
|
65
68
|
|
|
66
69
|
//# sourceMappingURL=MetadataTasksPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataTasksPage.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useMetadataTaskTable } from '@/features/entity/metadata-task/hooks/useMetadataTaskTable'\nimport { Button, FormControlLabel, Stack, Switch } from '@mui/material'\nimport { useState } from 'react'\nimport { ListCurationTaskRequest } from '@sage-bionetworks/synapse-client'\nimport CreateOrUpdateCurationTaskDialog from './CreateOrUpdateCurationTaskDialog'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport { useGetEntityPermissions } from '@/synapse-queries/entity/useEntity'\nimport { AddCircleTwoTone } from '@mui/icons-material'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\n\nexport type MetadataTaskTableProps = {\n projectId: string\n}\n\n/**\n * Displays a list of metadata curation tasks for a particular project, with actions that can be performed on each task.\n * @param props\n * @constructor\n */\nexport default function MetadataTasksPage(props: MetadataTaskTableProps) {\n const { projectId } = props\n const [listCurationTaskRequest, setListCurationTaskRequest] =\n useState<ListCurationTaskRequest>({\n projectId,\n assignedToMe: false,\n })\n\n const [isDialogOpen, setIsDialogOpen] = useState(false)\n const { setIsEditing } = useGlobalIsEditingContext()\n\n const { data: permissions } = useGetEntityPermissions(projectId)\n\n const { table, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useMetadataTaskTable({\n listCurationTaskRequest,\n })\n\n return (\n <Stack>\n <Stack direction=\"row\" justifyContent=\"flex-end\">\n <FormControlLabel\n control={\n <Switch\n checked={!!listCurationTaskRequest.assignedToMe}\n onChange={(_e, checked) => {\n setListCurationTaskRequest(prev => ({\n ...prev,\n assignedToMe: checked,\n }))\n }}\n />\n }\n label=\"View only tasks assigned to me\"\n />\n {permissions?.canAddChild && (\n <>\n <CreateOrUpdateCurationTaskDialog\n key={String(isDialogOpen)}\n projectId={projectId}\n open={isDialogOpen}\n onSuccess={() => {\n displayToast('Curation task created successfully', 'success')\n setIsDialogOpen(false)\n setIsEditing(false)\n }}\n onCancel={() => {\n setIsDialogOpen(false)\n setIsEditing(false)\n }}\n />\n <Button\n variant=\"outlined\"\n onClick={() => {\n setIsDialogOpen(true)\n setIsEditing(true)\n }}\n startIcon={<AddCircleTwoTone />}\n >\n New Task\n </Button>\n </>\n )}\n </Stack>\n <InfiniteTableLayout\n table={\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 2 } }}\n />\n }\n isLoading={isLoading}\n isEmpty={!isLoading && table.getRowModel().rows.length === 0}\n hasNextPage={hasNextPage}\n onFetchNextPageClicked={() => {\n fetchNextPage()\n }}\n isFetchingNextPage={isFetchingNextPage}\n />\n </Stack>\n )\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MetadataTasksPage.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useMetadataTaskTable } from '@/features/entity/metadata-task/hooks/useMetadataTaskTable'\nimport { useGetFeatureFlag } from '@/synapse-queries/index'\nimport { Button, FormControlLabel, Stack, Switch } from '@mui/material'\nimport { useState } from 'react'\nimport { ListCurationTaskRequest } from '@sage-bionetworks/synapse-client'\nimport CreateOrUpdateCurationTaskDialog from './CreateOrUpdateCurationTaskDialog'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport { useGetEntityPermissions } from '@/synapse-queries/entity/useEntity'\nimport { AddCircleTwoTone } from '@mui/icons-material'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { FeatureFlagEnum } from '@/utils/featureflag/FeatureFlags'\n\nexport type MetadataTaskTableProps = {\n projectId: string\n}\n\n/**\n * Displays a list of metadata curation tasks for a particular project, with actions that can be performed on each task.\n * @param props\n * @constructor\n */\nexport default function MetadataTasksPage(props: MetadataTaskTableProps) {\n const { projectId } = props\n const [listCurationTaskRequest, setListCurationTaskRequest] =\n useState<ListCurationTaskRequest>({\n projectId,\n assignedToMe: false,\n })\n\n const [isDialogOpen, setIsDialogOpen] = useState(false)\n const { setIsEditing } = useGlobalIsEditingContext()\n\n const { data: permissions } = useGetEntityPermissions(projectId)\n\n const { table, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useMetadataTaskTable({\n listCurationTaskRequest,\n })\n\n const showNewTaskButton = useGetFeatureFlag(\n FeatureFlagEnum.CURATION_TASK_PAGE_SHOW_NEW_TASK_BUTTON,\n )\n\n return (\n <Stack>\n <Stack direction=\"row\" justifyContent=\"flex-end\">\n <FormControlLabel\n control={\n <Switch\n checked={!!listCurationTaskRequest.assignedToMe}\n onChange={(_e, checked) => {\n setListCurationTaskRequest(prev => ({\n ...prev,\n assignedToMe: checked,\n }))\n }}\n />\n }\n label=\"View only tasks assigned to me\"\n />\n {showNewTaskButton && permissions?.canAddChild && (\n <>\n <CreateOrUpdateCurationTaskDialog\n key={String(isDialogOpen)}\n projectId={projectId}\n open={isDialogOpen}\n onSuccess={() => {\n displayToast('Curation task created successfully', 'success')\n setIsDialogOpen(false)\n setIsEditing(false)\n }}\n onCancel={() => {\n setIsDialogOpen(false)\n setIsEditing(false)\n }}\n />\n <Button\n variant=\"outlined\"\n onClick={() => {\n setIsDialogOpen(true)\n setIsEditing(true)\n }}\n startIcon={<AddCircleTwoTone />}\n >\n New Task\n </Button>\n </>\n )}\n </Stack>\n <InfiniteTableLayout\n table={\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 2 } }}\n />\n }\n isLoading={isLoading}\n isEmpty={!isLoading && table.getRowModel().rows.length === 0}\n hasNextPage={hasNextPage}\n onFetchNextPageClicked={() => {\n fetchNextPage()\n }}\n isFetchingNextPage={isFetchingNextPage}\n />\n </Stack>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,SAAwB,EAAkB,GAA+B;CACvE,IAAM,EAAE,iBAAc,GAChB,CAAC,GAAyB,KAC9B,EAAkC;EAChC;EACA,cAAc;EACf,CAAC,EAEE,CAAC,GAAc,KAAmB,EAAS,GAAM,EACjD,EAAE,oBAAiB,GAA2B,EAE9C,EAAE,MAAM,MAAgB,EAAwB,EAAU,EAE1D,EAAE,UAAO,cAAW,gBAAa,kBAAe,0BACpD,EAAqB,EACnB,4BACD,CAAC,EAEE,IAAoB,EACxB,EAAgB,wCACjB;AAED,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAO,WAAU;EAAM,gBAAe;YAAtC,CACE,kBAAC,GAAD;GACE,SACE,kBAAC,GAAD;IACE,SAAS,CAAC,CAAC,EAAwB;IACnC,WAAW,GAAI,MAAY;AACzB,QAA2B,OAAS;MAClC,GAAG;MACH,cAAc;MACf,EAAE;;IAEL,CAAA;GAEJ,OAAM;GACN,CAAA,EACD,KAAqB,GAAa,eACjC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GAEa;GACX,MAAM;GACN,iBAAiB;AAGf,IAFA,EAAa,sCAAsC,UAAU,EAC7D,EAAgB,GAAM,EACtB,EAAa,GAAM;;GAErB,gBAAgB;AAEd,IADA,EAAgB,GAAM,EACtB,EAAa,GAAM;;GAErB,EAZK,OAAO,EAAa,CAYzB,EACF,kBAAC,GAAD;GACE,SAAQ;GACR,eAAe;AAEb,IADA,EAAgB,GAAK,EACrB,EAAa,GAAK;;GAEpB,WAAW,kBAAC,GAAD,EAAoB,CAAA;aAChC;GAEQ,CAAA,CACR,EAAA,CAAA,CAEC;KACR,kBAAC,GAAD;EACE,OACE,kBAAC,GAAD;GACS;GACP,2BAA2B,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE;GAC5C,CAAA;EAEO;EACX,SAAS,CAAC,KAAa,EAAM,aAAa,CAAC,KAAK,WAAW;EAC9C;EACb,8BAA8B;AAC5B,MAAe;;EAEG;EACpB,CAAA,CACI,EAAA,CAAA"}
|