@gen-epix/ui-client-casedb 4.2.0 → 4.3.0
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/_chunks/CaseInfoDialog.js +40 -39
- package/dist/_chunks/CaseInfoDialog.js.map +1 -1
- package/dist/_chunks/Dashboard.js +285 -286
- package/dist/_chunks/Dashboard.js.map +1 -1
- package/dist/_chunks/LineListWidget.js +138 -136
- package/dist/_chunks/LineListWidget.js.map +1 -1
- package/dist/_chunks/{chunk-BV7QT456.js → chunk-OB3PAWPO.js} +3 -3
- package/dist/_chunks/chunk-OB3PAWPO.js.map +1 -0
- package/dist/_chunks/yup.js +2 -2
- package/dist/_chunks/yup.js.map +1 -1
- package/dist/components/ui/HistogramWidget/index.js +161 -162
- package/dist/components/ui/HistogramWidget/index.js.map +1 -1
- package/dist/locale/en.json +6 -0
- package/dist/locale/nl.json +7 -1
- package/dist/pages/CasesDetailPage/index.js +1 -1
- package/dist/pages/ColsAdminPage/index.js +1 -1
- package/dist/pages/ConceptsAdminPage/index.js +1 -1
- package/dist/pages/DimsAdminPage/index.js +1 -1
- package/dist/pages/EventsDetailPage/index.js +1 -1
- package/dist/pages/OrganizationAccessCasePoliciesAdminPage/index.js +120 -86
- package/dist/pages/OrganizationAccessCasePoliciesAdminPage/index.js.map +1 -1
- package/dist/pages/RefColsAdminPage/index.js +1 -1
- package/dist/pages/RegionSetShapesAdminPage/index.js +1 -1
- package/dist/pages/RegionsAdminPage/index.js +1 -1
- package/dist/pages/UserEffectiveRightsAdminPage/index.js +1 -1
- package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js +1 -1
- package/dist/routes/index.js +93 -91
- package/dist/routes/index.js.map +1 -1
- package/dist/setup/setup.js +2 -3
- package/dist/setup/setup.js.map +1 -1
- package/package.json +26 -26
- package/dist/_chunks/chunk-BV7QT456.js.map +0 -1
|
@@ -44,8 +44,9 @@ import he from "@mui/icons-material/ArrowLeft";
|
|
|
44
44
|
import { Spinner as ge } from "@gen-epix/ui-core-components/components/Spinner";
|
|
45
45
|
import { useDeleteMutation as _e } from "@gen-epix/ui-client-common/hooks/useDeleteMutation";
|
|
46
46
|
import { NavLink as ve } from "@gen-epix/ui-client-common/components/ui/NavLink";
|
|
47
|
+
import { FeatureFlagsService as ye } from "@gen-epix/ui-client-common/classes/services/FeatureFlagsService";
|
|
47
48
|
//#region src/components/ui/CaseInfoDialog/CaseCaseSetInfo.tsx
|
|
48
|
-
var
|
|
49
|
+
var be = ({ caseDbCase: e, ...t }) => {
|
|
49
50
|
let r = v(), i = y(), { t: o } = H(), s = {
|
|
50
51
|
invert: !1,
|
|
51
52
|
key: "case_id",
|
|
@@ -105,7 +106,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
105
106
|
})]
|
|
106
107
|
})]
|
|
107
108
|
});
|
|
108
|
-
},
|
|
109
|
+
}, xe = ({ caseDbCase: e, caseRights: t, formId: r, onFinish: i, onIsSavingChange: a, ...l }) => {
|
|
109
110
|
let u = R(s), d = o(u, (e) => e.completeCaseType), f = o(u, c((e) => e.mutateCachedCase)), [m, h] = V(!1), g = B(() => {
|
|
110
111
|
let e = [];
|
|
111
112
|
return t.read_col_ids.forEach((n) => {
|
|
@@ -162,7 +163,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
162
163
|
onSubmit: _
|
|
163
164
|
})] })]
|
|
164
165
|
});
|
|
165
|
-
},
|
|
166
|
+
}, Se = ({ caseDbCase: e, ...t }) => {
|
|
166
167
|
let { t: n } = H(), r = d(), i = q([r]);
|
|
167
168
|
return /* @__PURE__ */ G(A, {
|
|
168
169
|
...t,
|
|
@@ -189,7 +190,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
189
190
|
})
|
|
190
191
|
]
|
|
191
192
|
});
|
|
192
|
-
},
|
|
193
|
+
}, Ce = ({ caseDbCase: e, ...n }) => {
|
|
193
194
|
let { t: i } = H(), a = re(null), c = R(s), l = o(c, (e) => e.completeCaseType), u = B(() => t.getCols(l), [l]), d = z((e, t) => {
|
|
194
195
|
a.current.open({
|
|
195
196
|
organizationId: e,
|
|
@@ -233,7 +234,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
233
234
|
/* @__PURE__ */ W(fe, { ref: a })
|
|
234
235
|
]
|
|
235
236
|
});
|
|
236
|
-
},
|
|
237
|
+
}, we = ({ ...e }) => {
|
|
237
238
|
let { t } = H();
|
|
238
239
|
return /* @__PURE__ */ G(A, {
|
|
239
240
|
...e,
|
|
@@ -242,7 +243,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
242
243
|
children: t`Shared in`
|
|
243
244
|
}), /* @__PURE__ */ W(_, {})]
|
|
244
245
|
});
|
|
245
|
-
},
|
|
246
|
+
}, Te = /* @__PURE__ */ e(i(), 1), Ee = ({ caseDbCase: e, formId: t, onFinish: r, onIsSavingChange: i, ...a }) => {
|
|
246
247
|
let { t: o } = H(), [s, c] = V(!1), u = h(), d = B(() => x().shape({ dataCollectionIds: b().of(ee().uuid4()).required() }), []), f = B(() => [{
|
|
247
248
|
definition: O.AUTOCOMPLETE,
|
|
248
249
|
label: o`Data collections`,
|
|
@@ -262,7 +263,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
262
263
|
});
|
|
263
264
|
try {
|
|
264
265
|
await D.getInstance().cancelQueries(a);
|
|
265
|
-
let n = u?.rights?.[0], r = (0,
|
|
266
|
+
let n = u?.rights?.[0], r = (0, Te.default)(t, n.shared_in_data_collection_ids), i = (0, Te.default)(n.shared_in_data_collection_ids, t);
|
|
266
267
|
r.length > 0 && await C.getInstance().caseDataCollectionLinksPostSome(r.map((t) => ({
|
|
267
268
|
case_id: e.id,
|
|
268
269
|
data_collection_id: t
|
|
@@ -296,7 +297,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
296
297
|
schema: d
|
|
297
298
|
})]
|
|
298
299
|
});
|
|
299
|
-
},
|
|
300
|
+
}, De = /* @__PURE__ */ function(e) {
|
|
300
301
|
return e.EDIT = "EDIT", e.INFO = "INFO", e.SHARING = "SHARING", e;
|
|
301
302
|
}({}), Z = Y(({ onActionsChange: e, onClose: t, onTitleChange: r, openProps: i }) => {
|
|
302
303
|
let { t: a } = H(), l = B(() => [i.caseId], [i.caseId]), p = f(), h = d(), _ = u(), v = R(s), y = o(v, c((e) => e.fetchData)), [b, x] = V(i.initialTab ?? "INFO"), [ee, S] = V(!1), [w, T] = V(!1), [E, O] = V(!1), k = re(null), A = ne(), j = ne(), M = z(async () => {
|
|
@@ -331,23 +332,23 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
331
332
|
key: "case_id",
|
|
332
333
|
members: [Y?.id],
|
|
333
334
|
type: "UUID_SET"
|
|
334
|
-
}), [Y?.id]), { data: ve, error:
|
|
335
|
+
}), [Y?.id]), { data: ve, error: Te, isLoading: De } = oe({
|
|
335
336
|
enabled: !!Y,
|
|
336
337
|
queryFn: async ({ signal: e }) => (await C.getInstance().caseDataCollectionLinksPostQuery(fe, null, null, { signal: e })).data,
|
|
337
338
|
queryKey: D.getInstance().getGenericKey(n.CASE_DATA_COLLECTION_LINKS, fe)
|
|
338
|
-
}), Z = B(() => !!J.data && J.data.some((e) => e.is_full_access || e.write_col_ids.length), [J.data]), Q = B(() => !!J.data && J.data.some((e) => e.is_full_access || e.remove_data_collection_ids.length || e.add_data_collection_ids.length), [J.data]),
|
|
339
|
+
}), Z = B(() => !!J.data && J.data.some((e) => e.is_full_access || e.write_col_ids.length) && !ye.getInstance().featureFlags?.disable_upload, [J.data]), Q = B(() => !!J.data && J.data.some((e) => e.is_full_access || e.remove_data_collection_ids.length || e.add_data_collection_ids.length), [J.data]), Oe = z(() => !!J.data && J.data.some((e) => e.is_full_access || e.can_delete), [J]), ke = z(() => {
|
|
339
340
|
x("EDIT");
|
|
340
|
-
}, []), ke = z(() => {
|
|
341
|
-
x("SHARING");
|
|
342
341
|
}, []), Ae = z(() => {
|
|
342
|
+
x("SHARING");
|
|
343
|
+
}, []), je = z(() => {
|
|
343
344
|
x("INFO");
|
|
344
|
-
}, []), je = z((e) => {
|
|
345
|
-
S(e);
|
|
346
345
|
}, []), Me = z((e) => {
|
|
346
|
+
S(e);
|
|
347
|
+
}, []), Ne = z((e) => {
|
|
347
348
|
T(e);
|
|
348
|
-
}, []), Ne = z(() => {
|
|
349
|
-
k.current.open();
|
|
350
349
|
}, []), Pe = z(() => {
|
|
350
|
+
k.current.open();
|
|
351
|
+
}, []), Fe = z(() => {
|
|
351
352
|
I(Y);
|
|
352
353
|
}, [Y, I]), $ = ee || w;
|
|
353
354
|
te(() => {
|
|
@@ -363,7 +364,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
363
364
|
color: "primary",
|
|
364
365
|
disabled: $,
|
|
365
366
|
label: a`Go back`,
|
|
366
|
-
onClick:
|
|
367
|
+
onClick: je,
|
|
367
368
|
startIcon: /* @__PURE__ */ W(he, {}),
|
|
368
369
|
variant: "outlined"
|
|
369
370
|
}), b === "EDIT" && Z ? t.push({
|
|
@@ -387,9 +388,9 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
387
388
|
}) : b === "INFO" && (t.push({
|
|
388
389
|
...X.createAttributes("CaseSetInfoDialog-deleteButton"),
|
|
389
390
|
color: "primary",
|
|
390
|
-
disabled: !
|
|
391
|
+
disabled: !Oe(),
|
|
391
392
|
label: a`Delete`,
|
|
392
|
-
onClick:
|
|
393
|
+
onClick: Pe,
|
|
393
394
|
startIcon: /* @__PURE__ */ W(me, {}),
|
|
394
395
|
variant: "outlined"
|
|
395
396
|
}), t.push({
|
|
@@ -397,7 +398,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
397
398
|
color: "primary",
|
|
398
399
|
disabled: !Q,
|
|
399
400
|
label: a`Share`,
|
|
400
|
-
onClick:
|
|
401
|
+
onClick: Ae,
|
|
401
402
|
startIcon: /* @__PURE__ */ W(pe, {}),
|
|
402
403
|
variant: "outlined"
|
|
403
404
|
}), t.push({
|
|
@@ -405,27 +406,27 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
405
406
|
color: "primary",
|
|
406
407
|
disabled: !Z,
|
|
407
408
|
label: a`Edit`,
|
|
408
|
-
onClick:
|
|
409
|
+
onClick: ke,
|
|
409
410
|
startIcon: /* @__PURE__ */ W(ce, {}),
|
|
410
411
|
variant: "outlined"
|
|
411
412
|
})), e(t);
|
|
412
413
|
}, [
|
|
413
414
|
e,
|
|
414
|
-
|
|
415
|
+
ke,
|
|
415
416
|
a,
|
|
416
417
|
b,
|
|
418
|
+
je,
|
|
417
419
|
Ae,
|
|
418
|
-
ke,
|
|
419
420
|
A,
|
|
420
421
|
j,
|
|
421
422
|
t,
|
|
422
423
|
$,
|
|
423
424
|
Q,
|
|
424
|
-
|
|
425
|
-
|
|
425
|
+
Pe,
|
|
426
|
+
Oe,
|
|
426
427
|
Z
|
|
427
428
|
]);
|
|
428
|
-
let
|
|
429
|
+
let Ie = B(() => ({
|
|
429
430
|
createdInDataCollection: Y ? h.map.get(Y.created_in_data_collection_id) : void 0,
|
|
430
431
|
itemDataCollectionLinks: [ve],
|
|
431
432
|
rights: J.data,
|
|
@@ -444,45 +445,45 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
444
445
|
inline: !0,
|
|
445
446
|
label: a`Refreshing data`
|
|
446
447
|
}) : /* @__PURE__ */ G(U, { children: [/* @__PURE__ */ W(K, {
|
|
447
|
-
error: ue ||
|
|
448
|
+
error: ue || Te,
|
|
448
449
|
inlineSpinner: !0,
|
|
449
|
-
isLoading: de ||
|
|
450
|
+
isLoading: de || De,
|
|
450
451
|
loadables: ae,
|
|
451
452
|
shouldHideActionButtons: !0,
|
|
452
453
|
children: /* @__PURE__ */ G(g, {
|
|
453
|
-
caseAbac:
|
|
454
|
+
caseAbac: Ie,
|
|
454
455
|
children: [
|
|
455
|
-
/* @__PURE__ */ W(
|
|
456
|
+
/* @__PURE__ */ W(Se, {
|
|
456
457
|
caseDbCase: Y,
|
|
457
458
|
sx: { marginBottom: 2 }
|
|
458
459
|
}),
|
|
459
460
|
b === "INFO" && /* @__PURE__ */ G(U, { children: [
|
|
460
|
-
/* @__PURE__ */ W(
|
|
461
|
-
/* @__PURE__ */ W(
|
|
461
|
+
/* @__PURE__ */ W(we, { sx: { marginBottom: 2 } }),
|
|
462
|
+
/* @__PURE__ */ W(be, {
|
|
462
463
|
caseDbCase: Y,
|
|
463
464
|
sx: { marginBottom: 2 }
|
|
464
465
|
}),
|
|
465
|
-
/* @__PURE__ */ W(
|
|
466
|
+
/* @__PURE__ */ W(Ce, {
|
|
466
467
|
caseDbCase: Y,
|
|
467
468
|
sx: { marginBottom: 2 }
|
|
468
469
|
})
|
|
469
470
|
] }),
|
|
470
|
-
b === "EDIT" && Z && /* @__PURE__ */ W(
|
|
471
|
+
b === "EDIT" && Z && /* @__PURE__ */ W(xe, {
|
|
471
472
|
caseDbCase: Y,
|
|
472
473
|
caseRights: J.data?.[0],
|
|
473
474
|
formId: A,
|
|
474
475
|
onFinish: M,
|
|
475
|
-
onIsSavingChange:
|
|
476
|
+
onIsSavingChange: Me
|
|
476
477
|
}),
|
|
477
478
|
b === "EDIT" && !Z && /* @__PURE__ */ W(L, {
|
|
478
479
|
variant: "body1",
|
|
479
480
|
children: a`You do not have permissions to edit this case.`
|
|
480
481
|
}),
|
|
481
|
-
b === "SHARING" && Q && /* @__PURE__ */ W(
|
|
482
|
+
b === "SHARING" && Q && /* @__PURE__ */ W(Ee, {
|
|
482
483
|
caseDbCase: Y,
|
|
483
484
|
formId: j,
|
|
484
485
|
onFinish: M,
|
|
485
|
-
onIsSavingChange:
|
|
486
|
+
onIsSavingChange: Ne
|
|
486
487
|
}),
|
|
487
488
|
b === "SHARING" && !Q && /* @__PURE__ */ W(L, {
|
|
488
489
|
variant: "body1",
|
|
@@ -494,7 +495,7 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
494
495
|
body: a`Are you sure you want to delete the case?`,
|
|
495
496
|
cancelLabel: a`Cancel`,
|
|
496
497
|
confirmLabel: a`Delete`,
|
|
497
|
-
onConfirm:
|
|
498
|
+
onConfirm: Fe,
|
|
498
499
|
ref: k,
|
|
499
500
|
title: a`Delete case?`
|
|
500
501
|
})] });
|
|
@@ -504,6 +505,6 @@ var ye = ({ caseDbCase: e, ...t }) => {
|
|
|
504
505
|
testId: "CaseInfoDialog"
|
|
505
506
|
});
|
|
506
507
|
//#endregion
|
|
507
|
-
export { Z as n,
|
|
508
|
+
export { Z as n, De as t };
|
|
508
509
|
|
|
509
510
|
//# sourceMappingURL=CaseInfoDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseInfoDialog.js","names":[],"sources":["../../src/components/ui/CaseInfoDialog/CaseCaseSetInfo.tsx","../../src/components/ui/CaseInfoDialog/CaseInfoForm.tsx","../../src/components/ui/CaseInfoDialog/ReadOnlyCaseContent.tsx","../../src/components/ui/CaseInfoDialog/CaseContent.tsx","../../src/components/ui/CaseInfoDialog/CaseSharingInfo.tsx","../../src/components/ui/CaseInfoDialog/CaseSharingForm.tsx","../../src/components/ui/CaseInfoDialog/CaseInfoDialog.tsx"],"sourcesContent":["import type { BoxProps } from '@mui/material';\nimport {\n Box,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport type {\n CaseDbCase,\n CaseDbUuidSetFilter,\n} from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport { NavLink } from '@gen-epix/ui-client-common/components/ui/NavLink';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useQueryMemo } from '@gen-epix/ui-client-common/hooks/useQueryMemo';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { useCaseSetCategoryMapQuery } from '../../../dataHooks/useCaseSetCategoriesQuery';\nimport { useCaseSetStatusMapQuery } from '../../../dataHooks/useCaseSetStatusesQuery';\nimport { CaseSetUtil } from '../../../utils/CaseSetUtil';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nexport type CaseCaseSetInfoProps = {\n readonly caseDbCase: CaseDbCase;\n} & BoxProps;\n\nexport const CaseCaseSetInfo = ({ caseDbCase, ...boxProps }: CaseCaseSetInfoProps) => {\n const caseSetCategoryMapQuery = useCaseSetCategoryMapQuery();\n const caseSetStatusMapQuery = useCaseSetStatusMapQuery();\n\n const { t } = useTranslation();\n const caseSetMembersFilter: CaseDbUuidSetFilter = {\n invert: false,\n key: 'case_id',\n members: [caseDbCase.id],\n type: 'UUID_SET',\n };\n const { data: caseSetMembers, error: caseSetMembersError, isLoading: isCaseSetMembersLoading } = useQueryMemo({\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().caseSetMembersPostQuery(caseSetMembersFilter, null, null, { signal });\n return response.data;\n },\n queryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_SET_MEMBERS, caseSetMembersFilter),\n });\n\n const caseSetsFilter: CaseDbUuidSetFilter = {\n invert: false,\n key: 'id',\n members: caseSetMembers?.map((caseSetMember) => caseSetMember.case_set_id) ?? [],\n type: 'UUID_SET',\n };\n const { data: caseSets, error: caseSetsError, isLoading: isCaseSetsLoading } = useQueryMemo({\n enabled: caseSetsFilter.members.length > 0,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().caseSetsPostQuery(caseSetsFilter, null, null, { signal });\n return response.data;\n },\n queryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_SETS, caseSetsFilter),\n });\n\n const loadables = useArray([caseSetCategoryMapQuery, caseSetStatusMapQuery]);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Events`}\n </Typography>\n <ResponseHandler\n error={caseSetMembersError || caseSetsError}\n inlineSpinner\n isLoading={isCaseSetMembersLoading || isCaseSetsLoading}\n loadables={loadables}\n shouldHideActionButtons\n >\n {caseSets?.length > 0 && (\n <Table size={'small'}>\n <TableHead>\n <TableRow>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Name`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Category`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Status`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {caseSets?.map((caseSet) => (\n <TableRow key={caseSet.id}>\n <TableCell>\n <NavLink\n activeAsText\n to={CaseSetUtil.createCaseSetLink(caseSet)}\n >\n {caseSet.name}\n </NavLink>\n </TableCell>\n <TableCell>\n {caseSetCategoryMapQuery.map.get(caseSet.case_set_category_id)?.name ?? t`Unknown`}\n </TableCell>\n <TableCell>\n {caseSetStatusMapQuery.map.get(caseSet.case_set_status_id)?.name ?? t`Unknown`}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n {(!caseSets || caseSets?.length === 0) && (\n <Box sx={{ fontStyle: 'italic' }}>\n {t`None`}\n </Box>\n )}\n </ResponseHandler>\n </Box>\n );\n};\n","import {\n use,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport { useStore } from 'zustand';\nimport { t } from 'i18next';\nimport { useShallow } from 'zustand/shallow';\nimport {\n Box,\n Typography,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material';\nimport type {\n CaseDbCase,\n CaseDbCaseRights,\n} from '@gen-epix/api-casedb';\nimport {\n CaseDbCaseApi,\n CaseDbEtlStatus,\n CaseDbUploadAction,\n} from '@gen-epix/api-casedb';\nimport { NotificationService } from '@gen-epix/ui-client-common/classes/services/NotificationService';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { Spinner } from '@gen-epix/ui-core-components/components/Spinner';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\nimport { CaseContentForm } from '../CaseContentForm';\n\nexport type CaseInfoFormProps = {\n readonly caseDbCase: CaseDbCase;\n readonly caseRights: CaseDbCaseRights;\n readonly formId: string;\n readonly onFinish: () => void;\n readonly onIsSavingChange: (isSaving: boolean) => void;\n} & BoxProps;\n\nexport const CaseInfoForm = ({ caseDbCase, caseRights, formId, onFinish, onIsSavingChange, ...boxProps }: CaseInfoFormProps) => {\n const dashboardStore = use(DashboardStoreContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n\n const mutateCachedCase = useStore(dashboardStore, useShallow((state) => state.mutateCachedCase));\n const [isSaving, setIsSaving] = useState(false);\n\n const enabledColIds = useMemo(() => {\n const colIds: string[] = [];\n\n caseRights.read_col_ids.forEach(colId => {\n if (caseRights.write_col_ids.includes(colId)) {\n colIds.push(colId);\n }\n });\n return colIds;\n }, [caseRights]);\n\n const onFormSubmit = useCallback((caseId: string, content: CaseDbCase['content']) => {\n setIsSaving(true);\n onIsSavingChange(true);\n const perform = async () => {\n const queryKeys = QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASES], true);\n const notificationKey = NotificationService.getInstance().showNotification({\n isLoading: true,\n message: t('Saving case data'),\n severity: 'info',\n });\n try {\n await QueryClientService.getInstance().cancelQueries(queryKeys);\n const uploadResult = (await CaseDbCaseApi.getInstance().uploadCases({\n case_batch: {\n cases: [\n {\n case: {\n case_type_id: completeCaseType.id,\n content,\n created_in_data_collection_id: caseDbCase.created_in_data_collection_id,\n id: caseId,\n },\n },\n ],\n },\n case_type_id: completeCaseType.id,\n on_exists: CaseDbUploadAction.UPDATE,\n })).data;\n if (uploadResult.status !== CaseDbEtlStatus.SKIPPED && uploadResult.status !== CaseDbEtlStatus.SUCCESS && uploadResult.status !== CaseDbEtlStatus.UPDATED) {\n throw new Error('Case upload failed');\n }\n // await CaseDbCaseApi.getInstance().casesPutOne(item.id, item);\n mutateCachedCase(caseDbCase.id, caseDbCase);\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Successfully saved case data.'), 'success');\n } catch (_error) {\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Could not save case data.'), 'error');\n } finally {\n await QueryClientService.getInstance().invalidateQueryKeys(queryKeys);\n setIsSaving(false);\n onIsSavingChange(false);\n onFinish();\n }\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [completeCaseType.id, caseDbCase, mutateCachedCase, onFinish, onIsSavingChange]);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Content`}\n </Typography>\n <Box>\n {isSaving && (\n <Spinner\n inline\n label={t`Saving case data`}\n />\n )}\n {!isSaving && (\n <CaseContentForm\n caseContent={caseDbCase.content}\n caseId={caseDbCase.id}\n completeCaseType={completeCaseType}\n enabledColIds={enabledColIds}\n formId={formId}\n onSubmit={onFormSubmit}\n />\n )}\n </Box>\n </Box>\n );\n};\n","import type { BoxProps } from '@mui/material';\nimport {\n Box,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport { GenericErrorMessage } from '@gen-epix/ui-client-common/components/ui/GenericErrorMessage';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { useDataCollectionsMapQuery } from '../../../dataHooks/useDataCollectionsQuery';\n\nexport type ReadOnlyCaseContentProps = {\n readonly caseDbCase: CaseDbCase;\n} & BoxProps;\n\nexport const ReadOnlyCaseContent = ({ caseDbCase, ...boxProps }: ReadOnlyCaseContentProps) => {\n const { t } = useTranslation();\n const dataCollectionsMapQuery = useDataCollectionsMapQuery();\n\n const loadables = useArray([dataCollectionsMapQuery]);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Read-only content`}\n </Typography>\n {!caseDbCase && (\n <GenericErrorMessage\n error={new Error('Case could not be found')}\n />\n )}\n <ResponseHandler\n inlineSpinner\n loadables={loadables}\n shouldHideActionButtons\n >\n {caseDbCase && (\n <Table size={'small'}>\n <TableHead>\n <TableRow>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Column`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% * 2/3)',\n }}\n >\n {t`Value`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n <TableRow>\n <TableCell>\n {t`Case id`}\n </TableCell>\n <TableCell>\n {caseDbCase.id}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n )}\n </ResponseHandler>\n </Box>\n );\n};\n","import type { BoxProps } from '@mui/material';\nimport {\n Box,\n Link,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\nimport {\n use,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport { CaseDbColType } from '@gen-epix/api-casedb';\nimport type { EpiContactDetailsDialogRefMethods } from '@gen-epix/ui-client-common/components/epi/EpiContactDetailsDialog';\nimport { EpiContactDetailsDialog } from '@gen-epix/ui-client-common/components/epi/EpiContactDetailsDialog';\nimport { GenericErrorMessage } from '@gen-epix/ui-client-common/components/ui/GenericErrorMessage';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseTypeUtil } from '../../../utils/CaseTypeUtil';\nimport { CaseUtil } from '../../../utils/CaseUtil';\n\n\nexport type CaseContentProps = {\n readonly caseDbCase: CaseDbCase;\n} & BoxProps;\n\nexport const CaseContent = ({ caseDbCase, ...boxProps }: CaseContentProps) => {\n const { t } = useTranslation();\n const contactDetailsDialogRef = useRef<EpiContactDetailsDialogRefMethods>(null);\n const dashboardStore = use(DashboardStoreContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n\n const cols = useMemo(() => CaseTypeUtil.getCols(completeCaseType), [completeCaseType]);\n\n const onOrganizationLinkClick = useCallback((organizationId: string, organizationName: string) => {\n contactDetailsDialogRef.current.open({\n organizationId,\n organizationName,\n });\n }, []);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Content`}\n </Typography>\n {!caseDbCase && (\n <GenericErrorMessage\n error={new Error('Case could not be found')}\n />\n )}\n {caseDbCase && (\n <Table size={'small'}>\n <TableHead>\n <TableRow>\n <TableCell\n sx={{\n width: 'calc(100% / 3)',\n }}\n >\n {t`Column`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% / 3 * 2)',\n }}\n >\n {t`Value`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {cols.map(col => {\n const refCol = completeCaseType.ref_cols[col.ref_col_id];\n const columnValue = CaseUtil.getRowValue(caseDbCase.content, col, completeCaseType);\n return (\n <TableRow key={col.id}>\n <TableCell\n sx={{\n width: 'calc(100% / 3)',\n }}\n >\n {col.label}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% / 3 * 2)',\n }}\n >\n {refCol.col_type === CaseDbColType.ORGANIZATION && !columnValue.isMissing && (\n <Link\n color={'primary'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n onOrganizationLinkClick(caseDbCase.content[col.id], columnValue.long);\n }}\n sx={{\n cursor: 'pointer',\n }}\n >\n {columnValue.long}\n </Link>\n )}\n {refCol.col_type !== CaseDbColType.ORGANIZATION && (\n <>\n {columnValue.long}\n </>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n )}\n <EpiContactDetailsDialog ref={contactDetailsDialogRef} />\n </Box>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport {\n Box,\n Typography,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material';\n\nimport { DataCollectionAccessInfo } from '../DataCollectionAccessInfo';\n\nexport type CaseSharingInfoProps = BoxProps;\n\nexport const CaseSharingInfo = ({ ...boxProps }: CaseSharingInfoProps) => {\n const { t } = useTranslation();\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Shared in`}\n </Typography>\n <DataCollectionAccessInfo />\n </Box>\n );\n};\n","import {\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n array,\n object,\n string,\n} from 'yup';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport type { Resolver } from 'react-hook-form';\nimport { useForm } from 'react-hook-form';\nimport difference from 'lodash/difference';\nimport {\n Box,\n Typography,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport { NotificationService } from '@gen-epix/ui-client-common/classes/services/NotificationService';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { Spinner } from '@gen-epix/ui-core-components/components/Spinner';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type { FormFieldDefinition } from '@gen-epix/ui-core-form/models/form';\nimport { FORM_FIELD_DEFINITION_TYPE } from '@gen-epix/ui-core-form/models/form';\nimport { FormUtil } from '@gen-epix/ui-core-form/utils/FormUtil';\n\nimport { useCaseAbacContext } from '../../../context/caseAbac';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nexport type CaseSharingFormProps = {\n readonly caseDbCase: CaseDbCase;\n readonly formId: string;\n readonly onFinish: () => void;\n readonly onIsSavingChange: (isSaving: boolean) => void;\n} & BoxProps;\n\ntype FormFields = {\n dataCollectionIds?: string[];\n};\n\nexport const CaseSharingForm = ({ caseDbCase, formId, onFinish, onIsSavingChange, ...boxProps }: CaseSharingFormProps) => {\n const { t } = useTranslation();\n const [isSaving, setIsSaving] = useState(false);\n const caseAbacContext = useCaseAbacContext();\n\n const schema = useMemo(() => object<FormFields>().shape({\n dataCollectionIds: array().of(string().uuid4()).required(),\n }), []);\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => [\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Data collections`,\n multiple: true,\n name: 'dataCollectionIds',\n options: caseAbacContext?.itemDataCollectionOptions?.[0] ?? [],\n } as const satisfies FormFieldDefinition<FormFields>,\n ] as const, [t, caseAbacContext]);\n\n const item = useMemo<FormFields>(() => {\n return {\n dataCollectionIds: caseAbacContext?.rights?.[0]?.shared_in_data_collection_ids ?? [],\n };\n }, [caseAbacContext]);\n\n const values = useMemo<FormFields>(() => FormUtil.createFormValues(formFieldDefinitions, item), [formFieldDefinitions, item]);\n\n const formMethods = useForm<FormFields>({\n resolver: yupResolver(schema) as Resolver<FormFields>,\n values,\n });\n const { handleSubmit } = formMethods;\n\n const onFormSubmit = useCallback(({ dataCollectionIds }: FormFields) => {\n const perform = async () => {\n setIsSaving(true);\n onIsSavingChange(true);\n const queryKeys = QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASE_DATA_COLLECTION_LINKS], true);\n const notificationKey = NotificationService.getInstance().showNotification({\n isLoading: true,\n message: t('Saving case data collections'),\n severity: 'info',\n });\n try {\n await QueryClientService.getInstance().cancelQueries(queryKeys);\n const rights = caseAbacContext?.rights?.[0];\n const dataCollectionIdsToAdd = difference(dataCollectionIds, rights.shared_in_data_collection_ids);\n const dataCollectionIdsToRemove = difference(rights.shared_in_data_collection_ids, dataCollectionIds);\n\n if (dataCollectionIdsToAdd.length > 0) {\n await CaseDbCaseApi.getInstance().caseDataCollectionLinksPostSome(dataCollectionIdsToAdd.map(data_collection_id => ({\n case_id: caseDbCase.id,\n data_collection_id,\n })));\n }\n if (dataCollectionIdsToRemove.length > 0) {\n await CaseDbCaseApi.getInstance().caseDataCollectionLinksDeleteSome(caseAbacContext.itemDataCollectionLinks[0]?.filter(x => dataCollectionIdsToRemove.includes(x.data_collection_id)).map(x => x.id).join(','));\n }\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Successfully saved case data collections.'), 'success');\n } catch (_error) {\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Could not save case data collections.'), 'error');\n } finally {\n await QueryClientService.getInstance().invalidateQueryKeys(queryKeys);\n setIsSaving(false);\n onIsSavingChange(false);\n onFinish();\n }\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [caseAbacContext, caseDbCase.id, onFinish, onIsSavingChange, t]);\n\n if (isSaving) {\n return (\n <Spinner\n inline\n label={t`Saving case data collections`}\n />\n );\n }\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Data collections`}\n </Typography>\n <GenericForm<FormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n </Box>\n );\n};\n","import SaveIcon from '@mui/icons-material/Save';\nimport EditIcon from '@mui/icons-material/Edit';\nimport ShareIcon from '@mui/icons-material/Share';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport ArrowLeftIcon from '@mui/icons-material/ArrowLeft';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport type {\n CaseDbCase,\n CaseDbUuidSetFilter,\n} from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport type { ConfirmationRefMethods } from '@gen-epix/ui-core-components/components/Confirmation';\nimport type { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';\nimport type {\n WithDialogRefMethods,\n WithDialogRenderProps,\n} from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { Confirmation } from '@gen-epix/ui-core-components/components/Confirmation';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { Spinner } from '@gen-epix/ui-core-components/components/Spinner';\nimport { useDeleteMutation } from '@gen-epix/ui-client-common/hooks/useDeleteMutation';\nimport { useItemQuery } from '@gen-epix/ui-client-common/hooks/useItemQuery';\nimport { useQueryMemo } from '@gen-epix/ui-client-common/hooks/useQueryMemo';\nimport { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { Typography } from '@mui/material';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport type { CaseAbacContext } from '../../../context/caseAbac';\nimport { CaseAbacContextProvider } from '../../../context/caseAbac';\nimport { useCaseRightsQuery } from '../../../dataHooks/useCaseRightsQuery';\nimport {\n useDataCollectionOptionsQuery,\n useDataCollectionsMapQuery,\n useDataCollectionsQuery,\n} from '../../../dataHooks/useDataCollectionsQuery';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nimport { CaseCaseSetInfo } from './CaseCaseSetInfo';\nimport { CaseInfoForm } from './CaseInfoForm';\nimport { ReadOnlyCaseContent } from './ReadOnlyCaseContent';\nimport { CaseContent } from './CaseContent';\nimport { CaseSharingInfo } from './CaseSharingInfo';\nimport { CaseSharingForm } from './CaseSharingForm';\n\n\nexport enum CASE_INFO_DIALOG_TAB_NAME {\n EDIT = 'EDIT',\n INFO = 'INFO',\n SHARING = 'SHARING',\n}\n\nexport interface CaseInfoDialogOpenProps {\n caseId: string;\n caseTypeId: string;\n initialTab?: CASE_INFO_DIALOG_TAB_NAME;\n}\n\nexport interface CaseInfoDialogProps extends WithDialogRenderProps<CaseInfoDialogOpenProps> {\n //\n}\n\nexport type CaseInfoDialogRefMethods = WithDialogRefMethods<CaseInfoDialogProps, CaseInfoDialogOpenProps>;\n\nexport const CaseInfoDialog = withDialog<CaseInfoDialogProps, CaseInfoDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onTitleChange,\n openProps,\n }: CaseInfoDialogProps,\n): ReactElement => {\n const { t } = useTranslation();\n const caseIds = useMemo(() => [openProps.caseId], [openProps.caseId]);\n const dataCollectionsQuery = useDataCollectionsQuery();\n const dataCollectionsMapQuery = useDataCollectionsMapQuery();\n const dataCollectionOptionsQuery = useDataCollectionOptionsQuery();\n\n const dashboardStore = use(DashboardStoreContext);\n const fetchData = useStore(dashboardStore, useShallow((state) => state.fetchData));\n const [currentTab, setCurrentTab] = useState<CASE_INFO_DIALOG_TAB_NAME>(openProps.initialTab ?? CASE_INFO_DIALOG_TAB_NAME.INFO);\n const [isEpiCaseFormSaving, setIsEpiCaseFormSaving] = useState(false);\n const [isEpiCaseDataCollectionFormSaving, setIsEpiCaseDataCollectionFormSaving] = useState(false);\n const [isRefreshingData, setIsRefreshingData] = useState(false);\n const deleteConfirmationRef = useRef<ConfirmationRefMethods>(null);\n const valuesFormId = useId();\n const dataCollectionsFormId = useId();\n\n const onFinish = useCallback(async () => {\n setIsEpiCaseFormSaving(false);\n setIsEpiCaseDataCollectionFormSaving(false);\n setIsRefreshingData(true);\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.INFO);\n await fetchData();\n setIsRefreshingData(false);\n }, [fetchData]);\n\n const onDeleteSuccess = useCallback(async () => {\n await onFinish();\n onClose();\n }, [onClose, onFinish]);\n\n const onDeleteError = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const { isMutating: isDeleteMutating, mutate: deleteMutate } = useDeleteMutation<CaseDbCase>({\n associationQueryKeys: QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASES], true),\n getErrorNotificationMessage: (data) => t('Unable to remove case: {{id}}.', { id: data.id }),\n getProgressNotificationMessage: (data) => t('Deleting case: {{id}}...', { id: data.id }),\n getSuccessNotificationMessage: (data) => t('Case: {{id}}, has been removed.', { id: data.id }),\n onError: onDeleteError,\n onSuccess: onDeleteSuccess,\n queryFn: async (item: CaseDbCase) => {\n return await CaseDbCaseApi.getInstance().casesDeleteOne(item.id);\n },\n resourceQueryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASES),\n });\n\n const caseRightsQuery = useCaseRightsQuery(caseIds, openProps.caseTypeId, !isDeleteMutating && !isRefreshingData);\n const loadables = useArray([caseRightsQuery, dataCollectionsQuery, dataCollectionsMapQuery, dataCollectionOptionsQuery]);\n\n const { data: caseDbCase, error: caseError, isLoading: caseIsLoading } = useItemQuery<CaseDbCase>({\n baseQueryKey: CASEDB_QUERY_KEY.CASES_LAZY,\n itemId: openProps.caseId,\n useQueryOptions: {\n enabled: !isDeleteMutating && !isRefreshingData,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().casesGetOne(openProps.caseId, { signal });\n return response.data;\n },\n },\n });\n\n const caseDataCollectionLinksFilter = useMemo<CaseDbUuidSetFilter>(() => ({\n invert: false,\n key: 'case_id',\n members: [caseDbCase?.id],\n type: 'UUID_SET',\n }), [caseDbCase?.id]);\n const { data: caseDataCollectionLinks, error: caseDataCollectionLinksError, isLoading: isCaseDataCollectionLinksLoading } = useQueryMemo({\n enabled: !!caseDbCase,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().caseDataCollectionLinksPostQuery(caseDataCollectionLinksFilter, null, null, { signal });\n return response.data;\n },\n queryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_DATA_COLLECTION_LINKS, caseDataCollectionLinksFilter),\n });\n\n\n const canEdit = useMemo(() => {\n return !!caseRightsQuery.data && caseRightsQuery.data.some((right) => right.is_full_access || right.write_col_ids.length);\n }, [caseRightsQuery.data]);\n\n const canShare = useMemo(() => {\n return !!caseRightsQuery.data && caseRightsQuery.data.some((right) => right.is_full_access || right.remove_data_collection_ids.length || right.add_data_collection_ids.length);\n }, [caseRightsQuery.data]);\n\n const canDelete = useCallback(() => {\n return !!caseRightsQuery.data && caseRightsQuery.data.some((right) => right.is_full_access || right.can_delete);\n }, [caseRightsQuery]);\n\n const onEditButtonClick = useCallback(() => {\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.EDIT);\n }, []);\n\n const onShareButtonClick = useCallback(() => {\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.SHARING);\n }, []);\n\n const onGoBackButtonClick = useCallback(() => {\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.INFO);\n }, []);\n\n\n const onEpiCaseFormIsSavingChange = useCallback((isSaving: boolean) => {\n setIsEpiCaseFormSaving(isSaving);\n }, []);\n\n const onEpiCaseDataCollectionFormIsSavingChange = useCallback((isSaving: boolean) => {\n setIsEpiCaseDataCollectionFormSaving(isSaving);\n }, []);\n\n const onDeleteEventButtonClick = useCallback(() => {\n deleteConfirmationRef.current.open();\n }, []);\n\n const onDeleteConfirmationConfirm = useCallback(() => {\n deleteMutate(caseDbCase);\n }, [caseDbCase, deleteMutate]);\n\n const isSaving = isEpiCaseFormSaving || isEpiCaseDataCollectionFormSaving;\n\n useEffect(() => {\n if (currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT) {\n onTitleChange(t`Case information - Edit`);\n } else if (currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING) {\n onTitleChange(t`Case information - Share`);\n } else {\n onTitleChange(t`Case information`);\n }\n }, [currentTab, onTitleChange, t]);\n\n useEffect(() => {\n const actions: DialogAction[] = [];\n\n if (currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT || currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING) {\n actions.push({\n ...TestIdUtil.createAttributes('CaseInfoDialog-goBackButton'),\n color: 'primary',\n disabled: isSaving,\n label: t`Go back`,\n onClick: onGoBackButtonClick,\n startIcon: <ArrowLeftIcon />,\n variant: 'outlined',\n });\n }\n\n if (currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT && canEdit) {\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-saveButton'),\n color: 'secondary',\n disabled: isSaving,\n form: valuesFormId,\n label: t`Save`,\n startIcon: <SaveIcon />,\n type: 'submit',\n variant: 'contained',\n },\n );\n } else if (currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING && canShare) {\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-saveButton'),\n color: 'secondary',\n disabled: isSaving,\n form: dataCollectionsFormId,\n label: t`Save`,\n startIcon: <SaveIcon />,\n type: 'submit',\n variant: 'contained',\n },\n );\n } else if (currentTab === CASE_INFO_DIALOG_TAB_NAME.INFO) {\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseSetInfoDialog-deleteButton'),\n color: 'primary',\n disabled: !canDelete(),\n label: t`Delete`,\n onClick: onDeleteEventButtonClick,\n startIcon: <DeleteIcon />,\n variant: 'outlined',\n },\n );\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-editDataCollectionsButton'),\n color: 'primary',\n disabled: !canShare,\n label: t`Share`,\n onClick: onShareButtonClick,\n startIcon: <ShareIcon />,\n variant: 'outlined',\n },\n );\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-editCaseContentButton'),\n color: 'primary',\n disabled: !canEdit,\n label: t`Edit`,\n onClick: onEditButtonClick,\n startIcon: <EditIcon />,\n variant: 'outlined',\n },\n );\n }\n onActionsChange(actions);\n }, [onActionsChange, onEditButtonClick, t, currentTab, onGoBackButtonClick, onShareButtonClick, valuesFormId, dataCollectionsFormId, onClose, isSaving, canShare, onDeleteEventButtonClick, canDelete, canEdit]);\n\n const caseAbacContextValue = useMemo<CaseAbacContext>(() => {\n return {\n createdInDataCollection: caseDbCase ? dataCollectionsMapQuery.map.get(caseDbCase.created_in_data_collection_id) : undefined,\n itemDataCollectionLinks: [caseDataCollectionLinks],\n rights: caseRightsQuery.data,\n userDataCollectionOptions: dataCollectionOptionsQuery.options,\n userDataCollections: dataCollectionsQuery.data,\n userDataCollectionsMap: dataCollectionsMapQuery.map,\n };\n }, [dataCollectionsQuery.data, dataCollectionsMapQuery.map, dataCollectionOptionsQuery.options, caseDataCollectionLinks, caseRightsQuery.data, caseDbCase]);\n\n if (isRefreshingData) {\n return (\n <Spinner\n inline\n label={t`Refreshing data`}\n />\n );\n }\n\n return (\n <>\n <ResponseHandler\n error={caseError || caseDataCollectionLinksError}\n inlineSpinner\n isLoading={caseIsLoading || isCaseDataCollectionLinksLoading}\n loadables={loadables}\n shouldHideActionButtons\n >\n <CaseAbacContextProvider caseAbac={caseAbacContextValue}>\n <ReadOnlyCaseContent\n caseDbCase={caseDbCase}\n sx={{\n marginBottom: 2,\n }}\n />\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.INFO && (\n <>\n <CaseSharingInfo\n sx={{\n marginBottom: 2,\n }}\n />\n <CaseCaseSetInfo\n caseDbCase={caseDbCase}\n sx={{\n marginBottom: 2,\n }}\n />\n <CaseContent\n caseDbCase={caseDbCase}\n sx={{\n marginBottom: 2,\n }}\n />\n </>\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT && canEdit && (\n <CaseInfoForm\n caseDbCase={caseDbCase}\n caseRights={caseRightsQuery.data?.[0]}\n formId={valuesFormId}\n onFinish={onFinish}\n onIsSavingChange={onEpiCaseFormIsSavingChange}\n />\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT && !canEdit && (\n <Typography variant={'body1'}>\n {t`You do not have permissions to edit this case.`}\n </Typography>\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING && canShare && (\n <CaseSharingForm\n caseDbCase={caseDbCase}\n formId={dataCollectionsFormId}\n onFinish={onFinish}\n onIsSavingChange={onEpiCaseDataCollectionFormIsSavingChange}\n />\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING && !canShare && (\n <Typography variant={'body1'}>\n {t`You do not have permissions to share this case.`}\n </Typography>\n )}\n </CaseAbacContextProvider>\n </ResponseHandler>\n <Confirmation\n body={t`Are you sure you want to delete the case?`}\n cancelLabel={t`Cancel`}\n confirmLabel={t`Delete`}\n onConfirm={onDeleteConfirmationConfirm}\n ref={deleteConfirmationRef}\n title={t`Delete case?`}\n />\n </>\n );\n}, {\n fullWidth: true,\n maxWidth: 'lg',\n testId: 'CaseInfoDialog',\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CaseInfoDialog.js","names":[],"sources":["../../src/components/ui/CaseInfoDialog/CaseCaseSetInfo.tsx","../../src/components/ui/CaseInfoDialog/CaseInfoForm.tsx","../../src/components/ui/CaseInfoDialog/ReadOnlyCaseContent.tsx","../../src/components/ui/CaseInfoDialog/CaseContent.tsx","../../src/components/ui/CaseInfoDialog/CaseSharingInfo.tsx","../../src/components/ui/CaseInfoDialog/CaseSharingForm.tsx","../../src/components/ui/CaseInfoDialog/CaseInfoDialog.tsx"],"sourcesContent":["import type { BoxProps } from '@mui/material';\nimport {\n Box,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport type {\n CaseDbCase,\n CaseDbUuidSetFilter,\n} from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport { NavLink } from '@gen-epix/ui-client-common/components/ui/NavLink';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useQueryMemo } from '@gen-epix/ui-client-common/hooks/useQueryMemo';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { useCaseSetCategoryMapQuery } from '../../../dataHooks/useCaseSetCategoriesQuery';\nimport { useCaseSetStatusMapQuery } from '../../../dataHooks/useCaseSetStatusesQuery';\nimport { CaseSetUtil } from '../../../utils/CaseSetUtil';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nexport type CaseCaseSetInfoProps = {\n readonly caseDbCase: CaseDbCase;\n} & BoxProps;\n\nexport const CaseCaseSetInfo = ({ caseDbCase, ...boxProps }: CaseCaseSetInfoProps) => {\n const caseSetCategoryMapQuery = useCaseSetCategoryMapQuery();\n const caseSetStatusMapQuery = useCaseSetStatusMapQuery();\n\n const { t } = useTranslation();\n const caseSetMembersFilter: CaseDbUuidSetFilter = {\n invert: false,\n key: 'case_id',\n members: [caseDbCase.id],\n type: 'UUID_SET',\n };\n const { data: caseSetMembers, error: caseSetMembersError, isLoading: isCaseSetMembersLoading } = useQueryMemo({\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().caseSetMembersPostQuery(caseSetMembersFilter, null, null, { signal });\n return response.data;\n },\n queryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_SET_MEMBERS, caseSetMembersFilter),\n });\n\n const caseSetsFilter: CaseDbUuidSetFilter = {\n invert: false,\n key: 'id',\n members: caseSetMembers?.map((caseSetMember) => caseSetMember.case_set_id) ?? [],\n type: 'UUID_SET',\n };\n const { data: caseSets, error: caseSetsError, isLoading: isCaseSetsLoading } = useQueryMemo({\n enabled: caseSetsFilter.members.length > 0,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().caseSetsPostQuery(caseSetsFilter, null, null, { signal });\n return response.data;\n },\n queryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_SETS, caseSetsFilter),\n });\n\n const loadables = useArray([caseSetCategoryMapQuery, caseSetStatusMapQuery]);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Events`}\n </Typography>\n <ResponseHandler\n error={caseSetMembersError || caseSetsError}\n inlineSpinner\n isLoading={isCaseSetMembersLoading || isCaseSetsLoading}\n loadables={loadables}\n shouldHideActionButtons\n >\n {caseSets?.length > 0 && (\n <Table size={'small'}>\n <TableHead>\n <TableRow>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Name`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Category`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Status`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {caseSets?.map((caseSet) => (\n <TableRow key={caseSet.id}>\n <TableCell>\n <NavLink\n activeAsText\n to={CaseSetUtil.createCaseSetLink(caseSet)}\n >\n {caseSet.name}\n </NavLink>\n </TableCell>\n <TableCell>\n {caseSetCategoryMapQuery.map.get(caseSet.case_set_category_id)?.name ?? t`Unknown`}\n </TableCell>\n <TableCell>\n {caseSetStatusMapQuery.map.get(caseSet.case_set_status_id)?.name ?? t`Unknown`}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n {(!caseSets || caseSets?.length === 0) && (\n <Box sx={{ fontStyle: 'italic' }}>\n {t`None`}\n </Box>\n )}\n </ResponseHandler>\n </Box>\n );\n};\n","import {\n use,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport { useStore } from 'zustand';\nimport { t } from 'i18next';\nimport { useShallow } from 'zustand/shallow';\nimport {\n Box,\n Typography,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material';\nimport type {\n CaseDbCase,\n CaseDbCaseRights,\n} from '@gen-epix/api-casedb';\nimport {\n CaseDbCaseApi,\n CaseDbEtlStatus,\n CaseDbUploadAction,\n} from '@gen-epix/api-casedb';\nimport { NotificationService } from '@gen-epix/ui-client-common/classes/services/NotificationService';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { Spinner } from '@gen-epix/ui-core-components/components/Spinner';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\nimport { CaseContentForm } from '../CaseContentForm';\n\nexport type CaseInfoFormProps = {\n readonly caseDbCase: CaseDbCase;\n readonly caseRights: CaseDbCaseRights;\n readonly formId: string;\n readonly onFinish: () => void;\n readonly onIsSavingChange: (isSaving: boolean) => void;\n} & BoxProps;\n\nexport const CaseInfoForm = ({ caseDbCase, caseRights, formId, onFinish, onIsSavingChange, ...boxProps }: CaseInfoFormProps) => {\n const dashboardStore = use(DashboardStoreContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n\n const mutateCachedCase = useStore(dashboardStore, useShallow((state) => state.mutateCachedCase));\n const [isSaving, setIsSaving] = useState(false);\n\n const enabledColIds = useMemo(() => {\n const colIds: string[] = [];\n\n caseRights.read_col_ids.forEach(colId => {\n if (caseRights.write_col_ids.includes(colId)) {\n colIds.push(colId);\n }\n });\n return colIds;\n }, [caseRights]);\n\n const onFormSubmit = useCallback((caseId: string, content: CaseDbCase['content']) => {\n setIsSaving(true);\n onIsSavingChange(true);\n const perform = async () => {\n const queryKeys = QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASES], true);\n const notificationKey = NotificationService.getInstance().showNotification({\n isLoading: true,\n message: t('Saving case data'),\n severity: 'info',\n });\n try {\n await QueryClientService.getInstance().cancelQueries(queryKeys);\n const uploadResult = (await CaseDbCaseApi.getInstance().uploadCases({\n case_batch: {\n cases: [\n {\n case: {\n case_type_id: completeCaseType.id,\n content,\n created_in_data_collection_id: caseDbCase.created_in_data_collection_id,\n id: caseId,\n },\n },\n ],\n },\n case_type_id: completeCaseType.id,\n on_exists: CaseDbUploadAction.UPDATE,\n })).data;\n if (uploadResult.status !== CaseDbEtlStatus.SKIPPED && uploadResult.status !== CaseDbEtlStatus.SUCCESS && uploadResult.status !== CaseDbEtlStatus.UPDATED) {\n throw new Error('Case upload failed');\n }\n // await CaseDbCaseApi.getInstance().casesPutOne(item.id, item);\n mutateCachedCase(caseDbCase.id, caseDbCase);\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Successfully saved case data.'), 'success');\n } catch (_error) {\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Could not save case data.'), 'error');\n } finally {\n await QueryClientService.getInstance().invalidateQueryKeys(queryKeys);\n setIsSaving(false);\n onIsSavingChange(false);\n onFinish();\n }\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [completeCaseType.id, caseDbCase, mutateCachedCase, onFinish, onIsSavingChange]);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Content`}\n </Typography>\n <Box>\n {isSaving && (\n <Spinner\n inline\n label={t`Saving case data`}\n />\n )}\n {!isSaving && (\n <CaseContentForm\n caseContent={caseDbCase.content}\n caseId={caseDbCase.id}\n completeCaseType={completeCaseType}\n enabledColIds={enabledColIds}\n formId={formId}\n onSubmit={onFormSubmit}\n />\n )}\n </Box>\n </Box>\n );\n};\n","import type { BoxProps } from '@mui/material';\nimport {\n Box,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport { GenericErrorMessage } from '@gen-epix/ui-client-common/components/ui/GenericErrorMessage';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { useDataCollectionsMapQuery } from '../../../dataHooks/useDataCollectionsQuery';\n\nexport type ReadOnlyCaseContentProps = {\n readonly caseDbCase: CaseDbCase;\n} & BoxProps;\n\nexport const ReadOnlyCaseContent = ({ caseDbCase, ...boxProps }: ReadOnlyCaseContentProps) => {\n const { t } = useTranslation();\n const dataCollectionsMapQuery = useDataCollectionsMapQuery();\n\n const loadables = useArray([dataCollectionsMapQuery]);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Read-only content`}\n </Typography>\n {!caseDbCase && (\n <GenericErrorMessage\n error={new Error('Case could not be found')}\n />\n )}\n <ResponseHandler\n inlineSpinner\n loadables={loadables}\n shouldHideActionButtons\n >\n {caseDbCase && (\n <Table size={'small'}>\n <TableHead>\n <TableRow>\n <TableCell\n sx={{\n width: 'calc(100% * 1/3)',\n }}\n >\n {t`Column`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% * 2/3)',\n }}\n >\n {t`Value`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n <TableRow>\n <TableCell>\n {t`Case id`}\n </TableCell>\n <TableCell>\n {caseDbCase.id}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n )}\n </ResponseHandler>\n </Box>\n );\n};\n","import type { BoxProps } from '@mui/material';\nimport {\n Box,\n Link,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\nimport {\n use,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport { CaseDbColType } from '@gen-epix/api-casedb';\nimport type { EpiContactDetailsDialogRefMethods } from '@gen-epix/ui-client-common/components/epi/EpiContactDetailsDialog';\nimport { EpiContactDetailsDialog } from '@gen-epix/ui-client-common/components/epi/EpiContactDetailsDialog';\nimport { GenericErrorMessage } from '@gen-epix/ui-client-common/components/ui/GenericErrorMessage';\n\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CaseTypeUtil } from '../../../utils/CaseTypeUtil';\nimport { CaseUtil } from '../../../utils/CaseUtil';\n\n\nexport type CaseContentProps = {\n readonly caseDbCase: CaseDbCase;\n} & BoxProps;\n\nexport const CaseContent = ({ caseDbCase, ...boxProps }: CaseContentProps) => {\n const { t } = useTranslation();\n const contactDetailsDialogRef = useRef<EpiContactDetailsDialogRefMethods>(null);\n const dashboardStore = use(DashboardStoreContext);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n\n const cols = useMemo(() => CaseTypeUtil.getCols(completeCaseType), [completeCaseType]);\n\n const onOrganizationLinkClick = useCallback((organizationId: string, organizationName: string) => {\n contactDetailsDialogRef.current.open({\n organizationId,\n organizationName,\n });\n }, []);\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Content`}\n </Typography>\n {!caseDbCase && (\n <GenericErrorMessage\n error={new Error('Case could not be found')}\n />\n )}\n {caseDbCase && (\n <Table size={'small'}>\n <TableHead>\n <TableRow>\n <TableCell\n sx={{\n width: 'calc(100% / 3)',\n }}\n >\n {t`Column`}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% / 3 * 2)',\n }}\n >\n {t`Value`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {cols.map(col => {\n const refCol = completeCaseType.ref_cols[col.ref_col_id];\n const columnValue = CaseUtil.getRowValue(caseDbCase.content, col, completeCaseType);\n return (\n <TableRow key={col.id}>\n <TableCell\n sx={{\n width: 'calc(100% / 3)',\n }}\n >\n {col.label}\n </TableCell>\n <TableCell\n sx={{\n width: 'calc(100% / 3 * 2)',\n }}\n >\n {refCol.col_type === CaseDbColType.ORGANIZATION && !columnValue.isMissing && (\n <Link\n color={'primary'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n onOrganizationLinkClick(caseDbCase.content[col.id], columnValue.long);\n }}\n sx={{\n cursor: 'pointer',\n }}\n >\n {columnValue.long}\n </Link>\n )}\n {refCol.col_type !== CaseDbColType.ORGANIZATION && (\n <>\n {columnValue.long}\n </>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n )}\n <EpiContactDetailsDialog ref={contactDetailsDialogRef} />\n </Box>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport {\n Box,\n Typography,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material';\n\nimport { DataCollectionAccessInfo } from '../DataCollectionAccessInfo';\n\nexport type CaseSharingInfoProps = BoxProps;\n\nexport const CaseSharingInfo = ({ ...boxProps }: CaseSharingInfoProps) => {\n const { t } = useTranslation();\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Shared in`}\n </Typography>\n <DataCollectionAccessInfo />\n </Box>\n );\n};\n","import {\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n array,\n object,\n string,\n} from 'yup';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport type { Resolver } from 'react-hook-form';\nimport { useForm } from 'react-hook-form';\nimport difference from 'lodash/difference';\nimport {\n Box,\n Typography,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material';\nimport type { CaseDbCase } from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport { NotificationService } from '@gen-epix/ui-client-common/classes/services/NotificationService';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { Spinner } from '@gen-epix/ui-core-components/components/Spinner';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type { FormFieldDefinition } from '@gen-epix/ui-core-form/models/form';\nimport { FORM_FIELD_DEFINITION_TYPE } from '@gen-epix/ui-core-form/models/form';\nimport { FormUtil } from '@gen-epix/ui-core-form/utils/FormUtil';\n\nimport { useCaseAbacContext } from '../../../context/caseAbac';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nexport type CaseSharingFormProps = {\n readonly caseDbCase: CaseDbCase;\n readonly formId: string;\n readonly onFinish: () => void;\n readonly onIsSavingChange: (isSaving: boolean) => void;\n} & BoxProps;\n\ntype FormFields = {\n dataCollectionIds?: string[];\n};\n\nexport const CaseSharingForm = ({ caseDbCase, formId, onFinish, onIsSavingChange, ...boxProps }: CaseSharingFormProps) => {\n const { t } = useTranslation();\n const [isSaving, setIsSaving] = useState(false);\n const caseAbacContext = useCaseAbacContext();\n\n const schema = useMemo(() => object<FormFields>().shape({\n dataCollectionIds: array().of(string().uuid4()).required(),\n }), []);\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => [\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n label: t`Data collections`,\n multiple: true,\n name: 'dataCollectionIds',\n options: caseAbacContext?.itemDataCollectionOptions?.[0] ?? [],\n } as const satisfies FormFieldDefinition<FormFields>,\n ] as const, [t, caseAbacContext]);\n\n const item = useMemo<FormFields>(() => {\n return {\n dataCollectionIds: caseAbacContext?.rights?.[0]?.shared_in_data_collection_ids ?? [],\n };\n }, [caseAbacContext]);\n\n const values = useMemo<FormFields>(() => FormUtil.createFormValues(formFieldDefinitions, item), [formFieldDefinitions, item]);\n\n const formMethods = useForm<FormFields>({\n resolver: yupResolver(schema) as Resolver<FormFields>,\n values,\n });\n const { handleSubmit } = formMethods;\n\n const onFormSubmit = useCallback(({ dataCollectionIds }: FormFields) => {\n const perform = async () => {\n setIsSaving(true);\n onIsSavingChange(true);\n const queryKeys = QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASE_DATA_COLLECTION_LINKS], true);\n const notificationKey = NotificationService.getInstance().showNotification({\n isLoading: true,\n message: t('Saving case data collections'),\n severity: 'info',\n });\n try {\n await QueryClientService.getInstance().cancelQueries(queryKeys);\n const rights = caseAbacContext?.rights?.[0];\n const dataCollectionIdsToAdd = difference(dataCollectionIds, rights.shared_in_data_collection_ids);\n const dataCollectionIdsToRemove = difference(rights.shared_in_data_collection_ids, dataCollectionIds);\n\n if (dataCollectionIdsToAdd.length > 0) {\n await CaseDbCaseApi.getInstance().caseDataCollectionLinksPostSome(dataCollectionIdsToAdd.map(data_collection_id => ({\n case_id: caseDbCase.id,\n data_collection_id,\n })));\n }\n if (dataCollectionIdsToRemove.length > 0) {\n await CaseDbCaseApi.getInstance().caseDataCollectionLinksDeleteSome(caseAbacContext.itemDataCollectionLinks[0]?.filter(x => dataCollectionIdsToRemove.includes(x.data_collection_id)).map(x => x.id).join(','));\n }\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Successfully saved case data collections.'), 'success');\n } catch (_error) {\n NotificationService.getInstance().fulfillNotification(notificationKey, t('Could not save case data collections.'), 'error');\n } finally {\n await QueryClientService.getInstance().invalidateQueryKeys(queryKeys);\n setIsSaving(false);\n onIsSavingChange(false);\n onFinish();\n }\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [caseAbacContext, caseDbCase.id, onFinish, onIsSavingChange, t]);\n\n if (isSaving) {\n return (\n <Spinner\n inline\n label={t`Saving case data collections`}\n />\n );\n }\n\n return (\n <Box {...boxProps}>\n <Typography variant={'h6'}>\n {t`Data collections`}\n </Typography>\n <GenericForm<FormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n </Box>\n );\n};\n","import SaveIcon from '@mui/icons-material/Save';\nimport EditIcon from '@mui/icons-material/Edit';\nimport ShareIcon from '@mui/icons-material/Share';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport ArrowLeftIcon from '@mui/icons-material/ArrowLeft';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\nimport type {\n CaseDbCase,\n CaseDbUuidSetFilter,\n} from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport type { ConfirmationRefMethods } from '@gen-epix/ui-core-components/components/Confirmation';\nimport type { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';\nimport type {\n WithDialogRefMethods,\n WithDialogRenderProps,\n} from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { Confirmation } from '@gen-epix/ui-core-components/components/Confirmation';\nimport { FeatureFlagsService } from '@gen-epix/ui-client-common/classes/services/FeatureFlagsService';\nimport { QueryClientService } from '@gen-epix/ui-client-common/classes/services/QueryClientService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { Spinner } from '@gen-epix/ui-core-components/components/Spinner';\nimport { useDeleteMutation } from '@gen-epix/ui-client-common/hooks/useDeleteMutation';\nimport { useItemQuery } from '@gen-epix/ui-client-common/hooks/useItemQuery';\nimport { useQueryMemo } from '@gen-epix/ui-client-common/hooks/useQueryMemo';\nimport { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { Typography } from '@mui/material';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport type { CaseAbacContext } from '../../../context/caseAbac';\nimport { CaseAbacContextProvider } from '../../../context/caseAbac';\nimport { useCaseRightsQuery } from '../../../dataHooks/useCaseRightsQuery';\nimport {\n useDataCollectionOptionsQuery,\n useDataCollectionsMapQuery,\n useDataCollectionsQuery,\n} from '../../../dataHooks/useDataCollectionsQuery';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nimport { CaseCaseSetInfo } from './CaseCaseSetInfo';\nimport { CaseInfoForm } from './CaseInfoForm';\nimport { ReadOnlyCaseContent } from './ReadOnlyCaseContent';\nimport { CaseContent } from './CaseContent';\nimport { CaseSharingInfo } from './CaseSharingInfo';\nimport { CaseSharingForm } from './CaseSharingForm';\n\n\nexport enum CASE_INFO_DIALOG_TAB_NAME {\n EDIT = 'EDIT',\n INFO = 'INFO',\n SHARING = 'SHARING',\n}\n\nexport interface CaseInfoDialogOpenProps {\n caseId: string;\n caseTypeId: string;\n initialTab?: CASE_INFO_DIALOG_TAB_NAME;\n}\n\nexport interface CaseInfoDialogProps extends WithDialogRenderProps<CaseInfoDialogOpenProps> {\n //\n}\n\nexport type CaseInfoDialogRefMethods = WithDialogRefMethods<CaseInfoDialogProps, CaseInfoDialogOpenProps>;\n\nexport const CaseInfoDialog = withDialog<CaseInfoDialogProps, CaseInfoDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onTitleChange,\n openProps,\n }: CaseInfoDialogProps,\n): ReactElement => {\n const { t } = useTranslation();\n const caseIds = useMemo(() => [openProps.caseId], [openProps.caseId]);\n const dataCollectionsQuery = useDataCollectionsQuery();\n const dataCollectionsMapQuery = useDataCollectionsMapQuery();\n const dataCollectionOptionsQuery = useDataCollectionOptionsQuery();\n\n const dashboardStore = use(DashboardStoreContext);\n const fetchData = useStore(dashboardStore, useShallow((state) => state.fetchData));\n const [currentTab, setCurrentTab] = useState<CASE_INFO_DIALOG_TAB_NAME>(openProps.initialTab ?? CASE_INFO_DIALOG_TAB_NAME.INFO);\n const [isEpiCaseFormSaving, setIsEpiCaseFormSaving] = useState(false);\n const [isEpiCaseDataCollectionFormSaving, setIsEpiCaseDataCollectionFormSaving] = useState(false);\n const [isRefreshingData, setIsRefreshingData] = useState(false);\n const deleteConfirmationRef = useRef<ConfirmationRefMethods>(null);\n const valuesFormId = useId();\n const dataCollectionsFormId = useId();\n\n const onFinish = useCallback(async () => {\n setIsEpiCaseFormSaving(false);\n setIsEpiCaseDataCollectionFormSaving(false);\n setIsRefreshingData(true);\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.INFO);\n await fetchData();\n setIsRefreshingData(false);\n }, [fetchData]);\n\n const onDeleteSuccess = useCallback(async () => {\n await onFinish();\n onClose();\n }, [onClose, onFinish]);\n\n const onDeleteError = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const { isMutating: isDeleteMutating, mutate: deleteMutate } = useDeleteMutation<CaseDbCase>({\n associationQueryKeys: QueryClientService.getInstance().getQueryKeyDependencies([CASEDB_QUERY_KEY.CASES], true),\n getErrorNotificationMessage: (data) => t('Unable to remove case: {{id}}.', { id: data.id }),\n getProgressNotificationMessage: (data) => t('Deleting case: {{id}}...', { id: data.id }),\n getSuccessNotificationMessage: (data) => t('Case: {{id}}, has been removed.', { id: data.id }),\n onError: onDeleteError,\n onSuccess: onDeleteSuccess,\n queryFn: async (item: CaseDbCase) => {\n return await CaseDbCaseApi.getInstance().casesDeleteOne(item.id);\n },\n resourceQueryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASES),\n });\n\n const caseRightsQuery = useCaseRightsQuery(caseIds, openProps.caseTypeId, !isDeleteMutating && !isRefreshingData);\n const loadables = useArray([caseRightsQuery, dataCollectionsQuery, dataCollectionsMapQuery, dataCollectionOptionsQuery]);\n\n const { data: caseDbCase, error: caseError, isLoading: caseIsLoading } = useItemQuery<CaseDbCase>({\n baseQueryKey: CASEDB_QUERY_KEY.CASES_LAZY,\n itemId: openProps.caseId,\n useQueryOptions: {\n enabled: !isDeleteMutating && !isRefreshingData,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().casesGetOne(openProps.caseId, { signal });\n return response.data;\n },\n },\n });\n\n const caseDataCollectionLinksFilter = useMemo<CaseDbUuidSetFilter>(() => ({\n invert: false,\n key: 'case_id',\n members: [caseDbCase?.id],\n type: 'UUID_SET',\n }), [caseDbCase?.id]);\n const { data: caseDataCollectionLinks, error: caseDataCollectionLinksError, isLoading: isCaseDataCollectionLinksLoading } = useQueryMemo({\n enabled: !!caseDbCase,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().caseDataCollectionLinksPostQuery(caseDataCollectionLinksFilter, null, null, { signal });\n return response.data;\n },\n queryKey: QueryClientService.getInstance().getGenericKey(CASEDB_QUERY_KEY.CASE_DATA_COLLECTION_LINKS, caseDataCollectionLinksFilter),\n });\n\n\n const canEdit = useMemo(() => {\n return !!caseRightsQuery.data && caseRightsQuery.data.some((right) => right.is_full_access || right.write_col_ids.length) && !FeatureFlagsService.getInstance().featureFlags?.disable_upload;\n }, [caseRightsQuery.data]);\n\n const canShare = useMemo(() => {\n return !!caseRightsQuery.data && caseRightsQuery.data.some((right) => right.is_full_access || right.remove_data_collection_ids.length || right.add_data_collection_ids.length);\n }, [caseRightsQuery.data]);\n\n const canDelete = useCallback(() => {\n return !!caseRightsQuery.data && caseRightsQuery.data.some((right) => right.is_full_access || right.can_delete);\n }, [caseRightsQuery]);\n\n const onEditButtonClick = useCallback(() => {\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.EDIT);\n }, []);\n\n const onShareButtonClick = useCallback(() => {\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.SHARING);\n }, []);\n\n const onGoBackButtonClick = useCallback(() => {\n setCurrentTab(CASE_INFO_DIALOG_TAB_NAME.INFO);\n }, []);\n\n\n const onEpiCaseFormIsSavingChange = useCallback((isSaving: boolean) => {\n setIsEpiCaseFormSaving(isSaving);\n }, []);\n\n const onEpiCaseDataCollectionFormIsSavingChange = useCallback((isSaving: boolean) => {\n setIsEpiCaseDataCollectionFormSaving(isSaving);\n }, []);\n\n const onDeleteEventButtonClick = useCallback(() => {\n deleteConfirmationRef.current.open();\n }, []);\n\n const onDeleteConfirmationConfirm = useCallback(() => {\n deleteMutate(caseDbCase);\n }, [caseDbCase, deleteMutate]);\n\n const isSaving = isEpiCaseFormSaving || isEpiCaseDataCollectionFormSaving;\n\n useEffect(() => {\n if (currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT) {\n onTitleChange(t`Case information - Edit`);\n } else if (currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING) {\n onTitleChange(t`Case information - Share`);\n } else {\n onTitleChange(t`Case information`);\n }\n }, [currentTab, onTitleChange, t]);\n\n useEffect(() => {\n const actions: DialogAction[] = [];\n\n if (currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT || currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING) {\n actions.push({\n ...TestIdUtil.createAttributes('CaseInfoDialog-goBackButton'),\n color: 'primary',\n disabled: isSaving,\n label: t`Go back`,\n onClick: onGoBackButtonClick,\n startIcon: <ArrowLeftIcon />,\n variant: 'outlined',\n });\n }\n\n if (currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT && canEdit) {\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-saveButton'),\n color: 'secondary',\n disabled: isSaving,\n form: valuesFormId,\n label: t`Save`,\n startIcon: <SaveIcon />,\n type: 'submit',\n variant: 'contained',\n },\n );\n } else if (currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING && canShare) {\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-saveButton'),\n color: 'secondary',\n disabled: isSaving,\n form: dataCollectionsFormId,\n label: t`Save`,\n startIcon: <SaveIcon />,\n type: 'submit',\n variant: 'contained',\n },\n );\n } else if (currentTab === CASE_INFO_DIALOG_TAB_NAME.INFO) {\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseSetInfoDialog-deleteButton'),\n color: 'primary',\n disabled: !canDelete(),\n label: t`Delete`,\n onClick: onDeleteEventButtonClick,\n startIcon: <DeleteIcon />,\n variant: 'outlined',\n },\n );\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-editDataCollectionsButton'),\n color: 'primary',\n disabled: !canShare,\n label: t`Share`,\n onClick: onShareButtonClick,\n startIcon: <ShareIcon />,\n variant: 'outlined',\n },\n );\n actions.push(\n {\n ...TestIdUtil.createAttributes('CaseInfoDialog-editCaseContentButton'),\n color: 'primary',\n disabled: !canEdit,\n label: t`Edit`,\n onClick: onEditButtonClick,\n startIcon: <EditIcon />,\n variant: 'outlined',\n },\n );\n }\n onActionsChange(actions);\n }, [onActionsChange, onEditButtonClick, t, currentTab, onGoBackButtonClick, onShareButtonClick, valuesFormId, dataCollectionsFormId, onClose, isSaving, canShare, onDeleteEventButtonClick, canDelete, canEdit]);\n\n const caseAbacContextValue = useMemo<CaseAbacContext>(() => {\n return {\n createdInDataCollection: caseDbCase ? dataCollectionsMapQuery.map.get(caseDbCase.created_in_data_collection_id) : undefined,\n itemDataCollectionLinks: [caseDataCollectionLinks],\n rights: caseRightsQuery.data,\n userDataCollectionOptions: dataCollectionOptionsQuery.options,\n userDataCollections: dataCollectionsQuery.data,\n userDataCollectionsMap: dataCollectionsMapQuery.map,\n };\n }, [dataCollectionsQuery.data, dataCollectionsMapQuery.map, dataCollectionOptionsQuery.options, caseDataCollectionLinks, caseRightsQuery.data, caseDbCase]);\n\n if (isRefreshingData) {\n return (\n <Spinner\n inline\n label={t`Refreshing data`}\n />\n );\n }\n\n return (\n <>\n <ResponseHandler\n error={caseError || caseDataCollectionLinksError}\n inlineSpinner\n isLoading={caseIsLoading || isCaseDataCollectionLinksLoading}\n loadables={loadables}\n shouldHideActionButtons\n >\n <CaseAbacContextProvider caseAbac={caseAbacContextValue}>\n <ReadOnlyCaseContent\n caseDbCase={caseDbCase}\n sx={{\n marginBottom: 2,\n }}\n />\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.INFO && (\n <>\n <CaseSharingInfo\n sx={{\n marginBottom: 2,\n }}\n />\n <CaseCaseSetInfo\n caseDbCase={caseDbCase}\n sx={{\n marginBottom: 2,\n }}\n />\n <CaseContent\n caseDbCase={caseDbCase}\n sx={{\n marginBottom: 2,\n }}\n />\n </>\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT && canEdit && (\n <CaseInfoForm\n caseDbCase={caseDbCase}\n caseRights={caseRightsQuery.data?.[0]}\n formId={valuesFormId}\n onFinish={onFinish}\n onIsSavingChange={onEpiCaseFormIsSavingChange}\n />\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.EDIT && !canEdit && (\n <Typography variant={'body1'}>\n {t`You do not have permissions to edit this case.`}\n </Typography>\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING && canShare && (\n <CaseSharingForm\n caseDbCase={caseDbCase}\n formId={dataCollectionsFormId}\n onFinish={onFinish}\n onIsSavingChange={onEpiCaseDataCollectionFormIsSavingChange}\n />\n )}\n {currentTab === CASE_INFO_DIALOG_TAB_NAME.SHARING && !canShare && (\n <Typography variant={'body1'}>\n {t`You do not have permissions to share this case.`}\n </Typography>\n )}\n </CaseAbacContextProvider>\n </ResponseHandler>\n <Confirmation\n body={t`Are you sure you want to delete the case?`}\n cancelLabel={t`Cancel`}\n confirmLabel={t`Delete`}\n onConfirm={onDeleteConfirmationConfirm}\n ref={deleteConfirmationRef}\n title={t`Delete case?`}\n />\n </>\n );\n}, {\n fullWidth: true,\n maxWidth: 'lg',\n testId: 'CaseInfoDialog',\n});\n"],"mappings":"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"}
|