synapse-react-client 4.0.28 → 4.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +102 -94
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/GridMenuButton/GridMenuButton.d.ts +4 -1
- package/dist/components/DataGrid/components/GridMenuButton/GridMenuButton.d.ts.map +1 -1
- package/dist/components/DataGrid/components/GridMenuButton/GridMenuButton.js +1 -0
- package/dist/components/DataGrid/components/GridMenuButton/GridMenuButton.js.map +1 -1
- package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -1
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +13 -10
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -1
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +20 -0
- package/dist/features/curator/dashboard/components/CurationTaskCardLayout.d.ts.map +1 -1
- package/dist/features/curator/dashboard/components/CurationTaskCardLayout.js +62 -49
- package/dist/features/curator/dashboard/components/CurationTaskCardLayout.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js +16 -20
- package/dist/features/entity/metadata-task/components/MetadataTasksPageRouter.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.d.ts +1 -1
- package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.js +89 -122
- package/dist/features/entity/metadata-task/create-task/ComputeTaskForm.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/CurateTaskForm.d.ts +1 -1
- package/dist/features/entity/metadata-task/create-task/CurateTaskForm.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/CurateTaskForm.js +77 -102
- package/dist/features/entity/metadata-task/create-task/CurateTaskForm.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/FileBasedFields.d.ts +6 -1
- package/dist/features/entity/metadata-task/create-task/FileBasedFields.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/FileBasedFields.js +9 -2
- package/dist/features/entity/metadata-task/create-task/FileBasedFields.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/RecordBasedFields.d.ts +5 -1
- package/dist/features/entity/metadata-task/create-task/RecordBasedFields.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/RecordBasedFields.js +6 -2
- package/dist/features/entity/metadata-task/create-task/RecordBasedFields.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/RecordSetFields.d.ts +7 -1
- package/dist/features/entity/metadata-task/create-task/RecordSetFields.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/RecordSetFields.js +10 -2
- package/dist/features/entity/metadata-task/create-task/RecordSetFields.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/SampleSheetFields.d.ts +6 -1
- package/dist/features/entity/metadata-task/create-task/SampleSheetFields.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/SampleSheetFields.js +9 -2
- package/dist/features/entity/metadata-task/create-task/SampleSheetFields.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/TaskStatusField.d.ts +19 -0
- package/dist/features/entity/metadata-task/create-task/TaskStatusField.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/create-task/TaskStatusField.js +32 -0
- package/dist/features/entity/metadata-task/create-task/TaskStatusField.js.map +1 -0
- package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.d.ts +21 -0
- package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.js +100 -0
- package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.js.map +1 -0
- package/dist/features/entity/metadata-task/create-task/useComputeTypeFields.d.ts +24 -0
- package/dist/features/entity/metadata-task/create-task/useComputeTypeFields.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/create-task/useComputeTypeFields.js +56 -0
- package/dist/features/entity/metadata-task/create-task/useComputeTypeFields.js.map +1 -0
- package/dist/features/entity/metadata-task/create-task/useCurateTypeFields.d.ts +26 -0
- package/dist/features/entity/metadata-task/create-task/useCurateTypeFields.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/create-task/useCurateTypeFields.js +57 -0
- package/dist/features/entity/metadata-task/create-task/useCurateTypeFields.js.map +1 -0
- package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.d.ts +4 -2
- package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.js +12 -11
- package/dist/features/entity/metadata-task/create-task/useCurationTaskFormState.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.d.ts +9 -14
- package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.js +11 -7
- package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.d.ts +11 -12
- package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.js +17 -12
- package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.d.ts +14 -1
- package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.js +23 -20
- package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.d.ts +0 -18
- package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.d.ts.map +0 -1
- package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.js +0 -78
- package/dist/features/entity/metadata-task/create-task/CreateCurationTaskFlow.js.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { DEFAULT_COMPUTE_TASK_TYPE as e } from "../utils/constants.js";
|
|
2
|
+
import { getComputeTaskConcreteType as t, instanceOfGridSupportedTaskProperties as n } from "../utils/types.js";
|
|
3
|
+
import { EMPTY_RECORD_SET_VALUE as r, isRecordSetFieldsValueValid as i } from "./RecordSetFields.js";
|
|
4
|
+
import { EMPTY_SAMPLE_SHEET_VALUE as a, isSampleSheetFieldsValueValid as o } from "./SampleSheetFields.js";
|
|
5
|
+
import { useState as s } from "react";
|
|
6
|
+
import { RecordSetGenerationExecutionPropertiesConcreteTypeEnum as c, SampleSheetGenerationExecutionPropertiesConcreteTypeEnum as l } from "@sage-bionetworks/synapse-client";
|
|
7
|
+
//#region src/features/entity/metadata-task/create-task/useComputeTypeFields.ts
|
|
8
|
+
function u(e) {
|
|
9
|
+
return e === c.org_sagebionetworks_repo_model_curation_execution_RecordSetGenerationExecutionProperties ? {
|
|
10
|
+
concreteType: e,
|
|
11
|
+
value: r
|
|
12
|
+
} : {
|
|
13
|
+
concreteType: e,
|
|
14
|
+
value: a
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function d(t) {
|
|
18
|
+
return t?.concreteType === l.org_sagebionetworks_repo_model_curation_execution_SampleSheetGenerationExecutionProperties ? {
|
|
19
|
+
concreteType: t.concreteType,
|
|
20
|
+
value: {
|
|
21
|
+
inputTaskId: t.inputTaskId?.toString() ?? "",
|
|
22
|
+
destinationTaskId: t.destinationTaskId?.toString() ?? ""
|
|
23
|
+
}
|
|
24
|
+
} : t?.concreteType === c.org_sagebionetworks_repo_model_curation_execution_RecordSetGenerationExecutionProperties ? {
|
|
25
|
+
concreteType: t.concreteType,
|
|
26
|
+
value: {
|
|
27
|
+
folderId: t.folderId ?? "",
|
|
28
|
+
instructions: t.instructions ?? "",
|
|
29
|
+
destinationTaskId: t.destinationTaskId?.toString() ?? ""
|
|
30
|
+
}
|
|
31
|
+
} : u(e);
|
|
32
|
+
}
|
|
33
|
+
function f(e) {
|
|
34
|
+
let { taskProperties: r, isEditMode: a } = e, c = t(r), f = !a || c !== void 0, p = a && c === void 0 && !n(r), [m, h] = s(() => d(r));
|
|
35
|
+
function g(e) {
|
|
36
|
+
h(u(e));
|
|
37
|
+
}
|
|
38
|
+
function _(e) {
|
|
39
|
+
h((t) => ({
|
|
40
|
+
...t,
|
|
41
|
+
value: e
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
state: m,
|
|
46
|
+
setConcreteType: g,
|
|
47
|
+
setValue: _,
|
|
48
|
+
isValid: !f || (m.concreteType === l.org_sagebionetworks_repo_model_curation_execution_SampleSheetGenerationExecutionProperties ? o(m.value) : i(m.value)),
|
|
49
|
+
showTypeSection: f,
|
|
50
|
+
showUnrecognizedTypeWarning: p
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { f as useComputeTypeFields };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=useComputeTypeFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useComputeTypeFields.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/create-task/useComputeTypeFields.ts"],"sourcesContent":["import {\n CurationTaskProperties,\n RecordSetGenerationExecutionPropertiesConcreteTypeEnum,\n SampleSheetGenerationExecutionPropertiesConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { useState } from 'react'\nimport { DEFAULT_COMPUTE_TASK_TYPE } from '../utils/constants'\nimport {\n ComputeTaskConcreteType,\n getComputeTaskConcreteType,\n instanceOfGridSupportedTaskProperties,\n} from '../utils/types'\nimport {\n EMPTY_RECORD_SET_VALUE,\n isRecordSetFieldsValueValid,\n RecordSetFieldsValue,\n} from './RecordSetFields'\nimport {\n EMPTY_SAMPLE_SHEET_VALUE,\n isSampleSheetFieldsValueValid,\n SampleSheetFieldsValue,\n} from './SampleSheetFields'\nimport { ComputeTypeFields } from './utils/buildComputeTaskPayload'\n\nfunction emptyValueForConcreteType(\n concreteType: ComputeTaskConcreteType,\n): ComputeTypeFields {\n if (\n concreteType ===\n RecordSetGenerationExecutionPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_execution_RecordSetGenerationExecutionProperties\n ) {\n return { concreteType, value: EMPTY_RECORD_SET_VALUE }\n }\n return { concreteType, value: EMPTY_SAMPLE_SHEET_VALUE }\n}\n\nfunction initialStateFor(\n taskProperties: CurationTaskProperties | undefined,\n): ComputeTypeFields {\n if (\n taskProperties?.concreteType ===\n SampleSheetGenerationExecutionPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_execution_SampleSheetGenerationExecutionProperties\n ) {\n return {\n concreteType: taskProperties.concreteType,\n value: {\n inputTaskId: taskProperties.inputTaskId?.toString() ?? '',\n destinationTaskId: taskProperties.destinationTaskId?.toString() ?? '',\n },\n }\n }\n if (\n taskProperties?.concreteType ===\n RecordSetGenerationExecutionPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_execution_RecordSetGenerationExecutionProperties\n ) {\n return {\n concreteType: taskProperties.concreteType,\n value: {\n folderId: taskProperties.folderId ?? '',\n instructions: taskProperties.instructions ?? '',\n destinationTaskId: taskProperties.destinationTaskId?.toString() ?? '',\n },\n }\n }\n return emptyValueForConcreteType(DEFAULT_COMPUTE_TASK_TYPE)\n}\n\nexport type UseComputeTypeFieldsArgs = {\n /** The existing task's `taskProperties`, for edit-mode initialization. Undefined when creating. */\n taskProperties: CurationTaskProperties | undefined\n isEditMode: boolean\n}\n\n/**\n * Owns the single active Compute Data type-specific value (`ComputeTypeFields`) for `ComputeTaskForm`:\n * which concrete type is selected, its field values, and whether that value is currently valid.\n * Switching the concrete type resets the value to that type's empty default.\n */\nexport function useComputeTypeFields(args: UseComputeTypeFieldsArgs) {\n const { taskProperties, isEditMode } = args\n\n const existingComputeConcreteType = getComputeTaskConcreteType(taskProperties)\n // Whether the type-specific fields (and type selector) should render at all. False when editing a\n // task whose category isn't one of the two Compute Data types (e.g. a legacy Curate Data task).\n const showTypeSection =\n !isEditMode || existingComputeConcreteType !== undefined\n const showUnrecognizedTypeWarning =\n isEditMode &&\n existingComputeConcreteType === undefined &&\n !instanceOfGridSupportedTaskProperties(taskProperties)\n\n const [state, setState] = useState<ComputeTypeFields>(() =>\n initialStateFor(taskProperties),\n )\n\n function setConcreteType(concreteType: ComputeTaskConcreteType) {\n setState(emptyValueForConcreteType(concreteType))\n }\n\n function setValue(value: SampleSheetFieldsValue | RecordSetFieldsValue) {\n setState(prev => ({ ...prev, value }) as ComputeTypeFields)\n }\n\n const isValid =\n !showTypeSection ||\n (state.concreteType ===\n SampleSheetGenerationExecutionPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_execution_SampleSheetGenerationExecutionProperties\n ? isSampleSheetFieldsValueValid(state.value)\n : isRecordSetFieldsValueValid(state.value))\n\n return {\n state,\n setConcreteType,\n setValue,\n isValid,\n showTypeSection,\n showUnrecognizedTypeWarning,\n }\n}\n"],"mappings":";;;;;;;AAwBA,SAAS,EACP,GACmB;CAOnB,OALE,MACA,EAAuD,2FAEhD;EAAE;EAAc,OAAO;CAAuB,IAEhD;EAAE;EAAc,OAAO;CAAyB;AACzD;AAEA,SAAS,EACP,GACmB;CA0BnB,OAxBE,GAAgB,iBAChB,EAAyD,6FAElD;EACL,cAAc,EAAe;EAC7B,OAAO;GACL,aAAa,EAAe,aAAa,SAAS,KAAK;GACvD,mBAAmB,EAAe,mBAAmB,SAAS,KAAK;EACrE;CACF,IAGA,GAAgB,iBAChB,EAAuD,2FAEhD;EACL,cAAc,EAAe;EAC7B,OAAO;GACL,UAAU,EAAe,YAAY;GACrC,cAAc,EAAe,gBAAgB;GAC7C,mBAAmB,EAAe,mBAAmB,SAAS,KAAK;EACrE;CACF,IAEK,EAA0B,CAAyB;AAC5D;AAaA,SAAgB,EAAqB,GAAgC;CACnE,IAAM,EAAE,mBAAgB,kBAAe,GAEjC,IAA8B,EAA2B,CAAc,GAGvE,IACJ,CAAC,KAAc,MAAgC,KAAA,GAC3C,IACJ,KACA,MAAgC,KAAA,KAChC,CAAC,EAAsC,CAAc,GAEjD,CAAC,GAAO,KAAY,QACxB,EAAgB,CAAc,CAChC;CAEA,SAAS,EAAgB,GAAuC;EAC9D,EAAS,EAA0B,CAAY,CAAC;CAClD;CAEA,SAAS,EAAS,GAAsD;EACtE,GAAS,OAAS;GAAE,GAAG;GAAM;EAAM,EAAuB;CAC5D;CASA,OAAO;EACL;EACA;EACA;EACA,SAVA,CAAC,MACA,EAAM,iBACP,EAAyD,6FACrD,EAA8B,EAAM,KAAK,IACzC,EAA4B,EAAM,KAAK;EAO3C;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CurationTaskProperties } from '@sage-bionetworks/synapse-client';
|
|
2
|
+
import { CurateTaskConcreteType } from '../utils/types';
|
|
3
|
+
import { FileBasedFieldsValue } from './FileBasedFields';
|
|
4
|
+
import { RecordBasedFieldsValue } from './RecordBasedFields';
|
|
5
|
+
import { CurateTypeState } from './utils/buildCurateTaskPayload';
|
|
6
|
+
export type UseCurateTypeFieldsArgs = {
|
|
7
|
+
/** The existing task's `taskProperties`, for edit-mode initialization. Undefined when creating. */
|
|
8
|
+
taskProperties: CurationTaskProperties | undefined;
|
|
9
|
+
isEditMode: boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Owns the single active Curate Data type-specific value (`CurateTypeState`) for `CurateTaskForm` --
|
|
13
|
+
* which concrete type is selected, its field values, and whether that value is currently valid -- plus
|
|
14
|
+
* the Authorization Mode selection and whether it has changed from the task's existing value.
|
|
15
|
+
* Switching the concrete type resets the value to that type's empty default.
|
|
16
|
+
*/
|
|
17
|
+
export declare function useCurateTypeFields(args: UseCurateTypeFieldsArgs): {
|
|
18
|
+
state: CurateTypeState;
|
|
19
|
+
setConcreteType: (concreteType: CurateTaskConcreteType) => void;
|
|
20
|
+
setValue: (value: FileBasedFieldsValue | RecordBasedFieldsValue) => void;
|
|
21
|
+
isValid: boolean;
|
|
22
|
+
authorizationMode: "NONE" | "SESSION_OWNER" | "SOURCE_BENEFACTOR";
|
|
23
|
+
setAuthorizationMode: import("react").Dispatch<import("react").SetStateAction<"NONE" | "SESSION_OWNER" | "SOURCE_BENEFACTOR">>;
|
|
24
|
+
authModeChanged: boolean;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=useCurateTypeFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCurateTypeFields.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/create-task/useCurateTypeFields.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAGvB,MAAM,kCAAkC,CAAA;AAGzC,OAAO,EACL,sBAAsB,EAEvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAEL,oBAAoB,EAErB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAGL,sBAAsB,EACvB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEL,eAAe,EAChB,MAAM,gCAAgC,CAAA;AAgDvC,MAAM,MAAM,uBAAuB,GAAG;IACpC,mGAAmG;IACnG,cAAc,EAAE,sBAAsB,GAAG,SAAS,CAAA;IAClD,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB;;oCAOxB,sBAAsB;sBAIpC,oBAAoB,GAAG,sBAAsB;;;;;EA8BvE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { DEFAULT_CURATE_TASK_TYPE as e } from "../utils/constants.js";
|
|
2
|
+
import { instanceOfGridSupportedTaskProperties as t } from "../utils/types.js";
|
|
3
|
+
import { EMPTY_FILE_BASED_VALUE as n, isFileBasedFieldsValueValid as r } from "./FileBasedFields.js";
|
|
4
|
+
import { EMPTY_RECORD_BASED_VALUE as i, isRecordBasedFieldsValueValid as a } from "./RecordBasedFields.js";
|
|
5
|
+
import { useState as o } from "react";
|
|
6
|
+
import { FileBasedMetadataTaskPropertiesConcreteTypeEnum as s, RecordBasedMetadataTaskPropertiesConcreteTypeEnum as c } from "@sage-bionetworks/synapse-client";
|
|
7
|
+
//#region src/features/entity/metadata-task/create-task/useCurateTypeFields.ts
|
|
8
|
+
function l(e) {
|
|
9
|
+
return e === "SESSION_OWNER" || e === "SOURCE_BENEFACTOR" ? e : "NONE";
|
|
10
|
+
}
|
|
11
|
+
function u(e) {
|
|
12
|
+
return e === c.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties ? {
|
|
13
|
+
concreteType: e,
|
|
14
|
+
value: i
|
|
15
|
+
} : {
|
|
16
|
+
concreteType: e,
|
|
17
|
+
value: n
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function d(t) {
|
|
21
|
+
return t?.concreteType === s.org_sagebionetworks_repo_model_curation_metadata_FileBasedMetadataTaskProperties ? {
|
|
22
|
+
concreteType: t.concreteType,
|
|
23
|
+
value: {
|
|
24
|
+
uploadFolderId: t.uploadFolderId ?? "",
|
|
25
|
+
fileViewId: t.fileViewId ?? ""
|
|
26
|
+
}
|
|
27
|
+
} : t?.concreteType === c.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties ? {
|
|
28
|
+
concreteType: t.concreteType,
|
|
29
|
+
value: { recordSetId: t.recordSetId ?? "" }
|
|
30
|
+
} : u(e);
|
|
31
|
+
}
|
|
32
|
+
function f(e) {
|
|
33
|
+
let { taskProperties: n, isEditMode: i } = e, [c, f] = o(() => d(n));
|
|
34
|
+
function p(e) {
|
|
35
|
+
f(u(e));
|
|
36
|
+
}
|
|
37
|
+
function m(e) {
|
|
38
|
+
f((t) => ({
|
|
39
|
+
...t,
|
|
40
|
+
value: e
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
let h = c.concreteType === s.org_sagebionetworks_repo_model_curation_metadata_FileBasedMetadataTaskProperties ? r(c.value) : a(c.value), g = l(t(n) ? n.suggestedAuthorizationMode : void 0), [_, v] = o(g);
|
|
44
|
+
return {
|
|
45
|
+
state: c,
|
|
46
|
+
setConcreteType: p,
|
|
47
|
+
setValue: m,
|
|
48
|
+
isValid: h,
|
|
49
|
+
authorizationMode: _,
|
|
50
|
+
setAuthorizationMode: v,
|
|
51
|
+
authModeChanged: i && _ !== g
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { f as useCurateTypeFields };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=useCurateTypeFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCurateTypeFields.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/create-task/useCurateTypeFields.ts"],"sourcesContent":["import {\n CurationTaskProperties,\n FileBasedMetadataTaskPropertiesConcreteTypeEnum,\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { useState } from 'react'\nimport { DEFAULT_CURATE_TASK_TYPE } from '../utils/constants'\nimport {\n CurateTaskConcreteType,\n instanceOfGridSupportedTaskProperties,\n} from '../utils/types'\nimport {\n EMPTY_FILE_BASED_VALUE,\n FileBasedFieldsValue,\n isFileBasedFieldsValueValid,\n} from './FileBasedFields'\nimport {\n EMPTY_RECORD_BASED_VALUE,\n isRecordBasedFieldsValueValid,\n RecordBasedFieldsValue,\n} from './RecordBasedFields'\nimport {\n AuthorizationModeOption,\n CurateTypeState,\n} from './utils/buildCurateTaskPayload'\n\nfunction toAuthorizationModeOption(\n value: string | undefined,\n): AuthorizationModeOption {\n if (value === 'SESSION_OWNER' || value === 'SOURCE_BENEFACTOR') return value\n return 'NONE'\n}\n\nfunction emptyValueForConcreteType(\n concreteType: CurateTaskConcreteType,\n): CurateTypeState {\n if (\n concreteType ===\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties\n ) {\n return { concreteType, value: EMPTY_RECORD_BASED_VALUE }\n }\n return { concreteType, value: EMPTY_FILE_BASED_VALUE }\n}\n\nfunction initialStateFor(\n taskProperties: CurationTaskProperties | undefined,\n): CurateTypeState {\n if (\n taskProperties?.concreteType ===\n FileBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_FileBasedMetadataTaskProperties\n ) {\n return {\n concreteType: taskProperties.concreteType,\n value: {\n uploadFolderId: taskProperties.uploadFolderId ?? '',\n fileViewId: taskProperties.fileViewId ?? '',\n },\n }\n }\n if (\n taskProperties?.concreteType ===\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties\n ) {\n return {\n concreteType: taskProperties.concreteType,\n value: { recordSetId: taskProperties.recordSetId ?? '' },\n }\n }\n return emptyValueForConcreteType(DEFAULT_CURATE_TASK_TYPE)\n}\n\nexport type UseCurateTypeFieldsArgs = {\n /** The existing task's `taskProperties`, for edit-mode initialization. Undefined when creating. */\n taskProperties: CurationTaskProperties | undefined\n isEditMode: boolean\n}\n\n/**\n * Owns the single active Curate Data type-specific value (`CurateTypeState`) for `CurateTaskForm` --\n * which concrete type is selected, its field values, and whether that value is currently valid -- plus\n * the Authorization Mode selection and whether it has changed from the task's existing value.\n * Switching the concrete type resets the value to that type's empty default.\n */\nexport function useCurateTypeFields(args: UseCurateTypeFieldsArgs) {\n const { taskProperties, isEditMode } = args\n\n const [state, setState] = useState<CurateTypeState>(() =>\n initialStateFor(taskProperties),\n )\n\n function setConcreteType(concreteType: CurateTaskConcreteType) {\n setState(emptyValueForConcreteType(concreteType))\n }\n\n function setValue(value: FileBasedFieldsValue | RecordBasedFieldsValue) {\n setState(prev => ({ ...prev, value }) as CurateTypeState)\n }\n\n const isValid =\n state.concreteType ===\n FileBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_FileBasedMetadataTaskProperties\n ? isFileBasedFieldsValueValid(state.value)\n : isRecordBasedFieldsValueValid(state.value)\n\n const initialAuthorizationMode = toAuthorizationModeOption(\n instanceOfGridSupportedTaskProperties(taskProperties)\n ? taskProperties.suggestedAuthorizationMode\n : undefined,\n )\n const [authorizationMode, setAuthorizationMode] = useState(\n initialAuthorizationMode,\n )\n const authModeChanged =\n isEditMode && authorizationMode !== initialAuthorizationMode\n\n return {\n state,\n setConcreteType,\n setValue,\n isValid,\n authorizationMode,\n setAuthorizationMode,\n authModeChanged,\n }\n}\n"],"mappings":";;;;;;;AA0BA,SAAS,EACP,GACyB;CAEzB,OADI,MAAU,mBAAmB,MAAU,sBAA4B,IAChE;AACT;AAEA,SAAS,EACP,GACiB;CAOjB,OALE,MACA,EAAkD,qFAE3C;EAAE;EAAc,OAAO;CAAyB,IAElD;EAAE;EAAc,OAAO;CAAuB;AACvD;AAEA,SAAS,EACP,GACiB;CAsBjB,OApBE,GAAgB,iBAChB,EAAgD,mFAEzC;EACL,cAAc,EAAe;EAC7B,OAAO;GACL,gBAAgB,EAAe,kBAAkB;GACjD,YAAY,EAAe,cAAc;EAC3C;CACF,IAGA,GAAgB,iBAChB,EAAkD,qFAE3C;EACL,cAAc,EAAe;EAC7B,OAAO,EAAE,aAAa,EAAe,eAAe,GAAG;CACzD,IAEK,EAA0B,CAAwB;AAC3D;AAcA,SAAgB,EAAoB,GAA+B;CACjE,IAAM,EAAE,mBAAgB,kBAAe,GAEjC,CAAC,GAAO,KAAY,QACxB,EAAgB,CAAc,CAChC;CAEA,SAAS,EAAgB,GAAsC;EAC7D,EAAS,EAA0B,CAAY,CAAC;CAClD;CAEA,SAAS,EAAS,GAAsD;EACtE,GAAS,OAAS;GAAE,GAAG;GAAM;EAAM,EAAqB;CAC1D;CAEA,IAAM,IACJ,EAAM,iBACN,EAAgD,mFAC5C,EAA4B,EAAM,KAAK,IACvC,EAA8B,EAAM,KAAK,GAEzC,IAA2B,EAC/B,EAAsC,CAAc,IAChD,EAAe,6BACf,KAAA,CACN,GACM,CAAC,GAAmB,KAAwB,EAChD,CACF;CAIA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,iBATA,KAAc,MAAsB;CAUtC;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CurationTask, TaskStatusStateEnum } from '@sage-bionetworks/synapse-client';
|
|
1
|
+
import { CurationTask, TaskExecutionDetails, TaskStatusStateEnum } from '@sage-bionetworks/synapse-client';
|
|
2
2
|
export type UseCurationTaskFormStateArgs = {
|
|
3
3
|
/**
|
|
4
4
|
* Present when the host page already has a project context. Absent when creating from a context
|
|
@@ -45,6 +45,8 @@ export declare function useCurationTaskFormState(args: UseCurationTaskFormStateA
|
|
|
45
45
|
error: import("@sage-bionetworks/synapse-client").SynapseClientError | null;
|
|
46
46
|
isCommonFieldsValid: boolean;
|
|
47
47
|
isProjectValid: boolean;
|
|
48
|
-
submitTaskAndStatus: (payload: CurationTask
|
|
48
|
+
submitTaskAndStatus: (payload: CurationTask, options?: {
|
|
49
|
+
initialExecutionDetails?: TaskExecutionDetails;
|
|
50
|
+
}) => Promise<CurationTask>;
|
|
49
51
|
};
|
|
50
52
|
//# sourceMappingURL=useCurationTaskFormState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCurationTaskFormState.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/create-task/useCurationTaskFormState.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,YAAY,EACZ,mBAAmB,EACpB,MAAM,kCAAkC,CAAA;AASzC,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useCurationTaskFormState.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/create-task/useCurationTaskFormState.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,kCAAkC,CAAA;AASzC,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAoG9D,YAAY,YACX;QAAE,uBAAuB,CAAC,EAAE,oBAAoB,CAAA;KAAE,KAC3D,OAAO,CAAC,YAAY,CAAC;EAkGzB"}
|
|
@@ -17,28 +17,29 @@ function p(p) {
|
|
|
17
17
|
e(l + t.message, "danger");
|
|
18
18
|
}
|
|
19
19
|
}), Q = H || G || J || Z, $ = U ?? K ?? Y, te = !!C.trim() && !!T.trim(), ne = !y || !!b.trim();
|
|
20
|
-
async function re(t) {
|
|
21
|
-
let
|
|
20
|
+
async function re(t, n) {
|
|
21
|
+
let r = ee(I);
|
|
22
22
|
if (_) {
|
|
23
|
-
let e = await W(t),
|
|
24
|
-
return (
|
|
23
|
+
let e = await W(t), n = j !== void 0 && j !== k?.state, i = P !== void 0 && r !== (k?.dueDate ?? void 0);
|
|
24
|
+
return (n || i) && k != null && await q({
|
|
25
25
|
...k,
|
|
26
26
|
state: j ?? k.state,
|
|
27
|
-
dueDate: P === void 0 ? k.dueDate :
|
|
27
|
+
dueDate: P === void 0 ? k.dueDate : r,
|
|
28
28
|
etag: e.etag
|
|
29
29
|
}), e;
|
|
30
30
|
}
|
|
31
|
-
let
|
|
32
|
-
if (n &&
|
|
31
|
+
let i = await V(t);
|
|
32
|
+
if ((r || n?.initialExecutionDetails) && i.taskId != null) try {
|
|
33
33
|
await q({
|
|
34
|
-
...await v.curationTaskServicesClient.getRepoV1CurationTaskTaskIdStatus({ taskId:
|
|
35
|
-
taskId:
|
|
36
|
-
dueDate:
|
|
34
|
+
...await v.curationTaskServicesClient.getRepoV1CurationTaskTaskIdStatus({ taskId: i.taskId }),
|
|
35
|
+
taskId: i.taskId,
|
|
36
|
+
dueDate: r,
|
|
37
|
+
executionDetails: n?.initialExecutionDetails
|
|
37
38
|
});
|
|
38
39
|
} catch {
|
|
39
40
|
e(c, "warning");
|
|
40
41
|
}
|
|
41
|
-
return
|
|
42
|
+
return i;
|
|
42
43
|
}
|
|
43
44
|
return {
|
|
44
45
|
isEditMode: _,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCurationTaskFormState.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/create-task/useCurationTaskFormState.ts"],"sourcesContent":["import {\n useCreateCurationTask,\n useDeleteCurationTask,\n useGetCurationTaskStatus,\n useUpdateCurationTask,\n useUpdateCurationTaskStatus,\n} from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetEntityPermissions } from '@/synapse-queries/entity/useEntity'\nimport { displayToast } from '@/components/ToastMessage'\nimport { useSynapseContext } from '@/utils/index'\nimport {\n CurationTask,\n TaskStatusStateEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { useState } from 'react'\nimport {\n CREATE_TASK_STATUS_NOT_SAVED_WARNING,\n DELETE_CURATION_TASK_ERROR_TOAST_PREFIX,\n DELETE_CURATION_TASK_SUCCESS_TOAST,\n} from '../utils/constants'\nimport { dueDateInputToIso, isoToDueDateInput } from '../utils/dueDate'\n\nexport type UseCurationTaskFormStateArgs = {\n /**\n * Present when the host page already has a project context. Absent when creating from a context\n * without one, in which case the caller renders a project selector. Ignored in edit mode -- the\n * project is always derived from `task`.\n */\n projectId?: string\n /** The task being edited. Undefined when creating a new task. */\n task?: CurationTask\n /** Called after the task is successfully deleted (edit mode only). */\n onDeleted?: () => void\n}\n\n/**\n * The state and persistence logic shared by every curation-task create/edit form\n * (`ComputeTaskForm`, `CurateTaskForm`): common fields, project selection, task status (state +\n * due date), permissions, the create/update/delete mutations, and the submit-with-status flow.\n * The type-specific fields, validity, and payload construction remain the responsibility of each\n * form -- the caller passes a fully-built `CurationTask` payload to `submitTaskAndStatus`.\n */\nexport function useCurationTaskFormState(args: UseCurationTaskFormStateArgs) {\n const { projectId, task, onDeleted } = args\n const isEditMode = task !== undefined\n const { synapseClient } = useSynapseContext()\n\n const showProjectSelector = !isEditMode && !projectId\n const [selectedProjectId, setSelectedProjectId] = useState('')\n const effectiveProjectId = isEditMode\n ? (task?.projectId ?? '')\n : (projectId ?? selectedProjectId)\n\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 // Task status (edit mode only). `dueDate` also lives on TaskStatus, so it's collected here even in\n // create mode (where there's no status to fetch yet -- it's applied to the auto-created status\n // immediately after the task itself is created, see `submitTaskAndStatus`).\n const { data: currentTaskStatus, isFetching: isStatusFetching } =\n useGetCurationTaskStatus(task?.taskId ?? 0, {\n enabled: isEditMode && task?.taskId != null,\n })\n const [pendingStatusState, setPendingStatusState] = useState<\n TaskStatusStateEnum | undefined\n >(undefined)\n const displayedStatusState = pendingStatusState ?? currentTaskStatus?.state\n // `pendingDueDate` and `displayedDueDate` are always the native date input's `YYYY-MM-DD` string.\n // The backend stores `TaskStatus.dueDate` as an ISO 8601 date-time string, so the fetched value is\n // converted for display and the entered value is converted back on write.\n const [pendingDueDate, setPendingDueDate] = useState<string | undefined>(\n undefined,\n )\n const displayedDueDate =\n pendingDueDate ??\n (isEditMode ? isoToDueDateInput(currentTaskStatus?.dueDate) : '')\n\n const { data: permissions } = useGetEntityPermissions(effectiveProjectId, {\n enabled: !!effectiveProjectId,\n })\n const [showDeleteConfirmation, setShowDeleteConfirmation] = useState(false)\n const canDelete = Boolean(\n permissions?.canDelete &&\n isEditMode &&\n task?.taskId != null &&\n onDeleted != null,\n )\n\n const {\n mutateAsync: createTask,\n isPending: isCreatePending,\n error: createError,\n } = useCreateCurationTask()\n const {\n mutateAsync: updateTask,\n isPending: isUpdatePending,\n error: updateError,\n } = useUpdateCurationTask()\n const {\n mutateAsync: updateTaskStatus,\n isPending: isStatusUpdatePending,\n error: statusUpdateError,\n } = useUpdateCurationTaskStatus()\n const { mutate: deleteTask, isPending: isDeletePending } =\n useDeleteCurationTask({\n onSuccess: () => {\n displayToast(DELETE_CURATION_TASK_SUCCESS_TOAST, 'success')\n setShowDeleteConfirmation(false)\n onDeleted?.()\n },\n onError: err => {\n displayToast(\n DELETE_CURATION_TASK_ERROR_TOAST_PREFIX + err.message,\n 'danger',\n )\n },\n })\n\n const isPending =\n isCreatePending ||\n isUpdatePending ||\n isStatusUpdatePending ||\n isDeletePending\n const error = createError ?? updateError ?? statusUpdateError\n\n const isCommonFieldsValid = !!dataType.trim() && !!instructions.trim()\n const isProjectValid = !showProjectSelector || !!selectedProjectId.trim()\n\n /**\n * Persists `payload` as either a create or an update (based on edit mode), then reconciles the\n * task's `TaskStatus` (state + due date). Returns the persisted task. On create, the status is\n * fetched (it is created server-side automatically) and patched only when a due date was entered.\n * On update, the status is written only when the state or due date changed; clearing the due date\n * (empty string) is a valid change and persists as an absent due date.\n */\n async function submitTaskAndStatus(\n payload: CurationTask,\n ): Promise<CurationTask> {\n const dueDateIso = dueDateInputToIso(displayedDueDate)\n\n if (isEditMode) {\n const latestTask = await updateTask(payload)\n\n const statusStateChanged =\n pendingStatusState !== undefined &&\n pendingStatusState !== currentTaskStatus?.state\n const dueDateChanged =\n pendingDueDate !== undefined &&\n dueDateIso !== (currentTaskStatus?.dueDate ?? undefined)\n if ((statusStateChanged || dueDateChanged) && currentTaskStatus != null) {\n // The task and its status share an etag, and the preceding `updateTask` bumped it; the\n // status update must use the etag returned by that update, not the stale fetched one. When\n // the user didn't touch the due date, preserve the stored value verbatim rather than the\n // re-encoded one, so a status-only edit can never blank out or rewrite an existing due date.\n await updateTaskStatus({\n ...currentTaskStatus,\n state: pendingStatusState ?? currentTaskStatus.state,\n dueDate:\n pendingDueDate !== undefined\n ? dueDateIso\n : currentTaskStatus.dueDate,\n etag: latestTask.etag,\n })\n }\n\n return latestTask\n }\n\n const created = await createTask(payload)\n\n if (dueDateIso && created.taskId != null) {\n // TODO(PLFM-9839): replace this best-effort status write with a single service that creates\n // the task and its status atomically. Until then, the task is created first and the due date\n // is applied to the auto-created status in a separate call; a failure there must not strand a\n // created task or surface as a hard error (which would tempt the user to re-create the task).\n try {\n // A CurationTask's TaskStatus is created automatically server-side; fetch it so the due date\n // can be applied to it. The freshly-fetched status carries the current shared etag.\n const status =\n await synapseClient.curationTaskServicesClient.getRepoV1CurationTaskTaskIdStatus(\n { taskId: created.taskId },\n )\n await updateTaskStatus({\n ...status,\n taskId: created.taskId,\n dueDate: dueDateIso,\n })\n } catch {\n displayToast(CREATE_TASK_STATUS_NOT_SAVED_WARNING, 'warning')\n }\n }\n\n return created\n }\n\n return {\n isEditMode,\n // project\n showProjectSelector,\n selectedProjectId,\n setSelectedProjectId,\n effectiveProjectId,\n // common fields\n dataType,\n setDataType,\n instructions,\n setInstructions,\n assigneePrincipalId,\n setAssigneePrincipalId,\n // status + due date\n currentTaskStatus,\n isStatusFetching,\n displayedStatusState,\n setPendingStatusState,\n displayedDueDate,\n setPendingDueDate,\n // permissions + delete\n canDelete,\n showDeleteConfirmation,\n setShowDeleteConfirmation,\n deleteTask,\n isDeletePending,\n // aggregate mutation state\n isPending,\n error,\n // validity (common portion; type-specific validity is the caller's responsibility)\n isCommonFieldsValid,\n isProjectValid,\n // submit\n submitTaskAndStatus,\n }\n}\n"],"mappings":";;;;;;;;;;AA0CA,SAAgB,EAAyB,GAAoC;CAC3E,IAAM,EAAE,cAAW,SAAM,iBAAc,GACjC,IAAa,MAAS,KAAA,GACtB,EAAE,qBAAkB,EAAkB,GAEtC,IAAsB,CAAC,KAAc,CAAC,GACtC,CAAC,GAAmB,KAAwB,EAAS,EAAE,GACvD,IAAqB,IACtB,GAAM,aAAa,KACnB,KAAa,GAEZ,CAAC,GAAU,KAAe,QAAe,GAAM,YAAY,EAAE,GAC7D,CAAC,GAAc,KAAmB,QAChC,GAAM,gBAAgB,EAC9B,GACM,CAAC,GAAqB,KAA0B,QAE9C,GAAM,mBAAmB,GAK3B,EAAE,MAAM,GAAmB,YAAY,MAC3C,EAAyB,GAAM,UAAU,GAAG,EAC1C,SAAS,KAAc,GAAM,UAAU,KACzC,CAAC,GACG,CAAC,GAAoB,KAAyB,EAElD,KAAA,CAAS,GACL,IAAuB,KAAsB,GAAmB,OAIhE,CAAC,GAAgB,KAAqB,EAC1C,KAAA,CACF,GACM,IACJ,MACC,IAAa,EAAkB,GAAmB,OAAO,IAAI,KAE1D,EAAE,MAAM,MAAgB,EAAwB,GAAoB,EACxE,SAAS,CAAC,CAAC,EACb,CAAC,GACK,CAAC,GAAwB,KAA6B,EAAS,EAAK,GACpE,IAAY,GAChB,GAAa,aACb,KACA,GAAM,UAAU,QAChB,KAAa,OAGT,EACJ,aAAa,GACb,WAAW,GACX,OAAO,MACL,EAAsB,GACpB,EACJ,aAAa,GACb,WAAW,GACX,OAAO,MACL,EAAsB,GACpB,EACJ,aAAa,GACb,WAAW,GACX,OAAO,MACL,EAA4B,GAC1B,EAAE,QAAQ,GAAY,WAAW,MACrC,EAAsB;EACpB,iBAAiB;GAGf,AAFA,EAAa,GAAoC,SAAS,GAC1D,EAA0B,EAAK,GAC/B,IAAY;EACd;EACA,UAAS,MAAO;GACd,EACE,IAA0C,EAAI,SAC9C,QACF;EACF;CACF,CAAC,GAEG,IACJ,KACA,KACA,KACA,GACI,IAAQ,KAAe,KAAe,GAEtC,KAAsB,CAAC,CAAC,EAAS,KAAK,KAAK,CAAC,CAAC,EAAa,KAAK,GAC/D,KAAiB,CAAC,KAAuB,CAAC,CAAC,EAAkB,KAAK;CASxE,eAAe,GACb,GACuB;EACvB,IAAM,IAAa,GAAkB,CAAgB;EAErD,IAAI,GAAY;GACd,IAAM,IAAa,MAAM,EAAW,CAAO,GAErC,IACJ,MAAuB,KAAA,KACvB,MAAuB,GAAmB,OACtC,IACJ,MAAmB,KAAA,KACnB,OAAgB,GAAmB,WAAW,KAAA;GAiBhD,QAhBK,KAAsB,MAAmB,KAAqB,QAKjE,MAAM,EAAiB;IACrB,GAAG;IACH,OAAO,KAAsB,EAAkB;IAC/C,SACE,MAAmB,KAAA,IAEf,EAAkB,UADlB;IAEN,MAAM,EAAW;GACnB,CAAC,GAGI;EACT;EAEA,IAAM,IAAU,MAAM,EAAW,CAAO;EAExC,IAAI,KAAc,EAAQ,UAAU,MAKlC,IAAI;GAOF,MAAM,EAAiB;IACrB,GAAG,MAJG,EAAc,2BAA2B,kCAC7C,EAAE,QAAQ,EAAQ,OAAO,CAC3B;IAGA,QAAQ,EAAQ;IAChB,SAAS;GACX,CAAC;EACH,QAAQ;GACN,EAAa,GAAsC,SAAS;EAC9D;EAGF,OAAO;CACT;CAEA,OAAO;EACL;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"useCurationTaskFormState.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/create-task/useCurationTaskFormState.ts"],"sourcesContent":["import {\n useCreateCurationTask,\n useDeleteCurationTask,\n useGetCurationTaskStatus,\n useUpdateCurationTask,\n useUpdateCurationTaskStatus,\n} from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetEntityPermissions } from '@/synapse-queries/entity/useEntity'\nimport { displayToast } from '@/components/ToastMessage'\nimport { useSynapseContext } from '@/utils/index'\nimport {\n CurationTask,\n TaskExecutionDetails,\n TaskStatusStateEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { useState } from 'react'\nimport {\n CREATE_TASK_STATUS_NOT_SAVED_WARNING,\n DELETE_CURATION_TASK_ERROR_TOAST_PREFIX,\n DELETE_CURATION_TASK_SUCCESS_TOAST,\n} from '../utils/constants'\nimport { dueDateInputToIso, isoToDueDateInput } from '../utils/dueDate'\n\nexport type UseCurationTaskFormStateArgs = {\n /**\n * Present when the host page already has a project context. Absent when creating from a context\n * without one, in which case the caller renders a project selector. Ignored in edit mode -- the\n * project is always derived from `task`.\n */\n projectId?: string\n /** The task being edited. Undefined when creating a new task. */\n task?: CurationTask\n /** Called after the task is successfully deleted (edit mode only). */\n onDeleted?: () => void\n}\n\n/**\n * The state and persistence logic shared by every curation-task create/edit form\n * (`ComputeTaskForm`, `CurateTaskForm`): common fields, project selection, task status (state +\n * due date), permissions, the create/update/delete mutations, and the submit-with-status flow.\n * The type-specific fields, validity, and payload construction remain the responsibility of each\n * form -- the caller passes a fully-built `CurationTask` payload to `submitTaskAndStatus`.\n */\nexport function useCurationTaskFormState(args: UseCurationTaskFormStateArgs) {\n const { projectId, task, onDeleted } = args\n const isEditMode = task !== undefined\n const { synapseClient } = useSynapseContext()\n\n const showProjectSelector = !isEditMode && !projectId\n const [selectedProjectId, setSelectedProjectId] = useState('')\n const effectiveProjectId = isEditMode\n ? (task?.projectId ?? '')\n : (projectId ?? selectedProjectId)\n\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 // Task status (edit mode only). `dueDate` also lives on TaskStatus, so it's collected here even in\n // create mode (where there's no status to fetch yet -- it's applied to the auto-created status\n // immediately after the task itself is created, see `submitTaskAndStatus`).\n const { data: currentTaskStatus, isFetching: isStatusFetching } =\n useGetCurationTaskStatus(task?.taskId ?? 0, {\n enabled: isEditMode && task?.taskId != null,\n })\n const [pendingStatusState, setPendingStatusState] = useState<\n TaskStatusStateEnum | undefined\n >(undefined)\n const displayedStatusState = pendingStatusState ?? currentTaskStatus?.state\n // `pendingDueDate` and `displayedDueDate` are always the native date input's `YYYY-MM-DD` string.\n // The backend stores `TaskStatus.dueDate` as an ISO 8601 date-time string, so the fetched value is\n // converted for display and the entered value is converted back on write.\n const [pendingDueDate, setPendingDueDate] = useState<string | undefined>(\n undefined,\n )\n const displayedDueDate =\n pendingDueDate ??\n (isEditMode ? isoToDueDateInput(currentTaskStatus?.dueDate) : '')\n\n const { data: permissions } = useGetEntityPermissions(effectiveProjectId, {\n enabled: !!effectiveProjectId,\n })\n const [showDeleteConfirmation, setShowDeleteConfirmation] = useState(false)\n const canDelete = Boolean(\n permissions?.canDelete &&\n isEditMode &&\n task?.taskId != null &&\n onDeleted != null,\n )\n\n const {\n mutateAsync: createTask,\n isPending: isCreatePending,\n error: createError,\n } = useCreateCurationTask()\n const {\n mutateAsync: updateTask,\n isPending: isUpdatePending,\n error: updateError,\n } = useUpdateCurationTask()\n const {\n mutateAsync: updateTaskStatus,\n isPending: isStatusUpdatePending,\n error: statusUpdateError,\n } = useUpdateCurationTaskStatus()\n const { mutate: deleteTask, isPending: isDeletePending } =\n useDeleteCurationTask({\n onSuccess: () => {\n displayToast(DELETE_CURATION_TASK_SUCCESS_TOAST, 'success')\n setShowDeleteConfirmation(false)\n onDeleted?.()\n },\n onError: err => {\n displayToast(\n DELETE_CURATION_TASK_ERROR_TOAST_PREFIX + err.message,\n 'danger',\n )\n },\n })\n\n const isPending =\n isCreatePending ||\n isUpdatePending ||\n isStatusUpdatePending ||\n isDeletePending\n const error = createError ?? updateError ?? statusUpdateError\n\n const isCommonFieldsValid = !!dataType.trim() && !!instructions.trim()\n const isProjectValid = !showProjectSelector || !!selectedProjectId.trim()\n\n /**\n * Persists `payload` as either a create or an update (based on edit mode), then reconciles the\n * task's `TaskStatus` (state + due date + `options.initialExecutionDetails`). Returns the persisted\n * task. On create, the status is fetched (it is created server-side automatically) and patched when\n * a due date was entered or `options.initialExecutionDetails` was supplied. On update, the status is\n * written only when the state or due date changed; clearing the due date (empty string) is a valid\n * change and persists as an absent due date. `initialExecutionDetails` is never backfilled on edit.\n */\n async function submitTaskAndStatus(\n payload: CurationTask,\n options?: { initialExecutionDetails?: TaskExecutionDetails },\n ): Promise<CurationTask> {\n const dueDateIso = dueDateInputToIso(displayedDueDate)\n\n if (isEditMode) {\n const latestTask = await updateTask(payload)\n\n const statusStateChanged =\n pendingStatusState !== undefined &&\n pendingStatusState !== currentTaskStatus?.state\n const dueDateChanged =\n pendingDueDate !== undefined &&\n dueDateIso !== (currentTaskStatus?.dueDate ?? undefined)\n if ((statusStateChanged || dueDateChanged) && currentTaskStatus != null) {\n // The task and its status share an etag, and the preceding `updateTask` bumped it; the\n // status update must use the etag returned by that update, not the stale fetched one. When\n // the user didn't touch the due date, preserve the stored value verbatim rather than the\n // re-encoded one, so a status-only edit can never blank out or rewrite an existing due date.\n await updateTaskStatus({\n ...currentTaskStatus,\n state: pendingStatusState ?? currentTaskStatus.state,\n dueDate:\n pendingDueDate !== undefined\n ? dueDateIso\n : currentTaskStatus.dueDate,\n etag: latestTask.etag,\n })\n }\n\n return latestTask\n }\n\n const created = await createTask(payload)\n\n if (\n (dueDateIso || options?.initialExecutionDetails) &&\n created.taskId != null\n ) {\n // TODO(PLFM-9839): replace this best-effort status write with a single service that creates\n // the task and its status atomically. Until then, the task is created first and the due date\n // is applied to the auto-created status in a separate call; a failure there must not strand a\n // created task or surface as a hard error (which would tempt the user to re-create the task).\n try {\n // A CurationTask's TaskStatus is created automatically server-side; fetch it so the due date\n // can be applied to it. The freshly-fetched status carries the current shared etag.\n const status =\n await synapseClient.curationTaskServicesClient.getRepoV1CurationTaskTaskIdStatus(\n { taskId: created.taskId },\n )\n await updateTaskStatus({\n ...status,\n taskId: created.taskId,\n dueDate: dueDateIso,\n executionDetails: options?.initialExecutionDetails,\n })\n } catch {\n displayToast(CREATE_TASK_STATUS_NOT_SAVED_WARNING, 'warning')\n }\n }\n\n return created\n }\n\n return {\n isEditMode,\n // project\n showProjectSelector,\n selectedProjectId,\n setSelectedProjectId,\n effectiveProjectId,\n // common fields\n dataType,\n setDataType,\n instructions,\n setInstructions,\n assigneePrincipalId,\n setAssigneePrincipalId,\n // status + due date\n currentTaskStatus,\n isStatusFetching,\n displayedStatusState,\n setPendingStatusState,\n displayedDueDate,\n setPendingDueDate,\n // permissions + delete\n canDelete,\n showDeleteConfirmation,\n setShowDeleteConfirmation,\n deleteTask,\n isDeletePending,\n // aggregate mutation state\n isPending,\n error,\n // validity (common portion; type-specific validity is the caller's responsibility)\n isCommonFieldsValid,\n isProjectValid,\n // submit\n submitTaskAndStatus,\n }\n}\n"],"mappings":";;;;;;;;;;AA2CA,SAAgB,EAAyB,GAAoC;CAC3E,IAAM,EAAE,cAAW,SAAM,iBAAc,GACjC,IAAa,MAAS,KAAA,GACtB,EAAE,qBAAkB,EAAkB,GAEtC,IAAsB,CAAC,KAAc,CAAC,GACtC,CAAC,GAAmB,KAAwB,EAAS,EAAE,GACvD,IAAqB,IACtB,GAAM,aAAa,KACnB,KAAa,GAEZ,CAAC,GAAU,KAAe,QAAe,GAAM,YAAY,EAAE,GAC7D,CAAC,GAAc,KAAmB,QAChC,GAAM,gBAAgB,EAC9B,GACM,CAAC,GAAqB,KAA0B,QAE9C,GAAM,mBAAmB,GAK3B,EAAE,MAAM,GAAmB,YAAY,MAC3C,EAAyB,GAAM,UAAU,GAAG,EAC1C,SAAS,KAAc,GAAM,UAAU,KACzC,CAAC,GACG,CAAC,GAAoB,KAAyB,EAElD,KAAA,CAAS,GACL,IAAuB,KAAsB,GAAmB,OAIhE,CAAC,GAAgB,KAAqB,EAC1C,KAAA,CACF,GACM,IACJ,MACC,IAAa,EAAkB,GAAmB,OAAO,IAAI,KAE1D,EAAE,MAAM,MAAgB,EAAwB,GAAoB,EACxE,SAAS,CAAC,CAAC,EACb,CAAC,GACK,CAAC,GAAwB,KAA6B,EAAS,EAAK,GACpE,IAAY,GAChB,GAAa,aACb,KACA,GAAM,UAAU,QAChB,KAAa,OAGT,EACJ,aAAa,GACb,WAAW,GACX,OAAO,MACL,EAAsB,GACpB,EACJ,aAAa,GACb,WAAW,GACX,OAAO,MACL,EAAsB,GACpB,EACJ,aAAa,GACb,WAAW,GACX,OAAO,MACL,EAA4B,GAC1B,EAAE,QAAQ,GAAY,WAAW,MACrC,EAAsB;EACpB,iBAAiB;GAGf,AAFA,EAAa,GAAoC,SAAS,GAC1D,EAA0B,EAAK,GAC/B,IAAY;EACd;EACA,UAAS,MAAO;GACd,EACE,IAA0C,EAAI,SAC9C,QACF;EACF;CACF,CAAC,GAEG,IACJ,KACA,KACA,KACA,GACI,IAAQ,KAAe,KAAe,GAEtC,KAAsB,CAAC,CAAC,EAAS,KAAK,KAAK,CAAC,CAAC,EAAa,KAAK,GAC/D,KAAiB,CAAC,KAAuB,CAAC,CAAC,EAAkB,KAAK;CAUxE,eAAe,GACb,GACA,GACuB;EACvB,IAAM,IAAa,GAAkB,CAAgB;EAErD,IAAI,GAAY;GACd,IAAM,IAAa,MAAM,EAAW,CAAO,GAErC,IACJ,MAAuB,KAAA,KACvB,MAAuB,GAAmB,OACtC,IACJ,MAAmB,KAAA,KACnB,OAAgB,GAAmB,WAAW,KAAA;GAiBhD,QAhBK,KAAsB,MAAmB,KAAqB,QAKjE,MAAM,EAAiB;IACrB,GAAG;IACH,OAAO,KAAsB,EAAkB;IAC/C,SACE,MAAmB,KAAA,IAEf,EAAkB,UADlB;IAEN,MAAM,EAAW;GACnB,CAAC,GAGI;EACT;EAEA,IAAM,IAAU,MAAM,EAAW,CAAO;EAExC,KACG,KAAc,GAAS,4BACxB,EAAQ,UAAU,MAMlB,IAAI;GAOF,MAAM,EAAiB;IACrB,GAAG,MAJG,EAAc,2BAA2B,kCAC7C,EAAE,QAAQ,EAAQ,OAAO,CAC3B;IAGA,QAAQ,EAAQ;IAChB,SAAS;IACT,kBAAkB,GAAS;GAC7B,CAAC;EACH,QAAQ;GACN,EAAa,GAAsC,SAAS;EAC9D;EAGF,OAAO;CACT;CAEA,OAAO;EACL;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;CACF;AACF"}
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
import { CurationTask } from '@sage-bionetworks/synapse-client';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
destinationTaskId: string;
|
|
6
|
-
};
|
|
7
|
-
export type RecordSetFieldsValue = {
|
|
8
|
-
folderId: string;
|
|
9
|
-
instructions: string;
|
|
10
|
-
destinationTaskId: string;
|
|
11
|
-
};
|
|
1
|
+
import { CurationTask, RecordSetGenerationExecutionPropertiesConcreteTypeEnum, SampleSheetGenerationExecutionPropertiesConcreteTypeEnum } from '@sage-bionetworks/synapse-client';
|
|
2
|
+
import { RecordSetFieldsValue } from '../RecordSetFields';
|
|
3
|
+
import { SampleSheetFieldsValue } from '../SampleSheetFields';
|
|
4
|
+
/** A form's active Compute Data type-specific value, as a discriminated union keyed by `concreteType`. */
|
|
12
5
|
export type ComputeTypeFields = {
|
|
13
|
-
concreteType:
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
concreteType: SampleSheetGenerationExecutionPropertiesConcreteTypeEnum;
|
|
7
|
+
value: SampleSheetFieldsValue;
|
|
8
|
+
} | {
|
|
9
|
+
concreteType: RecordSetGenerationExecutionPropertiesConcreteTypeEnum;
|
|
10
|
+
value: RecordSetFieldsValue;
|
|
16
11
|
};
|
|
17
12
|
export type BuildComputeTaskPayloadArgs = {
|
|
18
13
|
/** The task being edited, if any. Server-managed fields (taskId, etag, etc.) are carried over. */
|
package/dist/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildComputeTaskPayload.d.ts","sourceRoot":"","sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"buildComputeTaskPayload.d.ts","sourceRoot":"","sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,sDAAsD,EACtD,wDAAwD,EACzD,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAG7D,0GAA0G;AAC1G,MAAM,MAAM,iBAAiB,GACzB;IACE,YAAY,EAAE,wDAAwD,CAAA;IACtE,KAAK,EAAE,sBAAsB,CAAA;CAC9B,GACD;IACE,YAAY,EAAE,sDAAsD,CAAA;IACpE,KAAK,EAAE,oBAAoB,CAAA;CAC5B,CAAA;AAEL,MAAM,MAAM,2BAA2B,GAAG;IACxC,kGAAkG;IAClG,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACtC,CAAA;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,2BAA2B,GAChC,YAAY,CAsBd"}
|
|
@@ -13,13 +13,17 @@ function n(e) {
|
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
function r(n) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
if (n.concreteType === t.org_sagebionetworks_repo_model_curation_execution_RecordSetGenerationExecutionProperties) {
|
|
17
|
+
let { concreteType: t, value: r } = n;
|
|
18
|
+
return {
|
|
19
|
+
concreteType: t,
|
|
20
|
+
folderId: r.folderId.trim() || void 0,
|
|
21
|
+
instructions: r.instructions.trim() || void 0,
|
|
22
|
+
destinationTaskId: e(r.destinationTaskId)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
let { concreteType: r, value: i } = n;
|
|
26
|
+
return {
|
|
23
27
|
concreteType: r,
|
|
24
28
|
inputTaskId: e(i.inputTaskId),
|
|
25
29
|
destinationTaskId: e(i.destinationTaskId)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildComputeTaskPayload.js","names":[],"sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.ts"],"sourcesContent":["import {\n CurationTask,\n CurationTaskProperties,\n RecordSetGenerationExecutionPropertiesConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {
|
|
1
|
+
{"version":3,"file":"buildComputeTaskPayload.js","names":[],"sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildComputeTaskPayload.ts"],"sourcesContent":["import {\n CurationTask,\n CurationTaskProperties,\n RecordSetGenerationExecutionPropertiesConcreteTypeEnum,\n SampleSheetGenerationExecutionPropertiesConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { RecordSetFieldsValue } from '../RecordSetFields'\nimport { SampleSheetFieldsValue } from '../SampleSheetFields'\nimport { parseTaskIdInput } from './taskIdValidation'\n\n/** A form's active Compute Data type-specific value, as a discriminated union keyed by `concreteType`. */\nexport type ComputeTypeFields =\n | {\n concreteType: SampleSheetGenerationExecutionPropertiesConcreteTypeEnum\n value: SampleSheetFieldsValue\n }\n | {\n concreteType: RecordSetGenerationExecutionPropertiesConcreteTypeEnum\n value: RecordSetFieldsValue\n }\n\nexport type BuildComputeTaskPayloadArgs = {\n /** The task being edited, if any. Server-managed fields (taskId, etag, etc.) are carried over. */\n existingTask?: CurationTask\n projectId: string\n dataType: string\n instructions: string\n assigneePrincipalId: string | undefined\n /**\n * The Compute Data type-specific fields to write into `taskProperties`. Omit this when editing a task\n * whose category is not one of the two Compute Data types (e.g. a legacy Curate Data task) -- in that\n * case the existing `taskProperties` are carried over unchanged.\n */\n computeTypeFields?: ComputeTypeFields\n}\n\n/**\n * Builds the `CurationTask` payload for creating or updating a Compute Data task from the create/edit\n * task form's field state.\n */\nexport function buildComputeTaskPayload(\n args: BuildComputeTaskPayloadArgs,\n): CurationTask {\n const {\n existingTask,\n projectId,\n dataType,\n instructions,\n assigneePrincipalId,\n computeTypeFields,\n } = args\n\n const taskProperties = computeTypeFields\n ? buildComputeTaskProperties(computeTypeFields)\n : existingTask?.taskProperties\n\n return {\n ...existingTask,\n projectId,\n dataType: dataType.trim() || undefined,\n instructions: instructions.trim() || undefined,\n assigneePrincipalId: assigneePrincipalId || undefined,\n taskProperties,\n }\n}\n\nfunction buildComputeTaskProperties(\n fields: ComputeTypeFields,\n): CurationTaskProperties {\n if (\n fields.concreteType ===\n RecordSetGenerationExecutionPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_execution_RecordSetGenerationExecutionProperties\n ) {\n const { concreteType, value } = fields\n return {\n concreteType,\n folderId: value.folderId.trim() || undefined,\n instructions: value.instructions.trim() || undefined,\n destinationTaskId: parseTaskIdInput(value.destinationTaskId),\n }\n }\n\n const { concreteType, value } = fields\n return {\n concreteType,\n inputTaskId: parseTaskIdInput(value.inputTaskId),\n destinationTaskId: parseTaskIdInput(value.destinationTaskId),\n }\n}\n"],"mappings":";;;AAwCA,SAAgB,EACd,GACc;CACd,IAAM,EACJ,iBACA,cACA,aACA,iBACA,wBACA,yBACE,GAEE,IAAiB,IACnB,EAA2B,CAAiB,IAC5C,GAAc;CAElB,OAAO;EACL,GAAG;EACH;EACA,UAAU,EAAS,KAAK,KAAK,KAAA;EAC7B,cAAc,EAAa,KAAK,KAAK,KAAA;EACrC,qBAAqB,KAAuB,KAAA;EAC5C;CACF;AACF;AAEA,SAAS,EACP,GACwB;CACxB,IACE,EAAO,iBACP,EAAuD,0FACvD;EACA,IAAM,EAAE,iBAAc,aAAU;EAChC,OAAO;GACL;GACA,UAAU,EAAM,SAAS,KAAK,KAAK,KAAA;GACnC,cAAc,EAAM,aAAa,KAAK,KAAK,KAAA;GAC3C,mBAAmB,EAAiB,EAAM,iBAAiB;EAC7D;CACF;CAEA,IAAM,EAAE,iBAAc,aAAU;CAChC,OAAO;EACL;EACA,aAAa,EAAiB,EAAM,WAAW;EAC/C,mBAAmB,EAAiB,EAAM,iBAAiB;CAC7D;AACF"}
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import { CurationTask, FileBasedMetadataTaskPropertiesSuggestedAuthorizationModeEnum } from '@sage-bionetworks/synapse-client';
|
|
2
|
-
import {
|
|
1
|
+
import { CurationTask, FileBasedMetadataTaskPropertiesConcreteTypeEnum, FileBasedMetadataTaskPropertiesSuggestedAuthorizationModeEnum, RecordBasedMetadataTaskPropertiesConcreteTypeEnum } from '@sage-bionetworks/synapse-client';
|
|
2
|
+
import { FileBasedFieldsValue } from '../FileBasedFields';
|
|
3
|
+
import { RecordBasedFieldsValue } from '../RecordBasedFields';
|
|
3
4
|
/** Null represents the "Legacy" / unset option for suggestedAuthorizationMode. */
|
|
4
5
|
export type AuthorizationModeOption = FileBasedMetadataTaskPropertiesSuggestedAuthorizationModeEnum | 'NONE';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
/** A form's active Curate Data type-specific value, as a discriminated union keyed by `concreteType`. */
|
|
7
|
+
export type CurateTypeState = {
|
|
8
|
+
concreteType: FileBasedMetadataTaskPropertiesConcreteTypeEnum;
|
|
9
|
+
value: FileBasedFieldsValue;
|
|
10
|
+
} | {
|
|
11
|
+
concreteType: RecordBasedMetadataTaskPropertiesConcreteTypeEnum;
|
|
12
|
+
value: RecordBasedFieldsValue;
|
|
8
13
|
};
|
|
9
|
-
export type
|
|
10
|
-
recordSetId: string;
|
|
11
|
-
};
|
|
12
|
-
export type CurateTypeFields = {
|
|
13
|
-
concreteType: CurateTaskConcreteType;
|
|
14
|
+
export type CurateTypeFields = CurateTypeState & {
|
|
14
15
|
authorizationMode: AuthorizationModeOption;
|
|
15
|
-
fileBased: FileBasedFieldsValue;
|
|
16
|
-
recordBased: RecordBasedFieldsValue;
|
|
17
16
|
};
|
|
18
17
|
export type BuildCurateTaskPayloadArgs = {
|
|
19
18
|
/** The task being edited, if any. Server-managed fields (taskId, etag, etc.) are carried over. */
|
package/dist/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildCurateTaskPayload.d.ts","sourceRoot":"","sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"buildCurateTaskPayload.d.ts","sourceRoot":"","sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,+CAA+C,EAC/C,6DAA6D,EAC7D,iDAAiD,EAClD,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,kFAAkF;AAClF,MAAM,MAAM,uBAAuB,GAC/B,6DAA6D,GAC7D,MAAM,CAAA;AAEV,yGAAyG;AACzG,MAAM,MAAM,eAAe,GACvB;IACE,YAAY,EAAE,+CAA+C,CAAA;IAC7D,KAAK,EAAE,oBAAoB,CAAA;CAC5B,GACD;IACE,YAAY,EAAE,iDAAiD,CAAA;IAC/D,KAAK,EAAE,sBAAsB,CAAA;CAC9B,CAAA;AAEL,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG;IAC/C,iBAAiB,EAAE,uBAAuB,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,kGAAkG;IAClG,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,gBAAgB,EAAE,gBAAgB,CAAA;CACnC,CAAA;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,0BAA0B,GAC/B,YAAY,CA4Bd"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { instanceOfGridSupportedTaskProperties as e } from "../../utils/types.js";
|
|
2
|
-
import {
|
|
2
|
+
import { RecordBasedMetadataTaskPropertiesConcreteTypeEnum as t } from "@sage-bionetworks/synapse-client";
|
|
3
3
|
//#region src/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.ts
|
|
4
4
|
function n(t) {
|
|
5
5
|
let { existingTask: n, projectId: i, dataType: a, instructions: o, assigneePrincipalId: s, curateTypeFields: c } = t, l = n?.taskProperties, u = e(l) ? l.collaboratorPrincipalIds : void 0;
|
|
@@ -13,17 +13,22 @@ function n(t) {
|
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
function r(e, n) {
|
|
16
|
-
let {
|
|
17
|
-
|
|
18
|
-
concreteType: r
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
let { authorizationMode: r } = e, i = r === "NONE" ? void 0 : r;
|
|
17
|
+
if (e.concreteType === t.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties) {
|
|
18
|
+
let { concreteType: t, value: r } = e;
|
|
19
|
+
return {
|
|
20
|
+
concreteType: t,
|
|
21
|
+
recordSetId: r.recordSetId.trim() || void 0,
|
|
22
|
+
suggestedAuthorizationMode: i,
|
|
23
|
+
collaboratorPrincipalIds: n
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
let { concreteType: a, value: o } = e;
|
|
27
|
+
return {
|
|
28
|
+
concreteType: a,
|
|
29
|
+
uploadFolderId: o.uploadFolderId.trim() || void 0,
|
|
30
|
+
fileViewId: o.fileViewId.trim() || void 0,
|
|
31
|
+
suggestedAuthorizationMode: i,
|
|
27
32
|
collaboratorPrincipalIds: n
|
|
28
33
|
};
|
|
29
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildCurateTaskPayload.js","names":[],"sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.ts"],"sourcesContent":["import {\n CurationTask,\n CurationTaskProperties,\n FileBasedMetadataTaskPropertiesConcreteTypeEnum,\n FileBasedMetadataTaskPropertiesSuggestedAuthorizationModeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {
|
|
1
|
+
{"version":3,"file":"buildCurateTaskPayload.js","names":[],"sources":["../../../../../../src/features/entity/metadata-task/create-task/utils/buildCurateTaskPayload.ts"],"sourcesContent":["import {\n CurationTask,\n CurationTaskProperties,\n FileBasedMetadataTaskPropertiesConcreteTypeEnum,\n FileBasedMetadataTaskPropertiesSuggestedAuthorizationModeEnum,\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum,\n} from '@sage-bionetworks/synapse-client'\nimport { instanceOfGridSupportedTaskProperties } from '../../utils/types'\nimport { FileBasedFieldsValue } from '../FileBasedFields'\nimport { RecordBasedFieldsValue } from '../RecordBasedFields'\n\n/** Null represents the \"Legacy\" / unset option for suggestedAuthorizationMode. */\nexport type AuthorizationModeOption =\n | FileBasedMetadataTaskPropertiesSuggestedAuthorizationModeEnum\n | 'NONE'\n\n/** A form's active Curate Data type-specific value, as a discriminated union keyed by `concreteType`. */\nexport type CurateTypeState =\n | {\n concreteType: FileBasedMetadataTaskPropertiesConcreteTypeEnum\n value: FileBasedFieldsValue\n }\n | {\n concreteType: RecordBasedMetadataTaskPropertiesConcreteTypeEnum\n value: RecordBasedFieldsValue\n }\n\nexport type CurateTypeFields = CurateTypeState & {\n authorizationMode: AuthorizationModeOption\n}\n\nexport type BuildCurateTaskPayloadArgs = {\n /** The task being edited, if any. Server-managed fields (taskId, etag, etc.) are carried over. */\n existingTask?: CurationTask\n projectId: string\n dataType: string\n instructions: string\n assigneePrincipalId: string | undefined\n curateTypeFields: CurateTypeFields\n}\n\n/**\n * Builds the `CurationTask` payload for creating or updating a Curate Data task from the create/edit\n * task form's field state.\n */\nexport function buildCurateTaskPayload(\n args: BuildCurateTaskPayloadArgs,\n): CurationTask {\n const {\n existingTask,\n projectId,\n dataType,\n instructions,\n assigneePrincipalId,\n curateTypeFields,\n } = args\n\n const existingTaskProperties = existingTask?.taskProperties\n const collaboratorPrincipalIds = instanceOfGridSupportedTaskProperties(\n existingTaskProperties,\n )\n ? existingTaskProperties.collaboratorPrincipalIds\n : undefined\n\n return {\n ...existingTask,\n projectId,\n dataType: dataType.trim() || undefined,\n instructions: instructions.trim() || undefined,\n assigneePrincipalId: assigneePrincipalId || undefined,\n taskProperties: buildCurateTaskProperties(\n curateTypeFields,\n collaboratorPrincipalIds,\n ),\n }\n}\n\nfunction buildCurateTaskProperties(\n fields: CurateTypeFields,\n collaboratorPrincipalIds: string[] | undefined,\n): CurationTaskProperties {\n const { authorizationMode } = fields\n const suggestedAuthorizationMode =\n authorizationMode === 'NONE' ? undefined : authorizationMode\n\n if (\n fields.concreteType ===\n RecordBasedMetadataTaskPropertiesConcreteTypeEnum.org_sagebionetworks_repo_model_curation_metadata_RecordBasedMetadataTaskProperties\n ) {\n const { concreteType, value } = fields\n return {\n concreteType,\n recordSetId: value.recordSetId.trim() || undefined,\n suggestedAuthorizationMode,\n collaboratorPrincipalIds,\n }\n }\n\n const { concreteType, value } = fields\n return {\n concreteType,\n uploadFolderId: value.uploadFolderId.trim() || undefined,\n fileViewId: value.fileViewId.trim() || undefined,\n suggestedAuthorizationMode,\n collaboratorPrincipalIds,\n }\n}\n"],"mappings":";;;AA6CA,SAAgB,EACd,GACc;CACd,IAAM,EACJ,iBACA,cACA,aACA,iBACA,wBACA,wBACE,GAEE,IAAyB,GAAc,gBACvC,IAA2B,EAC/B,CACF,IACI,EAAuB,2BACvB,KAAA;CAEJ,OAAO;EACL,GAAG;EACH;EACA,UAAU,EAAS,KAAK,KAAK,KAAA;EAC7B,cAAc,EAAa,KAAK,KAAK,KAAA;EACrC,qBAAqB,KAAuB,KAAA;EAC5C,gBAAgB,EACd,GACA,CACF;CACF;AACF;AAEA,SAAS,EACP,GACA,GACwB;CACxB,IAAM,EAAE,yBAAsB,GACxB,IACJ,MAAsB,SAAS,KAAA,IAAY;CAE7C,IACE,EAAO,iBACP,EAAkD,oFAClD;EACA,IAAM,EAAE,iBAAc,aAAU;EAChC,OAAO;GACL;GACA,aAAa,EAAM,YAAY,KAAK,KAAK,KAAA;GACzC;GACA;EACF;CACF;CAEA,IAAM,EAAE,iBAAc,aAAU;CAChC,OAAO;EACL;EACA,gBAAgB,EAAM,eAAe,KAAK,KAAK,KAAA;EAC/C,YAAY,EAAM,WAAW,KAAK,KAAK,KAAA;EACvC;EACA;CACF;AACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { FileBasedMetadataTaskPropertiesConcreteTypeEnum, RecordBasedMetadataTaskPropertiesConcreteTypeEnum, RecordSetGenerationExecutionPropertiesConcreteTypeEnum, SampleSheetGenerationExecutionPropertiesConcreteTypeEnum, TaskStatusStateEnum } from '@sage-bionetworks/synapse-client';
|
|
1
|
+
import { FileBasedMetadataTaskPropertiesConcreteTypeEnum, RecordBasedMetadataTaskPropertiesConcreteTypeEnum, RecordSetGenerationExecutionPropertiesConcreteTypeEnum, SampleSheetGenerationExecutionPropertiesConcreteTypeEnum, TaskExecutionDetails, TaskStatusStateEnum } from '@sage-bionetworks/synapse-client';
|
|
2
|
+
import { ComputeTaskConcreteType } from './types';
|
|
2
3
|
export declare const OPEN_CURATOR_ERROR_TITLE = "An error occurred while trying to open Curator";
|
|
3
4
|
export declare const OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE = "You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.";
|
|
4
5
|
export declare const OPEN_CURATOR_TOOLTIP_TITLE = "Open Curator to edit metadata";
|
|
@@ -101,6 +102,12 @@ export declare const TASK_STATUS_CONFIG: Record<TaskStatusStateEnum, {
|
|
|
101
102
|
label: string;
|
|
102
103
|
backgroundColor: string;
|
|
103
104
|
}>;
|
|
105
|
+
/**
|
|
106
|
+
* Do not allow users to manually set task state to one of these values (controlled by the system)
|
|
107
|
+
*/
|
|
108
|
+
export declare const COMPUTE_TASK_DISABLED_STATUS_STATES: ("EXECUTING" | "CANCELED")[];
|
|
109
|
+
/** Curate tasks have no automatic EXECUTING transition, but it remains a system-controlled state. */
|
|
110
|
+
export declare const CURATE_TASK_DISABLED_STATUS_STATES: "EXECUTING"[];
|
|
104
111
|
export declare const DELETE_CURATION_TASK_DIALOG_TITLE = "Delete Task";
|
|
105
112
|
export declare const DELETE_CURATION_TASK_CONFIRMATION_PROMPT = "Are you sure you want to delete this task? This action cannot be undone.";
|
|
106
113
|
export declare const DELETE_CURATION_TASK_GRID_SESSION_WARNING = "Any grid sessions associated with this task will also be deleted.";
|
|
@@ -112,4 +119,10 @@ export declare const EDIT_CURATION_TASK_DIALOG_TITLE = "Edit Curation Task";
|
|
|
112
119
|
export declare const SELECT_TASK_TYPE_DESCRIPTION = "Choose the type of data this curation task will manage. This cannot be changed after the task is created.";
|
|
113
120
|
export declare const COLLABORATORS_TOOLTIP = "Collaborators can contribute to the grid session alongside the assignee. For \"Session Owner\" authorization mode, collaborators are added as additional owners of the session.";
|
|
114
121
|
export declare const UNRECOGNIZED_TASK_TYPE_ERROR = "This task has an unrecognized task type and cannot be edited here.";
|
|
122
|
+
/**
|
|
123
|
+
* The `TaskStatus.executionDetails` value to set when creating a Compute task of each concrete type.
|
|
124
|
+
* Both concrete `TaskExecutionDetails` types require only `concreteType` -- the remaining fields
|
|
125
|
+
* (`asyncJobId`, `startedBy`, `startedOn`, `errorMessage`, `errorDetails`) are server-managed.
|
|
126
|
+
*/
|
|
127
|
+
export declare const COMPUTE_TASK_EXECUTION_DETAILS: Record<ComputeTaskConcreteType, TaskExecutionDetails>;
|
|
115
128
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+CAA+C,EAC/C,iDAAiD,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/utils/constants.ts"],"names":[],"mappings":"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"}
|