@gen-epix/ui-client-casedb 4.1.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/AddCasesToEventDialog.js +98 -98
- package/dist/_chunks/AddCasesToEventDialog.js.map +1 -1
- package/dist/_chunks/CaseContentForm.js +10 -10
- package/dist/_chunks/CaseInfoDialog.js +242 -241
- package/dist/_chunks/CaseInfoDialog.js.map +1 -1
- package/dist/_chunks/CaseSetInfoDialog.js +224 -224
- package/dist/_chunks/CaseSetInfoDialog.js.map +1 -1
- package/dist/_chunks/Dashboard.js +549 -550
- package/dist/_chunks/Dashboard.js.map +1 -1
- package/dist/_chunks/FindSimilarCasesDialog.js +76 -76
- package/dist/_chunks/FindSimilarCasesDialog.js.map +1 -1
- package/dist/_chunks/LegendaItem.js.map +1 -1
- package/dist/_chunks/LineListWidget.js +138 -136
- package/dist/_chunks/LineListWidget.js.map +1 -1
- package/dist/_chunks/PanelSeparator.js +3 -3
- package/dist/_chunks/PanelSeparator.js.map +1 -1
- package/dist/_chunks/Upload.js +318 -318
- package/dist/_chunks/Upload.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/cloneDeep.js +1 -1
- package/dist/_chunks/cloneDeep.js.map +1 -1
- package/dist/_chunks/esm.js +3 -3
- package/dist/_chunks/esm.js.map +1 -1
- package/dist/_chunks/index.module.js +1 -1
- package/dist/_chunks/index.module.js.map +1 -1
- package/dist/_chunks/react.js +1 -1
- package/dist/_chunks/react.js.map +1 -1
- package/dist/_chunks/shallow.js +2 -2
- package/dist/_chunks/shallow.js.map +1 -1
- package/dist/_chunks/vanilla.js +1 -1
- package/dist/_chunks/vanilla.js.map +1 -1
- package/dist/_chunks/yup.js +24 -24
- package/dist/_chunks/yup.js.map +1 -1
- package/dist/components/form/fields/ArrangementEditor/index.js +30 -30
- package/dist/components/ui/CreateEventDialog/index.js +40 -40
- package/dist/components/ui/CreateEventDialog/index.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/components/ui/SequenceDownloadDialog/index.js +22 -22
- 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 +59 -59
- package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js.map +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 +73 -72
- package/dist/_chunks/chunk-BV7QT456.js.map +0 -1
- package/dist/_chunks/index.esm.js +0 -1465
- package/dist/_chunks/index.esm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Upload.js","names":[],"sources":["../../src/components/ui/Upload/UploadNavigation.tsx","../../src/components/ui/Upload/UploadSelectFile.tsx","../../src/components/ui/Upload/UploadMapColumns.tsx","../../src/components/ui/CompletCaseTypeLoader/withEpiCompleteCaseTypeLoader.tsx","../../src/components/ui/Upload/UploadEditColumnValuesDialog.tsx","../../src/components/ui/Upload/UploadCaseResultTable.tsx","../../src/components/ui/Upload/UploadPreviewNavigation.tsx","../../src/components/ui/Upload/UploadPreview.tsx","../../src/components/ui/Upload/UploadCreateCases.tsx","../../src/components/ui/Upload/UploadSelectSequenceFiles.tsx","../../src/components/ui/Upload/UploadMapSequences.tsx","../../src/components/ui/Upload/Upload.tsx"],"sourcesContent":["import type { ContainerOwnProps } from '@mui/material';\nimport {\n Box,\n Button,\n} from '@mui/material';\nimport { use } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\n\nexport type UploadNavigationProps = {\n readonly backLabel?: string;\n readonly containerProps?: ContainerOwnProps;\n readonly onGoBackButtonClick?: () => void;\n readonly onProceedButtonClick?: () => void;\n readonly proceedDisabled?: boolean;\n readonly proceedLabel?: string;\n};\n\nexport const UploadNavigation = ({\n backLabel,\n onGoBackButtonClick: onGoBack,\n onProceedButtonClick: onProceedButtonClick,\n proceedDisabled,\n proceedLabel,\n}: UploadNavigationProps) => {\n const { t } = useTranslation();\n const store = use(UploadStoreContext);\n const stepOrder = useStore(store, (state) => state.stepOrder);\n const activeStep = useStore(store, (state) => state.activeStep);\n const goBackFromFirstStepCallback = useStore(store, (state) => state.goBackFromFirstStepCallback);\n const goBackFromFirstStepLabel = useStore(store, (state) => state.goBackFromFirstStepLabel);\n\n const isFirstStep = activeStep === stepOrder[0];\n const onClickGoBack = isFirstStep ? (goBackFromFirstStepCallback ?? onGoBack) : onGoBack;\n const effectiveBackLabel = isFirstStep ? (goBackFromFirstStepLabel ?? backLabel) : backLabel;\n\n return (\n <Box\n sx={{\n borderTop: (theme) => `1px solid ${theme.palette.divider}`,\n display: 'flex',\n gap: 2,\n justifyContent: 'flex-end',\n marginTop: 1,\n paddingTop: 1,\n }}\n >\n {onClickGoBack && (\n <Button\n onClick={onClickGoBack}\n variant={'outlined'}\n >\n {effectiveBackLabel ?? t`Go back`}\n </Button>\n )}\n {onProceedButtonClick && (\n <Button\n color={'secondary'}\n disabled={proceedDisabled}\n onClick={onProceedButtonClick}\n variant={'contained'}\n >\n {proceedLabel ?? t`Next`}\n </Button>\n )}\n </Box>\n );\n\n};\n","import {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport type { Resolver } from 'react-hook-form';\nimport { useForm } from 'react-hook-form';\nimport {\n mixed,\n object,\n string,\n} from 'yup';\nimport {\n Alert,\n AlertTitle,\n Container,\n Typography,\n} from '@mui/material';\nimport { useStore } from 'zustand';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useItemQuery } from '@gen-epix/ui-client-common/hooks/useItemQuery';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\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';\n\nimport {\n useCaseTypeOptionsQuery,\n useCaseTypesQuery,\n} from '../../../dataHooks/useCaseTypesQuery';\nimport { useDataCollectionOptionsQuery } from '../../../dataHooks/useDataCollectionsQuery';\nimport { useColsQuery } from '../../../dataHooks/useColsQuery';\nimport { UploadUtil } from '../../../utils/UploadUtil';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nimport { UploadNavigation } from './UploadNavigation';\n\ntype FormFields = {\n caseTypeId: string;\n createdInDataCollectionId: string;\n fileList: unknown;\n sheet: string;\n};\n\nexport const UploadSelectFile = () => {\n const { t } = useTranslation();\n const caseTypesQuery = useCaseTypesQuery();\n const caseTypeOptionsQuery = useCaseTypeOptionsQuery();\n const dataCollectionOptionsQuery = useDataCollectionOptionsQuery();\n const colsQuery = useColsQuery();\n const formId = useId();\n\n const store = use(UploadStoreContext);\n\n const caseTypeId = useStore(store, (state) => state.caseTypeId);\n const fileList = useStore(store, (state) => state.fileList);\n const fileName = useStore(store, (state) => state.fileName);\n const fileParsingError = useStore(store, (state) => state.fileParsingError);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const createdInDataCollectionOptions = useStore(store, (state) => state.createdInDataCollectionOptions);\n const rawData = useStore(store, (state) => state.rawData);\n const setCols = useStore(store, (state) => state.setCols);\n const setCaseTypeId = useStore(store, (state) => state.setCaseTypeId);\n const setCompleteCaseType = useStore(store, (state) => state.setCompleteCaseType);\n const setCreatedInDataCollectionId = useStore(store, (state) => state.setCreatedInDataCollectionId);\n const setFileList = useStore(store, (state) => state.setFileList);\n const setSheet = useStore(store, (state) => state.setSheet);\n const setDataCollectionOptions = useStore(store, (state) => state.setDataCollectionOptions);\n const sheet = useStore(store, (state) => state.sheet);\n const sheetOptions = useStore(store, (state) => state.sheetOptions);\n\n const schema = useMemo(() => object<FormFields>().shape({\n caseTypeId: string().uuid4().required(),\n createdInDataCollectionId: string().uuid4().required(),\n fileList: mixed().required(t`File is required`),\n sheet: string().when('fileList', {\n is: UploadUtil.isXlsxFile(fileName),\n otherwise: (sheetSchema) => sheetSchema.notRequired(),\n then: (sheetSchema) => sheetSchema.required(t`Sheet is required`),\n }),\n }), [fileName, t]);\n\n const formMethods = useForm<FormFields>({\n defaultValues: {\n caseTypeId: null,\n createdInDataCollectionId: null,\n fileList: null,\n sheet: null,\n },\n resolver: yupResolver(schema) as unknown as Resolver<FormFields>,\n values: {\n caseTypeId: store.getState().caseTypeId ?? null,\n createdInDataCollectionId: store.getState().createdInDataCollectionId ?? null,\n fileList: store.getState().fileList ?? null,\n sheet: store.getState().sheet ?? null,\n },\n });\n const { handleSubmit, setError, setValue } = formMethods;\n\n useEffect(() => {\n if (Array.isArray(colsQuery?.data)) {\n setCols(colsQuery.data);\n }\n }, [colsQuery.data, setCols]);\n\n useEffect(() => {\n if (dataCollectionOptionsQuery?.options?.length) {\n setDataCollectionOptions(dataCollectionOptionsQuery.options);\n }\n }, [dataCollectionOptionsQuery?.options, setDataCollectionOptions]);\n\n const { data: completeCaseType, error: completeCaseTypeError, isLoading: isCompleteCaseTypeLoading } = useItemQuery({\n baseQueryKey: CASEDB_QUERY_KEY.COMPLETE_CASE_TYPES,\n itemId: caseTypeId,\n useQueryOptions: {\n enabled: !!caseTypeId,\n queryFn: async ({ signal }) => {\n return (await CaseDbCaseApi.getInstance().completeCaseTypesGetOne(caseTypeId, { signal })).data;\n },\n },\n });\n\n useEffect(() => {\n if (completeCaseType) {\n setCompleteCaseType(completeCaseType);\n }\n }, [completeCaseType, setCompleteCaseType]);\n\n const onFileListChange = useCallback(async (value: FileList) => {\n await setFileList(value);\n }, [setFileList]);\n\n const onSheetChange = useCallback(async (value: unknown) => {\n await setSheet(value as string);\n }, [setSheet]);\n\n const onCaseTypeIdChange = useCallback((value: unknown) => {\n setCaseTypeId(value as string);\n }, [setCaseTypeId]);\n\n const onCreatedInDataCollectionIdChange = useCallback((value: unknown) => {\n setCreatedInDataCollectionId(value as string);\n }, [setCreatedInDataCollectionId]);\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => {\n const fields: FormFieldDefinition<FormFields>[] = [\n {\n accept: '.csv,.tsv,.txt,.xlsx',\n definition: FORM_FIELD_DEFINITION_TYPE.FILE,\n label: t`File`,\n name: 'fileList',\n onChange: onFileListChange,\n } as const satisfies FormFieldDefinition<FormFields>,\n ];\n\n if (UploadUtil.isXlsxFile(fileName)) {\n fields.push({\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Sheet`,\n name: 'sheet',\n onChange: onSheetChange,\n options: sheetOptions,\n } as const satisfies FormFieldDefinition<FormFields>);\n }\n\n fields.push(...[\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n disabled: !fileList,\n label: t`Case type`,\n loading: caseTypeOptionsQuery.isLoading,\n name: 'caseTypeId',\n onChange: onCaseTypeIdChange,\n options: caseTypeOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n disabled: !fileList || !caseTypeId,\n label: t`Create in data collection`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n name: 'createdInDataCollectionId',\n onChange: onCreatedInDataCollectionIdChange,\n options: createdInDataCollectionOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n ] as const);\n\n return fields;\n }, [t, onFileListChange, fileName, caseTypeOptionsQuery.options, caseTypeOptionsQuery.isLoading, fileList, onCaseTypeIdChange, createdInDataCollectionOptions, dataCollectionOptionsQuery.isLoading, isCompleteCaseTypeLoading, caseTypeId, onCreatedInDataCollectionIdChange, sheetOptions, onSheetChange]);\n\n useEffect(() => {\n if (fileParsingError) {\n setError('fileList', { message: fileParsingError, type: 'manual' });\n } else {\n setError('fileList', undefined);\n }\n }, [fileParsingError, setError, setValue]);\n\n const onFormSubmit = useCallback(async () => {\n await goToNextStep();\n }, [goToNextStep]);\n\n const loadables = useArray([\n caseTypesQuery,\n caseTypeOptionsQuery,\n dataCollectionOptionsQuery,\n colsQuery,\n ]);\n\n const onProceedButtonClick = useCallback(async () => {\n await handleSubmit(onFormSubmit)();\n }, [handleSubmit, onFormSubmit]);\n\n const canUpload = useMemo(() => {\n if (colsQuery.isLoading === false && colsQuery.data?.length === 0) {\n return false;\n }\n if (caseTypeOptionsQuery.isLoading === false && caseTypeOptionsQuery.options?.length === 0) {\n return false;\n }\n if (dataCollectionOptionsQuery.isLoading === false && dataCollectionOptionsQuery.options?.length === 0) {\n return false;\n }\n return true;\n }, [colsQuery.data?.length, colsQuery.isLoading, caseTypeOptionsQuery.isLoading, caseTypeOptionsQuery.options?.length, dataCollectionOptionsQuery.isLoading, dataCollectionOptionsQuery.options?.length]);\n\n return (\n\n <ResponseHandler\n error={completeCaseTypeError}\n inlineSpinner\n loadables={loadables}\n >\n <Container maxWidth={'lg'}>\n {!canUpload && (\n <Alert\n severity={'warning'}\n sx={{ mb: 2 }}\n >\n {t('Upload is disabled because you have insufficient data access to proceed. Contact your organization administrator for assistance.')}\n </Alert>\n )}\n {canUpload && (\n <>\n {rawData && rawData.length > 0 && (\n <Alert\n severity={'info'}\n sx={{ mb: 2 }}\n >\n <AlertTitle>\n {t('{{fileName}} loaded successfully', { fileName })}\n </AlertTitle>\n {sheet && (\n <Typography>\n {t('Sheet name: {{sheet}}', { sheet: sheet || '' })}\n </Typography>\n )}\n <Typography>\n {t('Number of columns: {{columnCount}}', { columnCount: rawData[0].length })}\n </Typography>\n <Typography>\n {t('Number of data rows: {{rowCount}}', { rowCount: rawData.length - 1 })}\n </Typography>\n </Alert>\n )}\n <GenericForm<FormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n <UploadNavigation\n onProceedButtonClick={onProceedButtonClick}\n />\n </>\n )}\n\n </Container>\n </ResponseHandler>\n );\n};\n","import type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport {\n useForm,\n useWatch,\n} from 'react-hook-form';\nimport {\n Alert,\n AlertTitle,\n Box,\n Container,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport uniq from 'lodash/uniq';\nimport { useStore } from 'zustand';\nimport difference from 'lodash/difference';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useIdentifierIssuerOwnOrganizationOptionsQuery } from '@gen-epix/ui-client-common/dataHooks/useIdentifierIssuerOwnOrganizationQuery';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\nimport { Select } from '@gen-epix/ui-core-form/components/fields/Select';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type { FormFieldDefinition } from '@gen-epix/ui-core-form/models/form';\n\nimport { useColMapQuery } from '../../../dataHooks/useColsQuery';\nimport type { UploadMappedColumnsFormFields } from '../../../models/upload';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UploadUtil } from '../../../utils/UploadUtil';\n\nimport { UploadNavigation } from './UploadNavigation';\n\n\nexport const UploadMapColumns = () => {\n const { t } = useTranslation();\n const colMap = useColMapQuery();\n const identifierIssuerOptionsQuery = useIdentifierIssuerOwnOrganizationOptionsQuery();\n\n const store = use(UploadStoreContext);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const rawData = useStore(store, (state) => state.rawData);\n const fileName = useStore(store, (state) => state.fileName);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const setMappedColumns = useStore(store, (state) => state.setMappedColumns);\n\n const loadables = useArray([\n colMap,\n identifierIssuerOptionsQuery,\n ]);\n\n const columnMappingFormId = useId();\n\n const schema = useMemo(() => {\n return UploadUtil.getColumnMappingSchema(rawData, completeCaseType);\n }, [completeCaseType, rawData]);\n\n const defaultValues: UploadMappedColumnsFormFields = useMemo(() => {\n return UploadUtil.getDefaultColumnMappingFormValues(rawData[0], store.getState().mappedColumns, identifierIssuerOptionsQuery.options);\n }, [rawData, store, identifierIssuerOptionsQuery.options]);\n\n const formMethods = useForm<UploadMappedColumnsFormFields>({\n defaultValues: { ...defaultValues },\n resolver: yupResolver(schema),\n values: { ...defaultValues },\n });\n\n const { clearErrors, control, handleSubmit } = formMethods;\n const columnMappingFormValues = useWatch({ control });\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<UploadMappedColumnsFormFields>[]>(() => {\n return UploadUtil.getColumnMappingFormFieldDefinitions(completeCaseType, rawData[0], fileName).map(def => ({\n ...def,\n onChange: () => clearErrors(),\n }));\n }, [completeCaseType, rawData, fileName, clearErrors]);\n\n useEffect(() => {\n const perform = async () => {\n await setMappedColumns(UploadUtil.getMappedColumnsFromFormData(columnMappingFormValues, rawData, colMap.map, completeCaseType));\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [setMappedColumns, columnMappingFormValues, rawData, colMap.map, completeCaseType]);\n\n const unMappedColumns = useMemo(() => {\n const knownIndicies = rawData[0].map((_col, index) => index);\n const mappedIndicies = UploadUtil.getMappedColumnsFromFormData(columnMappingFormValues, rawData, colMap.map, completeCaseType).map(mappedColumn => mappedColumn.originalIndex);\n return difference(knownIndicies, mappedIndicies).map(index => {\n return {\n originalIndex: index,\n originalLabel: rawData[0][index],\n };\n });\n }, [colMap.map, rawData, columnMappingFormValues, completeCaseType]);\n\n const onFormSubmit = useCallback(async (data: UploadMappedColumnsFormFields) => {\n await setMappedColumns(UploadUtil.getMappedColumnsFromFormData(data, rawData, colMap.map, completeCaseType));\n await goToNextStep();\n }, [rawData, colMap.map, goToNextStep, setMappedColumns, completeCaseType]);\n\n const sampleIdColIds = useMemo(() => {\n return UploadUtil.getSampleIdColIds(completeCaseType);\n }, [completeCaseType]);\n\n const renderField = useCallback((definition: FormFieldDefinition<UploadMappedColumnsFormFields>, element: ReactElement) => {\n const columnIndexInRawData = parseInt(definition.name, 10);\n const columnValues = uniq(rawData.slice(1).map((row) => row[columnIndexInRawData] ?? '')).filter(x => !!x);\n const firstFiveValuesString = columnValues.slice(0, 5).join(', ').trim() || t('<no data>');\n\n let elementWithIssuer = element;\n const fieldValue = columnMappingFormValues[definition.name];\n if (sampleIdColIds.includes(fieldValue)) {\n elementWithIssuer = (\n <>\n <Box>\n {element}\n </Box>\n <Box\n sx={{\n marginTop: 1,\n }}\n >\n <Select\n label={t('{{columnLabel}}: Identifier issuer', { columnLabel: definition.label })}\n loading={identifierIssuerOptionsQuery.isLoading}\n name={fieldValue}\n options={identifierIssuerOptionsQuery.options}\n />\n </Box>\n </>\n );\n }\n\n return (\n <TableRow key={definition.name}>\n <TableCell>\n {definition.label}\n </TableCell>\n <TableCell>\n {elementWithIssuer}\n </TableCell>\n <TableCell>\n {firstFiveValuesString}\n </TableCell>\n </TableRow>\n );\n }, [columnMappingFormValues, identifierIssuerOptionsQuery.isLoading, identifierIssuerOptionsQuery.options, rawData, sampleIdColIds, t]);\n\n const wrapForm = useCallback((children: ReactElement) => {\n return (\n <Table\n size={'small'}\n >\n <TableHead\n sx={{\n backgroundColor: (theme) => theme.palette.background.paper,\n position: 'sticky',\n top: 0,\n zIndex: (theme) => theme.zIndex.appBar - 1,\n }}\n >\n <TableRow>\n <TableCell sx={{ width: '33%' }}>\n {t`Source`}\n </TableCell>\n <TableCell sx={{ width: '33%' }}>\n {ConfigService.getInstance().config.applicationName}\n </TableCell>\n <TableCell sx={{ width: '34%' }}>\n {t`Data preview (first 5 unique values)`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {children}\n </TableBody>\n </Table>\n );\n }, [t]);\n\n const onProceedButtonClick = useCallback(async () => {\n await handleSubmit(onFormSubmit)();\n }, [handleSubmit, onFormSubmit]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n return (\n <ResponseHandler loadables={loadables}>\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'max-content auto max-content',\n height: '100%',\n }}\n >\n <Container\n maxWidth={'lg'}\n sx={{\n marginBottom: 2,\n }}\n >\n <Alert severity={unMappedColumns.length === 0 ? 'info' : 'warning'}>\n <AlertTitle>\n {unMappedColumns.length === 0 ?\n t('All columns in {{fileName}} have been mapped to known columns in {{applicationName}}', { applicationName: ConfigService.getInstance().config.applicationName, fileName })\n : t('{{numUnmappedColumns}} column(s) in {{fileName}} are not mapped', { fileName, numUnmappedColumns: unMappedColumns.length })}\n </AlertTitle>\n {unMappedColumns.map((unmappedColumn) => (\n <Box key={unmappedColumn.originalIndex}>\n {t('The column \"{{columnName}}\" (column {{columnIndex}}) has not been mapped.', { columnIndex: unmappedColumn.originalIndex + 1, columnName: unmappedColumn.originalLabel })}\n </Box>\n ))}\n {unMappedColumns.length === 0 && t('You can proceed to the next step.')}\n </Alert>\n </Container>\n <Box\n sx={{\n overflowY: 'auto',\n position: 'relative',\n }}\n >\n <Box\n sx={{\n bottom: 0,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n <Container>\n <GenericForm<UploadMappedColumnsFormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={columnMappingFormId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n renderField={renderField}\n schema={schema}\n wrapForm={wrapForm}\n />\n </Container>\n </Box>\n </Box>\n <Box>\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n />\n </Box>\n </Box>\n </ResponseHandler>\n );\n};\n","import {\n useCallback,\n useState,\n} from 'react';\nimport type { ComponentType } from 'react';\n\nimport type { CompletCaseTypeLoaderProps } from './CompletCaseTypeLoader';\nimport { CompletCaseTypeLoader } from './CompletCaseTypeLoader';\n\nexport type WithEpiCompleteCaseTypeLoaderProps = CompletCaseTypeLoaderProps;\n\nexport const withEpiCompleteCaseTypeLoader = <P extends WithEpiCompleteCaseTypeLoaderProps>(WrappedComponent: ComponentType<P>): ComponentType<P> => {\n return (props: WithEpiCompleteCaseTypeLoaderProps) => {\n const [isCompleteCaseTypeLoaded, setIsCompleteCaseTypeLoaded] = useState<boolean>(false);\n\n const onCompleteCaseTypeLoaded = useCallback(() => {\n setIsCompleteCaseTypeLoaded(true);\n }, []);\n\n return (\n <CompletCaseTypeLoader\n caseTypeId={props.caseTypeId}\n onCompleteCaseTypeLoaded={onCompleteCaseTypeLoaded}\n >\n {isCompleteCaseTypeLoaded && (\n <WrappedComponent\n {...props as P}\n />\n )}\n </CompletCaseTypeLoader>\n );\n };\n};\n","import { useTranslation } from 'react-i18next';\nimport type {\n CaseDbCase,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\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 { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport type { ReactElement } from 'react';\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport { useForm } from 'react-hook-form';\nimport {\n Alert,\n AlertTitle,\n Box,\n} from '@mui/material';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport { FormUtil } from '@gen-epix/ui-core-form/utils/FormUtil';\n\nimport { CaseTypeFormUtil } from '../../../utils/CaseTypeFormUtil';\n\n\nexport interface UploadEditColumnValuesDialogOpenProps {\n colId: string;\n completeCaseType: CaseDbCompleteCaseType;\n shouldShowRightsWarning?: boolean;\n}\n\nexport interface UploadEditColumnValuesDialogProps extends WithDialogRenderProps<UploadEditColumnValuesDialogOpenProps> {\n onSubmit: (content: CaseDbCase['content']) => void;\n}\n\nexport type UploadEditColumnValuesDialogRefMethods = WithDialogRefMethods<UploadEditColumnValuesDialogProps, UploadEditColumnValuesDialogOpenProps>;\n\n\nexport const UploadEditColumnValuesDialog = withDialog<UploadEditColumnValuesDialogProps, UploadEditColumnValuesDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onSubmit,\n onTitleChange,\n openProps,\n }: UploadEditColumnValuesDialogProps,\n): ReactElement => {\n const { t } = useTranslation();\n const formId = useId();\n\n const col = useMemo(() => {\n return openProps.completeCaseType.cols[openProps.colId];\n }, [openProps.completeCaseType.cols, openProps.colId]);\n\n useEffect(() => {\n onTitleChange(t('Edit values for {{colLabel}} (for selected rows)', { colLabel: col.label }));\n }, [onTitleChange, col.label, t]);\n\n const schema = useMemo(() => CaseTypeFormUtil.createYupSchema({\n completeCaseType: openProps.completeCaseType,\n includedColIds: [openProps.colId],\n }), [openProps.completeCaseType, openProps.colId]);\n\n const formMethods = useForm<CaseDbCase['content']>({\n resolver: yupResolver(schema),\n });\n const { handleSubmit } = formMethods;\n\n const { fieldDefinitions } = useMemo(() => {\n return CaseTypeFormUtil.createFormDefinitions({\n completeCaseType: openProps.completeCaseType,\n includedColIds: [openProps.colId],\n });\n }, [openProps.completeCaseType, openProps.colId]);\n\n const onFormSubmit = useCallback((content: CaseDbCase['content']) => {\n onSubmit(FormUtil.createStringValuesFromFormValues(fieldDefinitions, content));\n onClose();\n }, [fieldDefinitions, onClose, onSubmit]);\n\n useEffect(() => {\n const actions: DialogAction[] = [\n {\n ...TestIdUtil.createAttributes('UploadEditColumnValuesDialog-submitButton'),\n color: 'primary',\n form: formId,\n label: t`Save and revalidate`,\n type: 'submit',\n variant: 'contained',\n },\n ];\n onActionsChange(actions);\n }, [formId, onActionsChange, t]);\n\n return (\n <Box>\n {openProps.shouldShowRightsWarning && (\n <Box sx={{ marginBottom: 2 }}>\n <Alert severity={'warning'}>\n <AlertTitle>\n {t`You do not have the necessary rights to edit all rows in this column.`}\n </AlertTitle>\n {t`Only the cases that you have write access to for this column will be updated. Please review the changes carefully before submitting.`}\n </Alert>\n </Box>\n )}\n <GenericForm<CaseDbCase['content']>\n formFieldDefinitions={fieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n </Box>\n );\n}, {\n defaultTitle: '',\n fullWidth: true,\n maxWidth: 'md',\n testId: 'UploadEditColumnValuesDialog',\n});\n","import type { ReactElement } from 'react';\nimport {\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport EditIcon from '@mui/icons-material/Edit';\nimport type { StoreApi } from 'zustand';\nimport {\n Box,\n ListItemIcon,\n ListItemText,\n MenuItem,\n Tooltip,\n useTheme,\n} from '@mui/material';\nimport ErrorOutlinedIcon from '@mui/icons-material/ErrorOutlined';\nimport AddIcon from '@mui/icons-material/Add';\nimport { useTranslation } from 'react-i18next';\nimport type {\n CaseDbCase,\n CaseDbCaseDataIssue,\n CaseDbCaseUploadResult,\n CaseDbCol,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport { CaseDbDataIssueType } from '@gen-epix/api-casedb';\nimport type {\n TableColumn,\n TableColumnParams,\n TableRowAndColumnParams,\n TableRowParams,\n} from '@gen-epix/ui-client-common/models/table';\nimport type { TableStore } from '@gen-epix/ui-client-common/stores/tableStore';\nimport {\n Table,\n TableMenu,\n} from '@gen-epix/ui-client-common/components/ui/Table';\nimport { TABLE_COLUMN_FROZEN } from '@gen-epix/ui-client-common/models/table';\nimport { TableUtil } from '@gen-epix/ui-client-common/utils/TableUtil';\nimport { useInitializeTableStore } from '@gen-epix/ui-client-common/hooks/useInitializeTableStore';\n\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport type { CaseContentFormDialogRefMethods } from '../CaseContentFormDialog';\nimport { CaseContentFormDialog } from '../CaseContentFormDialog';\n\nimport type { UploadEditColumnValuesDialogRefMethods } from './UploadEditColumnValuesDialog';\nimport { UploadEditColumnValuesDialog } from './UploadEditColumnValuesDialog';\n\n\nexport type UploadCaseResultTableProps = {\n readonly caseRightsColMap?: { [colId: string]: string[] };\n readonly caseUploadResults?: CaseDbCaseUploadResult[];\n readonly completeCaseType: CaseDbCompleteCaseType;\n readonly getOriginalCellValue: (col: CaseDbCol, cellParams: TableRowAndColumnParams<CaseDbCaseUploadResult, null>, issue: CaseDbCaseDataIssue) => string;\n readonly onCaseContentEditSubmit: (caseId: string, content: CaseDbCase['content']) => void;\n readonly onColContentEditSubmit: (contentPerCaseId: { [caseId: string]: CaseDbCase['content'] }) => void;\n readonly tableStore: StoreApi<TableStore<CaseDbCaseUploadResult>>;\n};\n\nexport const UploadCaseResultTable = ({ caseRightsColMap, caseUploadResults, completeCaseType, getOriginalCellValue, onCaseContentEditSubmit, onColContentEditSubmit, tableStore }: UploadCaseResultTableProps) => {\n const theme = useTheme();\n const { t } = useTranslation();\n const caseFormDialogRef = useRef<CaseContentFormDialogRefMethods>(null);\n const uploadEditColumnValuesDialogRef = useRef<UploadEditColumnValuesDialogRefMethods>(null);\n\n const dataRulePriority: CaseDbDataIssueType[] = useMemo(() => [\n CaseDbDataIssueType.UNAUTHORIZED,\n CaseDbDataIssueType.INVALID,\n CaseDbDataIssueType.CONFLICT,\n CaseDbDataIssueType.MISSING,\n CaseDbDataIssueType.DERIVED,\n CaseDbDataIssueType.TRANSFORMED,\n ], []);\n\n const errorIssueTypes: CaseDbDataIssueType[] = useMemo(() => [\n CaseDbDataIssueType.UNAUTHORIZED,\n CaseDbDataIssueType.INVALID,\n ], []);\n\n const warningIssueTypes: CaseDbDataIssueType[] = useMemo(() => [\n CaseDbDataIssueType.MISSING,\n CaseDbDataIssueType.CONFLICT,\n ], []);\n\n const onTableCustomHeaderIconClick = useCallback((params: TableColumnParams<CaseDbCaseUploadResult, null>) => {\n uploadEditColumnValuesDialogRef.current?.open({\n colId: params.column.id,\n completeCaseType,\n shouldShowRightsWarning: caseRightsColMap?.[params.column.id]?.length !== caseUploadResults?.length,\n });\n }, [completeCaseType, caseRightsColMap, caseUploadResults]);\n\n const onCaseContentFormDialogSubmit = useCallback((caseId: string, content: CaseDbCase['content']) => {\n onCaseContentEditSubmit(caseId, content);\n }, [onCaseContentEditSubmit]);\n\n const onEpiUploadEditColumnValuesDialogSubmit = useCallback((content: CaseDbCase['content']) => {\n const contentPerCaseId: { [caseId: string]: CaseDbCase['content'] } = {};\n Object.keys(content).forEach((colId) => {\n const caseIds = caseRightsColMap?.[colId] ?? [];\n caseIds.forEach((caseId) => {\n contentPerCaseId[caseId] = {\n ...(contentPerCaseId[caseId] ?? {}),\n [colId]: content[colId],\n };\n });\n });\n onColContentEditSubmit(contentPerCaseId);\n }, [onColContentEditSubmit, caseRightsColMap]);\n\n const getIssueTooltipMessages = useCallback((issues: CaseDbCaseDataIssue[]) => {\n const messages: { key: string; message: string }[] = [];\n issues.forEach((issue) => {\n const columnLabel = completeCaseType.cols[issue.col_id].label;\n const message = `${columnLabel}: ${issue.message}`;\n messages.push({\n key: `${issue.col_id}-${issue.data_issue_type}-${issue.code}`,\n message,\n });\n });\n return messages;\n }, [completeCaseType.cols]);\n\n const getIssueTooltipContent = useCallback((issues: CaseDbCaseDataIssue[]) => {\n const messages = getIssueTooltipMessages(issues);\n return (\n <>\n {messages.map(({ key, message }, index) => (\n <Box\n key={key}\n sx={{ marginTop: index > 0 ? 1 : 0 }}\n >\n {message}\n </Box>\n ))}\n </>\n );\n }, [getIssueTooltipMessages]);\n\n const getIssueTooltipLabel = useCallback((issues: CaseDbCaseDataIssue[]) => {\n const messages = getIssueTooltipMessages(issues);\n return messages.map(m => m.message).join(', ');\n }, [getIssueTooltipMessages]);\n\n const getFilteredIssueTypes = useCallback((id: string, issues: CaseDbCaseDataIssue[], value: string) => {\n return issues.filter((issue) => {\n if (issue.col_id !== id) {\n return false;\n }\n if (issue.data_issue_type === CaseDbDataIssueType.TRANSFORMED && issue.original_value === value) {\n return false;\n }\n return true;\n }).sort((a, b) => dataRulePriority.indexOf(a.data_issue_type) - dataRulePriority.indexOf(b.data_issue_type));\n }, [dataRulePriority]);\n\n const renderHasIssueHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t('Indicates if there are any issues with the case')}\n >\n <ErrorOutlinedIcon\n fontSize={'small'}\n />\n </Tooltip>\n );\n }, [t]);\n\n const renderHasIssueCell = useCallback(({ row }: TableRowParams<CaseDbCaseUploadResult>) => {\n const errorIssues = row.data_issues.filter(i => i.data_issue_type === CaseDbDataIssueType.INVALID || i.data_issue_type === CaseDbDataIssueType.UNAUTHORIZED);\n if (errorIssues.length > 0) {\n return (\n <Tooltip\n aria-hidden={false}\n aria-label={getIssueTooltipLabel(errorIssues)}\n arrow\n title={getIssueTooltipContent(errorIssues)}\n >\n <ErrorOutlinedIcon\n fontSize={'small'}\n sx={{\n color: theme.palette.error.main,\n marginTop: '5px',\n }}\n />\n </Tooltip>\n );\n }\n }, [getIssueTooltipContent, getIssueTooltipLabel, theme.palette.error.main]);\n\n const renderIsNewHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t('Indicates if case is new (will be created)')}\n >\n <AddIcon\n fontSize={'small'}\n />\n </Tooltip>\n );\n }, [t]);\n\n const renderIsNewCell = useCallback(({ row }: TableRowParams<CaseDbCaseUploadResult>) => {\n return row.id ? null : (\n <AddIcon\n aria-hidden={false}\n aria-label={t`This case does not have an ID and will be created`}\n fontSize={'small'}\n sx={{\n marginTop: '5px',\n position: 'absolute',\n }}\n />\n );\n }, [t]);\n\n const renderCell = useCallback(({ id, row }: TableRowParams<CaseDbCaseUploadResult>) => {\n const rowValue = CaseUtil.getRowValue(row.validated_content, completeCaseType.cols[id], completeCaseType);\n const value = rowValue.long;\n const issues = getFilteredIssueTypes(id, row.data_issues, value);\n\n if (issues.length === 0) {\n return (\n <>\n {value}\n </>\n );\n }\n\n let iconColor: string = theme.palette.info.main;\n if (errorIssueTypes.includes(issues[0].data_issue_type)) {\n iconColor = theme.palette.error.main;\n } else if (warningIssueTypes.includes(issues[0].data_issue_type)) {\n iconColor = theme.palette.warning.main;\n }\n\n const originalValue = issues.find(x => x.original_value)?.original_value || '';\n const shouldShowOriginalValue = originalValue && value && originalValue !== value;\n\n const content = (\n <>\n {shouldShowOriginalValue && (\n <>\n <s>\n {originalValue}\n </s>\n {'\\u00A0'}\n </>\n )}\n {value && (\n <>\n {value}\n </>\n )}\n </>\n );\n\n\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n }}\n >\n <Box\n sx={{\n height: theme.spacing(2),\n marginRight: theme.spacing(1),\n minHeight: theme.spacing(2),\n minWidth: theme.spacing(2),\n position: 'relative',\n width: theme.spacing(2),\n }}\n >\n <Tooltip\n arrow\n title={getIssueTooltipContent(issues)}\n >\n <ErrorOutlinedIcon\n fontSize={'small'}\n sx={{\n color: iconColor,\n marginTop: '-2px',\n position: 'absolute',\n }}\n />\n </Tooltip>\n </Box>\n <Box\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {content}\n </Box>\n </Box>\n );\n }, [completeCaseType, errorIssueTypes, getFilteredIssueTypes, getIssueTooltipContent, theme, warningIssueTypes]);\n\n const tableColumns = useMemo<TableColumn<CaseDbCaseUploadResult>[]>(() => {\n const tableCols: TableColumn<CaseDbCaseUploadResult>[] = [];\n if (!caseUploadResults?.length) {\n return tableCols;\n }\n tableCols.push(TableUtil.createReadableIndexColumn());\n tableCols.push(TableUtil.createSelectableColumn());\n tableCols.push({\n disableEllipsis: true,\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n headerName: '',\n hideInFilter: true,\n id: 'gen-epix-ui-issue',\n isInitiallyVisible: true,\n renderCell: renderHasIssueCell,\n renderHeader: renderHasIssueHeader,\n resizable: false,\n type: 'text',\n valueGetter: () => '',\n widthPx: 38,\n });\n tableCols.push({\n disableEllipsis: true,\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n headerName: '',\n hideInFilter: true,\n id: 'gen-epix-ui-id',\n isInitiallyVisible: true,\n renderCell: renderIsNewCell,\n renderHeader: renderIsNewHeader,\n resizable: false,\n type: 'text',\n valueGetter: () => '',\n widthPx: 38,\n });\n\n const uniqueColIds: Set<string> = new Set();\n caseUploadResults.forEach((validatedCase) => {\n Object.keys(validatedCase.validated_content || {}).forEach((colId) => uniqueColIds.add(colId));\n validatedCase.data_issues.forEach((issue) => uniqueColIds.add(issue.col_id));\n });\n\n // eslint-disable-next-line react-hooks/refs\n completeCaseType.ordered_col_ids.forEach((colId) => {\n if (!uniqueColIds.has(colId)) {\n return;\n }\n const col = completeCaseType.cols[colId];\n\n const issuesForCol = caseUploadResults.flatMap(vc => vc.data_issues.filter((i) => i.col_id === col.id));\n const isInitiallyVisible = issuesForCol.length === 0 || issuesForCol.some(i => i.data_issue_type !== CaseDbDataIssueType.DERIVED);\n\n const shouldShowCustomHeaderIcon = caseRightsColMap[col.id]?.length;\n\n if (col) {\n tableCols.push({\n cellTitleGetter: (params) => {\n const issue = params.row.data_issues.find((i) => i.col_id === col.id);\n if (!issue && getOriginalCellValue) {\n const originalValue = getOriginalCellValue(col, params, issue) ?? '';\n return t('{{value}} (original value: \"{{originalValue}}\")', {\n originalValue,\n value: CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n });\n }\n return '';\n },\n customHeaderIcon: shouldShowCustomHeaderIcon ? {\n iconElement: (<EditIcon fontSize={'inherit'} />),\n label: t('Edit values for {{colLabel}} (for selected rows)', { colLabel: col.label }),\n onClick: onTableCustomHeaderIconClick,\n } : undefined,\n headerName: col.code,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible,\n renderCell,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 250,\n } satisfies TableColumn<CaseDbCaseUploadResult>);\n }\n });\n\n if (caseUploadResults.some(vc => vc.id)) {\n tableCols.push({\n headerName: t('case_id'),\n hideInFilter: true,\n id: 'case_id',\n isInitiallyVisible: true,\n type: 'text',\n valueGetter: (params) => params.row.id || '',\n widthPx: 250,\n } satisfies TableColumn<CaseDbCaseUploadResult>);\n }\n\n tableCols.push(TableUtil.createActionsColumn({\n getActions: (params: TableRowParams<CaseDbCaseUploadResult>) => {\n const actions: ReactElement[] = [];\n actions.push(\n <MenuItem\n key={'editCase'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n caseFormDialogRef.current?.open({\n caseContent: params.row.validated_content,\n caseId: params.row.id,\n completeCaseType,\n enabledColIds: completeCaseType.ordered_col_ids,\n formId: `edit-case-form`,\n });\n }}\n >\n <ListItemIcon>\n <EditIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Edit`}\n </ListItemText>\n </MenuItem>,\n );\n return actions;\n },\n t,\n }));\n return tableCols;\n }, [caseUploadResults, renderHasIssueCell, renderHasIssueHeader, renderIsNewCell, renderIsNewHeader, completeCaseType, t, caseRightsColMap, onTableCustomHeaderIconClick, renderCell, getOriginalCellValue]);\n\n useInitializeTableStore<CaseDbCaseUploadResult>({ columns: tableColumns, createFiltersFromColumns: true, rows: caseUploadResults, store: tableStore });\n\n return (\n <>\n <Box>\n <TableMenu\n ContainerProps={{\n sx: {\n display: 'inline-block',\n float: 'right',\n },\n }}\n />\n </Box>\n <Table\n font={theme['gen-epix-ui-client-casedb'].lineList.font}\n />\n <CaseContentFormDialog\n onSubmit={onCaseContentFormDialogSubmit}\n ref={caseFormDialogRef}\n />\n <UploadEditColumnValuesDialog\n onSubmit={onEpiUploadEditColumnValuesDialogSubmit}\n ref={uploadEditColumnValuesDialogRef}\n />\n </>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { use } from 'react';\nimport { useTableStoreContext } from '@gen-epix/ui-client-common/stores/tableStore';\nimport type { CaseDbCaseUploadResult } from '@gen-epix/api-casedb';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\n\nimport { UploadNavigation } from './UploadNavigation';\n\nexport type UploadPreviewNavigationProps = {\n readonly onGoBackButtonClick: () => void;\n readonly onProceedButtonClick: () => void;\n};\n\nexport const UploadPreviewNavigation = ({ onGoBackButtonClick, onProceedButtonClick }: UploadPreviewNavigationProps) => {\n const { t } = useTranslation();\n const tableStore = useTableStoreContext<CaseDbCaseUploadResult>();\n const uploadStore = use(UploadStoreContext);\n\n const completeCaseType = useStore(uploadStore, (state) => state.completeCaseType);\n const selectedIds = useStore(tableStore, (state) => state.selectedIds);\n\n const proceedDisabled = !selectedIds.length || selectedIds.length > completeCaseType.props.create_max_n_cases;\n\n return (\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n proceedDisabled={proceedDisabled}\n proceedLabel={selectedIds.length ? t('Proceed with {{count}} selected cases', { count: selectedIds.length }) : t('Proceed')}\n />\n );\n};\n","import {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand';\nimport {\n Alert,\n AlertTitle,\n Box,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport { useShallow } from 'zustand/shallow';\nimport type {\n CaseDbCase,\n CaseDbCaseDataIssue,\n CaseDbCaseUploadResult,\n CaseDbCol,\n CaseDbUploadCasesCommand,\n} from '@gen-epix/api-casedb';\nimport {\n CaseDbCaseApi,\n CaseDbDataIssueType,\n CaseDbEtlStatus,\n CaseDbUploadAction,\n} from '@gen-epix/api-casedb';\nimport type { ConfirmationRefMethods } from '@gen-epix/ui-core-components/components/Confirmation';\nimport type { TableRowAndColumnParams } from '@gen-epix/ui-client-common/models/table';\nimport { BackdropSpinner } from '@gen-epix/ui-core-components/components/BackdropSpinner';\nimport { Confirmation } from '@gen-epix/ui-core-components/components/Confirmation';\nimport {\n createTableStore,\n TableStoreContextProvider,\n} from '@gen-epix/ui-client-common/stores/tableStore';\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 { ObjectUtil } from '@gen-epix/ui-core/utils/ObjectUtil';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { withEpiCompleteCaseTypeLoader } from '../CompletCaseTypeLoader/withEpiCompleteCaseTypeLoader';\nimport { CaseUtil } from '../../../utils/CaseUtil';\n\nimport { UploadCaseResultTable } from './UploadCaseResultTable';\nimport { UploadPreviewNavigation } from './UploadPreviewNavigation';\n\nexport type UploadPreviewProps = {\n readonly caseTypeId: string;\n};\n\nexport const UploadPreview = withEpiCompleteCaseTypeLoader<UploadPreviewProps>(({ caseTypeId }) => {\n const { t } = useTranslation();\n\n const store = use(UploadStoreContext);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const casesForVerificationFromSourceData = useStore(store, (state) => state.casesForVerificationFromSourceData);\n const createdInDataCollectionId = useStore(store, (state) => state.createdInDataCollectionId);\n const validateCasesQueryKey = useStore(store, (state) => state.validateCasesQueryKey);\n const caseRightsColMap = useStore(store, (state) => state.caseRightsColMap);\n const [exceedsMaxNumCases, setExceedsMaxNumCases] = useState(false);\n const [isRevalidatingCases, setIsRevalidatingCases] = useState(false);\n const [revalidationError, setRevalidationError] = useState<Error | null>(null);\n const selectedIdsRef = useRef<string[]>([]);\n const continueWithoutFixingConfirmationRef = useRef<ConfirmationRefMethods>(null);\n const continueWithoutSelectingAllCasesRef = useRef<ConfirmationRefMethods>(null);\n\n const getOriginalCellValue = useCallback((col: CaseDbCol, params: TableRowAndColumnParams<CaseDbCaseUploadResult, null>, _issue: CaseDbCaseDataIssue): string => {\n return casesForVerificationFromSourceData[params.rowIndex]?.case?.content[col.id] ?? '';\n }, [casesForVerificationFromSourceData]);\n\n const caseUploadValidationResultQuery = useQueryMemo({\n enabled: casesForVerificationFromSourceData.length > 0,\n gcTime: Infinity,\n queryFn: async ({ signal }) => {\n const response = (await CaseDbCaseApi.getInstance().uploadCases(ObjectUtil.deepNullifyEmptyStrings<CaseDbUploadCasesCommand>({\n case_batch: {\n cases: casesForVerificationFromSourceData,\n },\n case_type_id: caseTypeId,\n default_created_in_data_collection_id: createdInDataCollectionId ?? undefined,\n on_exists: CaseDbUploadAction.UPDATE,\n verify_only: true,\n }), { signal })).data;\n return response;\n },\n queryKey: validateCasesQueryKey,\n select: (data) => data.cases.map((caseUploadResult, index) => ({\n ...caseUploadResult,\n id: casesForVerificationFromSourceData[index].id,\n })),\n staleTime: Infinity,\n });\n\n\n const loadables = useArray([\n caseUploadValidationResultQuery,\n ]);\n\n const tableStore = useMemo(() => createTableStore<CaseDbCaseUploadResult>({\n idSelectorCallback: (row) => row.id,\n }), []);\n const setSelectedIds = useStore(tableStore, useShallow((state) => state.setSelectedIds));\n\n const revalidateCases = useCallback(async (casesToValidate: Array<{ content: CaseDbCase['content']; row: CaseDbCaseUploadResult }>) => {\n setIsRevalidatingCases(true);\n try {\n const batchValidationResult = (await CaseDbCaseApi.getInstance().uploadCases(ObjectUtil.deepNullifyEmptyStrings<CaseDbUploadCasesCommand>({\n case_batch: {\n cases: casesToValidate.map(({ content, row }, index) => {\n const caseFromSourceData = casesForVerificationFromSourceData.find(c => c.id === row.id);\n return {\n case: {\n case_type_id: completeCaseType.id,\n content: Object.fromEntries(\n Object.entries(content).map(([colId]) => {\n const col = completeCaseType.cols[colId];\n if (!col) {\n return [colId, content[colId]];\n }\n const rowValue = CaseUtil.getRowValue(content, col, completeCaseType);\n return [colId, rowValue.isMissing ? '' : rowValue.long];\n }),\n ),\n created_in_data_collection_id: caseFromSourceData?.case?.created_in_data_collection_id ?? createdInDataCollectionId,\n id: row.id ?? casesForVerificationFromSourceData[index].id,\n },\n };\n }),\n },\n case_type_id: caseTypeId,\n default_created_in_data_collection_id: createdInDataCollectionId ?? undefined,\n on_exists: CaseDbUploadAction.UPDATE,\n verify_only: true,\n }))).data;\n\n const resultById = new Map(\n casesToValidate.map(({ row }, index) => [row.id, batchValidationResult.cases[index]]),\n );\n\n QueryClientService.getInstance().queryClient.setQueryData(validateCasesQueryKey, {\n cases: caseUploadValidationResultQuery.data.map(row => {\n const newResult = resultById.get(row.id);\n if (newResult) {\n return { ...newResult, id: row.id };\n }\n return row;\n }),\n });\n\n const newlyFailedIds: string[] = [];\n casesToValidate.forEach(({ row }, index) => {\n const newResult = batchValidationResult.cases[index];\n if (newResult.status !== CaseDbEtlStatus.SKIPPED && newResult.status !== CaseDbEtlStatus.SUCCESS && newResult.status !== CaseDbEtlStatus.UPDATED) {\n if (!selectedIdsRef.current.includes(row.id)) {\n selectedIdsRef.current.push(row.id);\n newlyFailedIds.push(row.id);\n }\n }\n });\n\n if (newlyFailedIds.length > 0) {\n const currentSelectedIds = tableStore.getState().selectedIds;\n const idsToAdd = newlyFailedIds.filter(id => !currentSelectedIds.includes(id));\n if (idsToAdd.length > 0) {\n setSelectedIds([...currentSelectedIds, ...idsToAdd]);\n }\n }\n } catch (error) {\n setRevalidationError(error as Error);\n } finally {\n setIsRevalidatingCases(false);\n }\n\n }, [caseTypeId, caseUploadValidationResultQuery.data, casesForVerificationFromSourceData, completeCaseType, createdInDataCollectionId, setSelectedIds, tableStore, validateCasesQueryKey]);\n\n const onColContentEditSubmit = useCallback(async (contentPerCaseId: { [caseId: string]: CaseDbCase['content'] }) => {\n const selectedIds = tableStore.getState().selectedIds;\n await revalidateCases(\n caseUploadValidationResultQuery.data\n .filter(row => selectedIds.includes(row.id))\n .map(row => ({\n content: { ...row.validated_content, ...contentPerCaseId[row.id] },\n row,\n })),\n );\n }, [caseUploadValidationResultQuery.data, revalidateCases, tableStore]);\n\n const onCaseContentEditSubmit = useCallback(async (caseId: string, content: CaseDbCase['content']) => {\n const originalCaseUploadResult = caseUploadValidationResultQuery.data.find(r => r.id === caseId);\n await revalidateCases([{ content, row: originalCaseUploadResult }]);\n }, [caseUploadValidationResultQuery.data, revalidateCases]);\n\n useEffect(() => {\n const unsubscribe = tableStore.subscribe((state, prevState) => {\n if (state.selectedIds === prevState.selectedIds) {\n return;\n }\n selectedIdsRef.current = state.selectedIds;\n const newExceedsMaxNumCases = state.selectedIds.length > completeCaseType.props.create_max_n_cases;\n setExceedsMaxNumCases(newExceedsMaxNumCases);\n });\n\n return () => {\n unsubscribe();\n };\n }, [completeCaseType.props.create_max_n_cases, tableStore]);\n\n useEffect(() => {\n const newSelectedIds = (caseUploadValidationResultQuery.data ?? []).filter(validatedCase => {\n return !validatedCase.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID || issue.data_issue_type === CaseDbDataIssueType.UNAUTHORIZED);\n }).map(vc => vc.id);\n setSelectedIds(newSelectedIds);\n }, [caseUploadValidationResultQuery.data, setSelectedIds]);\n\n\n const onProceedWithoutFixingIssues = useCallback(async () => {\n const selectedIds = tableStore.getState().selectedIds;\n const validCases = caseUploadValidationResultQuery.data.filter(row => selectedIds.includes(row.id) && !row.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID));\n store.setState((state) => ({\n ...state,\n selectedIdsForUpload: validCases.map(c => c.id),\n validatedCases: caseUploadValidationResultQuery.data,\n }));\n await goToNextStep();\n }, [caseUploadValidationResultQuery.data, goToNextStep, store, tableStore]);\n\n const onProceed = useCallback(async () => {\n store.setState((state) => ({\n ...state,\n selectedIdsForUpload: selectedIdsRef.current,\n validatedCases: caseUploadValidationResultQuery.data,\n }));\n\n await goToNextStep();\n }, [goToNextStep, caseUploadValidationResultQuery.data, store]);\n\n const onProceedButtonClick = useCallback(async () => {\n if (caseUploadValidationResultQuery.data.some(row => tableStore.getState().selectedIds.includes(row.id) && (row.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID) || row.status === CaseDbEtlStatus.FAILED))) {\n continueWithoutFixingConfirmationRef.current?.open();\n return;\n }\n\n if (caseUploadValidationResultQuery.data.some(row => !tableStore.getState().selectedIds.includes(row.id) && !row.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID))) {\n continueWithoutSelectingAllCasesRef.current?.open();\n return;\n }\n\n await onProceed();\n }, [caseUploadValidationResultQuery.data, onProceed, tableStore]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: `${exceedsMaxNumCases ? 'max-content' : ''} max-content auto max-content`,\n height: '100%',\n position: 'relative',\n width: '100%',\n }}\n >\n <TableStoreContextProvider store={tableStore}>\n <ResponseHandler\n error={revalidationError}\n inlineSpinner\n loadables={loadables}\n loadingMessage={t('Validating cases')}\n takingLongerTimeoutMs={10000}\n >\n {exceedsMaxNumCases && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'error'}>\n <AlertTitle>\n {t('You have exceeded the maximum number of {{maxCases}} cases for this case type. Please reduce the number of selected cases before proceeding.', {\n maxCases: completeCaseType.props.create_max_n_cases,\n })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n <UploadCaseResultTable\n caseRightsColMap={caseRightsColMap}\n caseUploadResults={caseUploadValidationResultQuery.data || []}\n completeCaseType={completeCaseType}\n getOriginalCellValue={getOriginalCellValue}\n onCaseContentEditSubmit={onCaseContentEditSubmit}\n onColContentEditSubmit={onColContentEditSubmit}\n tableStore={tableStore}\n />\n <UploadPreviewNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n />\n </ResponseHandler>\n </TableStoreContextProvider>\n <BackdropSpinner\n label={t('Revalidating cases')}\n open={isRevalidatingCases}\n />\n <Confirmation\n body={t`Some of the selected cases contain issues. If you proceed, these cases will be excluded. Are you sure you want to proceed without them?`}\n cancelLabel={t`Cancel`}\n confirmLabel={t`Proceed`}\n onConfirm={onProceedWithoutFixingIssues}\n ref={continueWithoutFixingConfirmationRef}\n title={t`Issues found with selected cases`}\n />\n <Confirmation\n body={t`Not all cases are selected. Do you want to proceed without them?`}\n cancelLabel={t`Cancel`}\n confirmLabel={t`Proceed`}\n onConfirm={onProceed}\n ref={continueWithoutSelectingAllCasesRef}\n title={t`Not all cases are selected.`}\n />\n </Box>\n );\n});\n","import { useTranslation } from 'react-i18next';\nimport type { ReactNode } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Alert,\n AlertTitle,\n Box,\n Button,\n Container,\n} from '@mui/material';\nimport { useStore } from 'zustand';\nimport { GenericErrorMessage } from '@gen-epix/ui-client-common/components/ui/GenericErrorMessage';\nimport { InactivityService } from '@gen-epix/ui-client-common/classes/services/InactivityService';\nimport { LinearProgressWithLabel } from '@gen-epix/ui-core-components/components/LinearProgressWithLabel';\nimport { RouterService } from '@gen-epix/ui-client-common/classes/services/RouterService';\n\nimport { CaseTypeUtil } from '../../../utils/CaseTypeUtil';\nimport { UploadError } from '../../../classes/errors';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UploadUtil } from '../../../utils/UploadUtil';\n\nimport { UploadNavigation } from './UploadNavigation';\n\n\nexport const UploadCreateCases = () => {\n const { t } = useTranslation();\n\n const store = use(UploadStoreContext);\n const reset = useStore(store, (state) => state.reset);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const sequenceMapping = useStore(store, (state) => state.sequenceMapping);\n const sequenceFilesDataTransfer = useStore(store, (state) => state.sequenceFilesDataTransfer);\n const validatedCases = useStore(store, (state) => state.validatedCases);\n const selectedIdsForUpload = useStore(store, (state) => state.selectedIdsForUpload);\n const casesForVerificationFromSourceData = useStore(store, (state) => state.casesForVerificationFromSourceData);\n const uploadCompleteButtonCallback = useStore(store, (state) => state.uploadCompleteButtonCallback);\n const uploadCompleteButtonLabel = useStore(store, (state) => state.uploadCompleteButtonLabel);\n const onUploadComplete = useStore(store, (state) => state.onUploadComplete);\n\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const [progress, setProgress] = useState(0);\n const [progressMessage, setProgressMessage] = useState('');\n\n const [isUploadStarted, setIsUploadStarted] = useState(false);\n const [isUploadCompleted, setIsUploadCompleted] = useState(false);\n const [error, setError] = useState<unknown>(undefined);\n\n const sequenceFileStats = useMemo(() => {\n return UploadUtil.getSequenceMappingStats(sequenceMapping, sequenceFilesDataTransfer);\n }, [sequenceFilesDataTransfer, sequenceMapping]);\n\n const selectedValidatedCases = useMemo(() => {\n return validatedCases.filter(vc => selectedIdsForUpload.includes(vc.id));\n }, [validatedCases, selectedIdsForUpload]);\n\n useEffect(() => {\n const abortController = new AbortController();\n const { signal } = abortController;\n\n const abort = () => {\n abortController.abort();\n InactivityService.getInstance().resume();\n };\n\n if (!isUploadStarted) {\n return abort;\n }\n InactivityService.getInstance().pause();\n\n const perform = async () => {\n const result = await UploadUtil.createCasesAndUploadFiles({\n assemblyProtocolId: store.getState().assemblyProtocolId,\n casesForVerificationFromSourceData,\n completeCaseType: store.getState().completeCaseType,\n createdInDataCollectionId: store.getState().createdInDataCollectionId,\n mappedColumns: store.getState().mappedColumns,\n onComplete: () => {\n setIsUploadCompleted(true);\n },\n onError: (e: Error) => {\n setError(e);\n },\n onProgress: (percentage: number, message: string) => {\n setProgress(percentage);\n setProgressMessage(message);\n },\n sampleIdColId: store.getState().sampleIdColId,\n selectedValidatedCases,\n sequenceFilesDataTransfer,\n sequenceMapping,\n sequencingProtocolId: store.getState().sequencingProtocolId,\n signal,\n });\n if (onUploadComplete) {\n await onUploadComplete(result);\n }\n };\n\n perform().catch((e) => {\n if (!signal.aborted) {\n setError(e);\n }\n });\n\n\n return abort;\n }, [isUploadStarted, sequenceFilesDataTransfer, sequenceMapping, store, t, selectedValidatedCases, casesForVerificationFromSourceData, onUploadComplete]);\n\n\n const onStartOverButtonClick = useCallback(async () => {\n await reset();\n }, [reset]);\n\n const onStartUploadButtonClick = useCallback(() => {\n setIsUploadStarted(true);\n }, []);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n const onGotoCasesButtonClick = useCallback(async () => {\n const link = CaseTypeUtil.createCaseTypeLink(completeCaseType);\n await RouterService.getInstance().router.navigate(link);\n }, [completeCaseType]);\n\n let content: ReactNode;\n\n if (error) {\n content = (\n <Box>\n {error instanceof UploadError && (\n <Alert severity={'error'}>\n <AlertTitle>\n {t('Failed to create cases during upload.')}\n </AlertTitle>\n {t('An error occurred while creating cases. Please try again or contact support if the issue persists. Cases may have been partially created. No files were uploaded.')}\n </Alert>\n )}\n <GenericErrorMessage error={error} />\n </Box>\n );\n } else if (isUploadCompleted) {\n content = (\n <Box>\n <Box>\n <Alert severity={'success'}>\n <AlertTitle>\n {t('Upload completed.')}\n </AlertTitle>\n </Alert>\n </Box>\n <Box\n sx={{\n display: 'flex',\n gap: 2,\n justifyContent: 'flex-end',\n marginBottom: 1,\n marginTop: 2,\n }}\n >\n {uploadCompleteButtonCallback && uploadCompleteButtonLabel ? (\n <Button\n // eslint-disable-next-line @eslint-react/kit/jsx-handler-names\n onClick={uploadCompleteButtonCallback}\n variant={'contained'}\n >\n {uploadCompleteButtonLabel}\n </Button>\n ) : (\n <>\n <Button\n onClick={onStartOverButtonClick}\n variant={'outlined'}\n >\n {t('Upload more cases')}\n </Button>\n <Button\n onClick={onGotoCasesButtonClick}\n variant={'contained'}\n >\n {t('View uploaded cases')}\n </Button>\n </>\n )}\n </Box>\n </Box>\n );\n } else if (isUploadStarted) {\n content = (\n <Box>\n <Box\n sx={{\n marginBottom: 4,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('Uploading cases and files.')}\n </AlertTitle>\n {t('Please wait while the cases and associated files are being uploaded. This may take a while depending on the number and size of the files being uploaded.')}\n </Alert>\n </Box>\n <Box\n sx={{\n marginBottom: 2,\n marginTop: 4,\n }}\n >\n <LinearProgressWithLabel value={progress} />\n </Box>\n <Box\n sx={{\n fontWeight: 700,\n }}\n >\n {progressMessage}\n </Box>\n </Box>\n );\n } else {\n content = (\n <Box>\n <Box>\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('{{numCases}} cases are ready to be uploaded.', { numCases: selectedValidatedCases.length })}\n </AlertTitle>\n </Alert>\n </Box>\n {sequenceFileStats.mappedSequenceFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('{{numSequenceFiles}} genome files are ready to be uploaded.', { numSequenceFiles: sequenceFileStats.mappedSequenceFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {sequenceFileStats.mappedReadsFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('{{numReadsFiles}} reads files are ready to be uploaded.', { numReadsFiles: sequenceFileStats.mappedReadsFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {validatedCases.length - selectedValidatedCases.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'warning'}>\n <AlertTitle>\n {t('{{numCases}} cases were not selected and will not be uploaded.', { numCases: validatedCases.length - selectedValidatedCases.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {sequenceFileStats.unmappedSequenceFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'warning'}>\n <AlertTitle>\n {t('{{unmappedSequenceFiles}} unmapped genome files will not be uploaded.', { unmappedSequenceFiles: sequenceFileStats.unmappedSequenceFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {sequenceFileStats.unmappedReadsFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'warning'}>\n <AlertTitle>\n {t('{{unmappedReadsFiles}} unmapped reads files will not be uploaded.', { unmappedReadsFiles: sequenceFileStats.unmappedReadsFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n </Box>\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onStartUploadButtonClick}\n proceedLabel={'Start upload'}\n />\n </Box>\n );\n }\n\n return (\n <Container\n maxWidth={'xl'}\n sx={{\n height: '100%',\n }}\n >\n {content}\n </Container>\n );\n};\n","import {\n Alert,\n AlertTitle,\n Box,\n useTheme,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport {\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 { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type {\n FormFieldDefinition,\n SelectOption,\n} from '@gen-epix/ui-core-form/models/form';\nimport { FORM_FIELD_DEFINITION_TYPE } from '@gen-epix/ui-core-form/models/form';\nimport { MultiFileUploader } from '@gen-epix/ui-core-components/components/MultiFileUploader';\n\nimport { UploadUtil } from '../../../utils/UploadUtil';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { useSequencingProtocolOptionsQuery } from '../../../dataHooks/useSequencingProtocolsQuery';\nimport { useAssemblyProtocolOptionsQuery } from '../../../dataHooks/useAssemblyProtocolsQuery';\n\nimport { UploadNavigation } from './UploadNavigation';\n\n\ntype FormFields = {\n assemblyProtocolId: string;\n sampleIdColId: string;\n sequencingProtocolId: string;\n};\n\nconst getSelectedFiles = (dataTransfer?: DataTransfer) => {\n return Array.from(dataTransfer?.files ?? []);\n};\n\nconst createSchema = ({\n hasGenomeFiles,\n hasReadsFiles,\n hasSelectedFiles,\n}: {\n hasGenomeFiles: boolean;\n hasReadsFiles: boolean;\n hasSelectedFiles: boolean;\n}) => {\n return object<FormFields>().shape({\n assemblyProtocolId: hasGenomeFiles ? string().uuid4().required() : string().nullable().notRequired(),\n sampleIdColId: hasSelectedFiles ? string().uuid4().required() : string().nullable().notRequired(),\n sequencingProtocolId: hasReadsFiles ? string().uuid4().required() : string().nullable().notRequired(),\n });\n};\n\nexport const UploadSelectSequenceFiles = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n\n const store = use(UploadStoreContext);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const mappedColumns = useStore(store, (state) => state.mappedColumns);\n const validatedCases = useStore(store, (state) => state.validatedCases);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const setSequenceFilesDataTransfer = useStore(store, (state) => state.setSequenceFilesDataTransfer);\n const sampleIdColId = useStore(store, (state) => state.sampleIdColId);\n const initialDataTransfer = useStore(store, (state) => state.sequenceFilesDataTransfer);\n const [currentDataTransfer, setCurrentDataTransfer] = useState(initialDataTransfer);\n\n const formId = useId();\n\n const sequencingProtocolOptionsQuery = useSequencingProtocolOptionsQuery();\n const assemblyProtocolOptionsQuery = useAssemblyProtocolOptionsQuery();\n\n const loadables = useArray([\n sequencingProtocolOptionsQuery,\n assemblyProtocolOptionsQuery,\n ]);\n\n const sampleIdColIdOptions = useMemo<SelectOption<string>[]>(() => {\n return mappedColumns.filter(mc => mc.isSampleIdColumn).map(mc => ({\n label: mc.col.label,\n value: mc.col.id,\n } satisfies SelectOption<string>));\n }, [mappedColumns]);\n\n const selectedFiles = useMemo(() => {\n return getSelectedFiles(currentDataTransfer);\n }, [currentDataTransfer]);\n\n const hasSelectedFiles = selectedFiles.length > 0;\n const hasGenomeFiles = useMemo(() => {\n return selectedFiles.some(file => UploadUtil.isGenomeFile(file.name));\n }, [selectedFiles]);\n const hasReadsFiles = useMemo(() => {\n return selectedFiles.some(file => UploadUtil.isReadsFile(file.name));\n }, [selectedFiles]);\n\n const schema = useMemo(() => {\n return createSchema({\n hasGenomeFiles,\n hasReadsFiles,\n hasSelectedFiles,\n });\n }, [hasGenomeFiles, hasReadsFiles, hasSelectedFiles]);\n\n const defaultFormValues = useMemo<FormFields>(() => {\n return {\n assemblyProtocolId: store.getState().assemblyProtocolId ?? null,\n sampleIdColId: store.getState().sampleIdColId ?? null,\n sequencingProtocolId: store.getState().sequencingProtocolId ?? null,\n };\n }, [store]);\n\n const formMethods = useForm<FormFields>({\n defaultValues: defaultFormValues,\n resolver: yupResolver(schema) as unknown as Resolver<FormFields>,\n values: defaultFormValues,\n });\n const { handleSubmit, setValue } = formMethods;\n\n useEffect(() => {\n if (sequencingProtocolOptionsQuery.isLoading || assemblyProtocolOptionsQuery.isLoading) {\n return;\n }\n if (!store.getState().sequencingProtocolId) {\n setValue('sequencingProtocolId', sequencingProtocolOptionsQuery.options[0]?.value || null);\n store.setState({ sequencingProtocolId: sequencingProtocolOptionsQuery.options[0]?.value || null });\n }\n if (!store.getState().assemblyProtocolId) {\n setValue('assemblyProtocolId', assemblyProtocolOptionsQuery.options[0]?.value || null);\n store.setState({ assemblyProtocolId: assemblyProtocolOptionsQuery.options[0]?.value || null });\n }\n if (!store.getState().sampleIdColId) {\n setValue('sampleIdColId', sampleIdColIdOptions[0]?.value || null);\n store.setState({ sampleIdColId: sampleIdColIdOptions[0]?.value || null });\n }\n }, [assemblyProtocolOptionsQuery.isLoading, assemblyProtocolOptionsQuery.options, sequencingProtocolOptionsQuery.isLoading, sequencingProtocolOptionsQuery.options, setValue, store, sampleIdColIdOptions]);\n\n const onSequencingProtocolChange = useCallback((value: string) => {\n store.setState({ sequencingProtocolId: value });\n }, [store]);\n\n const onAssemblyProtocolChange = useCallback((value: string) => {\n store.setState({ assemblyProtocolId: value });\n }, [store]);\n\n const onSampleIdColIdChange = useCallback((value: string) => {\n store.setState({ sampleIdColId: value });\n }, [store]);\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => {\n return [\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Genome files: assembly protocol`,\n loading: assemblyProtocolOptionsQuery.isLoading,\n name: 'assemblyProtocolId',\n onChange: onAssemblyProtocolChange,\n options: assemblyProtocolOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Reads files: sequencing protocol`,\n loading: sequencingProtocolOptionsQuery.isLoading,\n name: 'sequencingProtocolId',\n onChange: onSequencingProtocolChange,\n options: sequencingProtocolOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Sample ID column`,\n name: 'sampleIdColId',\n onChange: onSampleIdColIdChange,\n options: sampleIdColIdOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n ];\n }, [assemblyProtocolOptionsQuery.isLoading, assemblyProtocolOptionsQuery.options, onAssemblyProtocolChange, onSampleIdColIdChange, onSequencingProtocolChange, sampleIdColIdOptions, sequencingProtocolOptionsQuery.isLoading, sequencingProtocolOptionsQuery.options, t]);\n\n\n const hasWritableSampleIdColumn = useMemo(() => {\n return mappedColumns.some(mappedColumn => {\n return mappedColumn.isSampleIdColumn && mappedColumn.sampleIdentifierIssuerId;\n });\n }, [mappedColumns]);\n\n const hasRowContentForSampleIdColId = useMemo(() => {\n if (!sampleIdColId) {\n return false;\n }\n return validatedCases.some(vc => {\n return vc.validated_content[sampleIdColId]?.trim().length > 0;\n });\n }, [sampleIdColId, validatedCases]);\n\n const completeCaseTypeColStats = useMemo(() => {\n return UploadUtil.getCompleteCaseTypeColStats(completeCaseType);\n }, [completeCaseType]);\n\n const canUploadSequences = useMemo(() => {\n return completeCaseTypeColStats.sequenceColumns.length > 0;\n }, [completeCaseTypeColStats]);\n\n const canUploadReads = useMemo(() => {\n return completeCaseTypeColStats.readsColumns.length > 0;\n }, [completeCaseTypeColStats]);\n\n const canUpload = useMemo(() => {\n return hasWritableSampleIdColumn && hasRowContentForSampleIdColId && (canUploadSequences || canUploadReads);\n }, [hasWritableSampleIdColumn, hasRowContentForSampleIdColId, canUploadSequences, canUploadReads]);\n\n const accept = useMemo(() => {\n let acc = '';\n if (canUploadSequences) {\n acc += '.fa,.fasta,.fa.gz,.fasta.gz,';\n }\n if (canUploadReads) {\n acc += '.fq,.fastq,.fq.gz,.fastq.gz,';\n }\n return acc;\n }, [canUploadReads, canUploadSequences]);\n\n const onProceedButtonClick = useCallback(async () => {\n setSequenceFilesDataTransfer(canUpload ? currentDataTransfer : new DataTransfer());\n await handleSubmit(async () => {\n await goToNextStep();\n })();\n }, [canUpload, currentDataTransfer, goToNextStep, handleSubmit, setSequenceFilesDataTransfer]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n const onDataTransferChange = useCallback((dt: DataTransfer) => {\n setCurrentDataTransfer(dt);\n setSequenceFilesDataTransfer(dt);\n }, [setSequenceFilesDataTransfer]);\n\n const wrapForm = useCallback((children: ReactElement) => {\n return (\n <Box\n sx={{\n display: 'grid',\n gap: theme.spacing(1),\n gridTemplateColumns: '1fr 1fr 1fr',\n }}\n >\n {children}\n </Box>\n );\n }, [theme]);\n\n const cantUploadMessage = useMemo<{ message: string; title: string }>(() => {\n if (!hasWritableSampleIdColumn) {\n return {\n message: t`No columns have been mapped as writable sample ID column with selected identifier issuer provider.`,\n title: t('Uploading of files is disabled.'),\n };\n }\n if (!hasRowContentForSampleIdColId) {\n return {\n message: t`No rows have a sample ID filled for the selected sample ID column.`,\n title: t('Uploading of files is disabled.'),\n };\n }\n if (!canUploadReads) {\n return {\n message: t`The selected case type does not support uploading read files.`,\n title: t('Uploading of read files is disabled.'),\n };\n }\n if (!canUploadSequences) {\n return {\n message: t`The selected case type does not support uploading sequence files.`,\n title: t('Uploading of sequence files is disabled.'),\n };\n }\n return null;\n }, [canUploadReads, canUploadSequences, hasRowContentForSampleIdColId, hasWritableSampleIdColumn, t]);\n\n const onSubmit = useCallback(() => {\n // noop, as we handle form submission manually in onProceedButtonClick\n }, []);\n\n return (\n <ResponseHandler\n loadables={loadables}\n >\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: `${canUpload ? '' : 'max-content '}max-content auto max-content`,\n height: '100%',\n position: 'relative',\n }}\n >\n {!canUpload && (\n <Box\n sx={{\n marginBottom: 2,\n }}\n >\n <Alert severity={'error'}>\n <AlertTitle>\n {cantUploadMessage.title}\n </AlertTitle>\n {cantUploadMessage.message}\n </Alert>\n </Box>\n )}\n <Box\n sx={{\n borderBottom: `1px solid ${theme.palette.divider}`,\n }}\n >\n <Box\n sx={{\n maxWidth: theme.spacing(128),\n }}\n >\n <GenericForm<FormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={onSubmit}\n schema={schema}\n wrapForm={wrapForm}\n />\n </Box>\n {!canUploadSequences && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('Uploading of sequences has been disabled.')}\n </AlertTitle>\n <Box>\n {t('Uploading of sequences is not supported for the selected case type.')}\n </Box>\n </Alert>\n </Box>\n )}\n {!canUploadReads && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('Uploading of read files has been disabled.')}\n </AlertTitle>\n <Box>\n {t('Uploading of read files is not supported for the selected case type.')}\n </Box>\n </Alert>\n </Box>\n )}\n </Box>\n <Box\n sx={{\n position: 'relative',\n }}\n >\n\n <Box\n sx={{\n bottom: 0,\n height: '100%',\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n {canUpload && (\n <MultiFileUploader\n accept={accept}\n initialDataTransfer={initialDataTransfer}\n numFilesAllowed={Infinity}\n onDataTransferChange={onDataTransferChange}\n />\n )}\n </Box>\n </Box>\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n proceedLabel={!canUpload ? t`Proceed` : undefined}\n />\n </Box>\n </ResponseHandler>\n );\n};\n","import {\n Alert,\n AlertTitle,\n Autocomplete,\n Box,\n TextField,\n useTheme,\n} from '@mui/material';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/react/shallow';\nimport type {\n CaseDbCaseUploadResult,\n CaseDbCol,\n} from '@gen-epix/api-casedb';\nimport type {\n TableColumn,\n TableRowParams,\n} from '@gen-epix/ui-client-common/models/table';\nimport {\n createTableStore,\n TableStoreContextProvider,\n} from '@gen-epix/ui-client-common/stores/tableStore';\nimport { Table } from '@gen-epix/ui-client-common/components/ui/Table';\nimport { TableUtil } from '@gen-epix/ui-client-common/utils/TableUtil';\nimport { useInitializeTableStore } from '@gen-epix/ui-client-common/hooks/useInitializeTableStore';\n\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UploadUtil } from '../../../utils/UploadUtil';\n\nimport { UploadNavigation } from './UploadNavigation';\n\nexport const UploadMapSequences = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n\n const store = use(UploadStoreContext);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const sampleIdColId = useStore(store, (state) => state.sampleIdColId);\n const sequenceFilesDataTransfer = useStore(store, (state) => state.sequenceFilesDataTransfer);\n const selectedValidatedCases = useStore(store, useShallow((state) => {\n const selectedIdsForUpload = state.selectedIdsForUpload;\n return state.validatedCases.filter(vc => selectedIdsForUpload.includes(vc.id));\n }));\n const setSequenceMapping = useStore(store, (state) => state.setSequenceMapping);\n\n const completeCaseTypeColStats = useMemo(() => {\n return UploadUtil.getCompleteCaseTypeColStats(completeCaseType);\n }, [completeCaseType]);\n\n const alertTitleId = useId();\n const alertContentId = useId();\n\n const uploadSequenceMappingRef = useRef(store.getState().sequenceMapping);\n\n const onProceedButtonClick = useCallback(async () => {\n setSequenceMapping(uploadSequenceMappingRef.current);\n await goToNextStep();\n }, [setSequenceMapping, goToNextStep]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n const updateAlert = useCallback(() => {\n // Note: This is done via DOM manipulation to prevent excessive re-renders of the entire table\n\n const alertTitleElement = document.getElementById(alertTitleId);\n const alertContentElement = document.getElementById(alertContentId);\n if (!alertTitleElement || !alertContentElement) {\n return;\n }\n const {\n mappedFiles,\n numberOfFilesToMap,\n unmappedFileNames,\n } = UploadUtil.getSequenceMappingStats(uploadSequenceMappingRef.current, sequenceFilesDataTransfer);\n\n alertTitleElement.innerHTML = numberOfFilesToMap === mappedFiles.length ? t('All {{numberOfFilesToMap}} files are mapped', { numberOfFilesToMap }) : t('{{mappedFilesLength}} of {{numberOfFilesToMap}} files mapped', { mappedFilesLength: mappedFiles.length, numberOfFilesToMap });\n alertContentElement.innerHTML = numberOfFilesToMap === mappedFiles.length ? '' : t('Unmapped files: {{unmappedFileNames}}', { unmappedFileNames: unmappedFileNames.join(', ') });\n }, [alertContentId, alertTitleId, sequenceFilesDataTransfer, t]);\n\n useEffect(() => {\n updateAlert();\n }, [updateAlert]);\n\n const tableStore = useMemo(() => createTableStore<CaseDbCaseUploadResult>({\n idSelectorCallback: (row) => row.id,\n }), []);\n\n const caseHasColumnContent = useCallback((rows: CaseDbCaseUploadResult[], col: CaseDbCol): boolean => {\n return rows.some((row) => {\n const value = CaseUtil.getRowValue(row.validated_content, col, completeCaseType);\n return value && !value?.isMissing;\n });\n }, [completeCaseType]);\n\n const sequenceDropDownOptions = useMemo(() => {\n return Array.from(sequenceFilesDataTransfer.files).map((file) => file.name).filter(name => name.endsWith('.fasta') || name.endsWith('.fa') || name.endsWith('.fa.gz') || name.endsWith('.fasta.gz'));\n }, [sequenceFilesDataTransfer.files]);\n\n const readsDropDownOptions = useMemo(() => {\n return Array.from(sequenceFilesDataTransfer.files).map((file) => file.name).filter(name => name.endsWith('.fastq') || name.endsWith('.fq') || name.endsWith('.fq.gz') || name.endsWith('.fastaq.gz'));\n }, [sequenceFilesDataTransfer.files]);\n\n const createDropDown = useCallback((kwArgs: { dropDownOptions: string[]; dropDownValue: string; label: string; onChange: (newValue: string) => void }) => {\n const { dropDownOptions, dropDownValue, label, onChange } = kwArgs;\n\n return (\n <Autocomplete\n freeSolo\n fullWidth\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onChange={(_, newValue) => {\n onChange(newValue);\n setSequenceMapping(uploadSequenceMappingRef.current);\n updateAlert();\n }}\n options={dropDownOptions}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n renderInput={(params) => (\n <TextField\n {...params}\n label={label}\n size={'small'}\n />\n )}\n sx={{\n lineHeight: 'initial',\n }}\n value={dropDownValue}\n />\n );\n }, [setSequenceMapping, updateAlert]);\n\n const renderSequenceCell = useCallback((tableRowParams: TableRowParams<CaseDbCaseUploadResult>) => {\n const col = completeCaseType.cols[tableRowParams.id];\n\n const id = tableRowParams.row.id;\n const dropDownValue = uploadSequenceMappingRef.current?.[tableRowParams.row.id]?.sequenceFileNames[col.id] || '';\n const onChange = (newValue: string) => {\n if (!newValue) {\n delete uploadSequenceMappingRef.current?.[id]?.sequenceFileNames[col.id];\n } else {\n uploadSequenceMappingRef.current[id].sequenceFileNames[col.id] = newValue;\n }\n };\n\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n justifyContent: 'center',\n }}\n >\n {createDropDown({\n dropDownOptions: sequenceDropDownOptions,\n dropDownValue,\n label: col.label,\n onChange,\n })}\n </Box>\n );\n }, [completeCaseType, createDropDown, sequenceDropDownOptions]);\n\n\n const renderReadsCell = useCallback((tableRowParams: TableRowParams<CaseDbCaseUploadResult>) => {\n const col = completeCaseType.cols[tableRowParams.id];\n const isSequenceColumn = completeCaseTypeColStats.sequenceColumns.includes(col);\n\n const id = tableRowParams.row.id;\n const dropDownValueFwd = uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.fwd || '';\n const dropDownValueRev = uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.rev || '';\n const onChangeFwd = (newValue: string) => {\n if (!newValue) {\n\n delete uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.fwd;\n } else {\n uploadSequenceMappingRef.current[id].readsFileNames[col.id].fwd = newValue;\n }\n };\n const onChangeRev = (newValue: string) => {\n if (!newValue) {\n\n delete uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.rev;\n } else {\n uploadSequenceMappingRef.current[id].readsFileNames[col.id].rev = newValue;\n }\n };\n\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'row',\n gap: 1,\n height: '100%',\n justifyContent: 'center',\n }}\n >\n {createDropDown({\n dropDownOptions: isSequenceColumn ? sequenceDropDownOptions : readsDropDownOptions,\n dropDownValue: dropDownValueFwd,\n label: `${col.label} FWD`,\n onChange: onChangeFwd,\n })}\n {createDropDown({\n dropDownOptions: isSequenceColumn ? sequenceDropDownOptions : readsDropDownOptions,\n dropDownValue: dropDownValueRev,\n label: `${col.label} REV`,\n onChange: onChangeRev,\n })}\n </Box>\n );\n }, [completeCaseType, completeCaseTypeColStats.sequenceColumns, createDropDown, sequenceDropDownOptions, readsDropDownOptions]);\n\n\n const tableColumns = useMemo<TableColumn<CaseDbCaseUploadResult>[]>(() => {\n const tableCols: TableColumn<CaseDbCaseUploadResult>[] = [];\n tableCols.push(\n TableUtil.createReadableIndexColumn(),\n );\n\n const columnsUsedForMapping = [\n ...completeCaseTypeColStats.sampleIdColumns,\n ...completeCaseTypeColStats.sequenceColumns,\n ...completeCaseTypeColStats.readsColumns,\n ];\n\n const sampleIdCol = completeCaseTypeColStats.sampleIdColumns.find(x => x.id === sampleIdColId);\n if (sampleIdCol && caseHasColumnContent(selectedValidatedCases, sampleIdCol)) {\n tableCols.push({\n headerName: sampleIdCol.label,\n hideInFilter: true,\n id: sampleIdCol.id,\n isInitiallyVisible: true,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, sampleIdCol, completeCaseType).short,\n widthPx: 300,\n });\n }\n\n // eslint-disable-next-line react-hooks/refs\n completeCaseTypeColStats.sequenceColumns.forEach((col) => {\n tableCols.push({\n cellTitleGetter: () => null,\n headerName: col.label,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible: true,\n renderCell: renderSequenceCell,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 400,\n });\n });\n\n // eslint-disable-next-line react-hooks/refs\n completeCaseTypeColStats.readsColumns.forEach((col) => {\n tableCols.push({\n cellTitleGetter: () => null,\n headerName: col.label,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible: true,\n renderCell: renderReadsCell,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 800,\n });\n });\n\n const uniqueColIds: Set<string> = new Set();\n selectedValidatedCases.forEach((vc) => {\n Object.keys(vc.validated_content || {}).forEach((colId) => uniqueColIds.add(colId));\n });\n\n const colIdsToIgnore = [...completeCaseTypeColStats.sequenceColumns.map(x => x.id), ...completeCaseTypeColStats.readsColumns.map(x => x.id), sampleIdCol?.id];\n\n completeCaseType.ordered_col_ids.forEach((colId) => {\n if (colIdsToIgnore.includes(colId) || !uniqueColIds.has(colId) || columnsUsedForMapping.find(c => c.id === colId)) {\n return;\n }\n\n const col = completeCaseType.cols[colId];\n if (col) {\n tableCols.push({\n headerName: col.code,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible: true,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 250,\n } satisfies TableColumn<CaseDbCaseUploadResult>);\n }\n });\n\n return tableCols;\n }, [caseHasColumnContent, completeCaseType, completeCaseTypeColStats.readsColumns, completeCaseTypeColStats.sampleIdColumns, completeCaseTypeColStats.sequenceColumns, renderReadsCell, renderSequenceCell, sampleIdColId, selectedValidatedCases]);\n\n useInitializeTableStore<CaseDbCaseUploadResult>({ columns: tableColumns, createFiltersFromColumns: true, rows: selectedValidatedCases, store: tableStore });\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'max-content auto max-content',\n height: '100%',\n }}\n >\n <Box sx={{ paddingBottom: 1 }}>\n <Alert severity={'info'}>\n <AlertTitle id={alertTitleId} />\n <Box id={alertContentId} />\n </Alert>\n </Box>\n <TableStoreContextProvider store={tableStore}>\n <Table\n font={theme['gen-epix-ui-client-casedb'].lineList.font}\n rowHeight={7}\n />\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n />\n </TableStoreContextProvider>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport { useTranslation } from 'react-i18next';\nimport {\n use,\n useMemo,\n} from 'react';\nimport {\n Container,\n useTheme,\n} from '@mui/material';\nimport { useStore } from 'zustand';\nimport { Stepper } from '@gen-epix/ui-core-components/components/Stepper';\nimport type { Step } from '@gen-epix/ui-core-components/components/Stepper';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UPLOAD_STEP } from '../../../models/upload';\n\nimport { UploadSelectFile } from './UploadSelectFile';\nimport { UploadMapColumns } from './UploadMapColumns';\nimport { UploadPreview } from './UploadPreview';\nimport { UploadCreateCases } from './UploadCreateCases';\nimport { UploadSelectSequenceFiles } from './UploadSelectSequenceFiles';\nimport { UploadMapSequences } from './UploadMapSequences';\n\nexport const Upload = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n\n const store = use(UploadStoreContext);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const activeStep = useStore(store, (state) => state.activeStep);\n const stepOrder = useStore(store, (state) => state.stepOrder);\n\n const stepLabels = useMemo<Record<UPLOAD_STEP, string>>(() => {\n return {\n [UPLOAD_STEP.CREATE_CASES]: t`Submit`,\n [UPLOAD_STEP.MAP_COLUMNS]: t`Map columns`,\n [UPLOAD_STEP.MAP_SEQUENCES]: t`Map sequences`,\n [UPLOAD_STEP.PREVIEW]: t`Preview`,\n [UPLOAD_STEP.SELECT_FILE]: t`Select file`,\n [UPLOAD_STEP.SELECT_SEQUENCE_FILES]: t`Select sequence files`,\n };\n }, [t]);\n\n const optionalSteps = useMemo<UPLOAD_STEP[]>(() => {\n return [\n UPLOAD_STEP.SELECT_SEQUENCE_FILES,\n UPLOAD_STEP.MAP_SEQUENCES,\n ];\n }, []);\n\n const steps = useMemo<Step[]>(() => {\n return stepOrder.map((step) => ({\n key: String(step),\n label: stepLabels[step],\n optional: optionalSteps.includes(step),\n }));\n }, [optionalSteps, stepLabels, stepOrder]);\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'max-content auto',\n height: '100%',\n position: 'relative',\n width: '100%',\n }}\n >\n <Container>\n <Stepper\n activeStep={String(activeStep)}\n steps={steps}\n sx={{\n marginY: 2,\n }}\n />\n </Container>\n <Box\n sx={{\n height: `calc(100% - ${theme.spacing(4)})`,\n marginBottom: 2,\n marginTop: 2,\n position: 'relative',\n }}\n >\n {activeStep === UPLOAD_STEP.SELECT_FILE && (\n <UploadSelectFile />\n )}\n {activeStep === UPLOAD_STEP.MAP_COLUMNS && (\n <UploadMapColumns />\n )}\n {activeStep === UPLOAD_STEP.PREVIEW && (\n <UploadPreview\n caseTypeId={completeCaseType.id}\n />\n )}\n {activeStep === UPLOAD_STEP.SELECT_SEQUENCE_FILES && (\n <UploadSelectSequenceFiles />\n )}\n {activeStep === UPLOAD_STEP.MAP_SEQUENCES && (\n <UploadMapSequences />\n )}\n {activeStep === UPLOAD_STEP.CREATE_CASES && (\n <UploadCreateCases />\n )}\n </Box>\n </Box>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Upload.js","names":[],"sources":["../../src/components/ui/Upload/UploadNavigation.tsx","../../src/components/ui/Upload/UploadSelectFile.tsx","../../src/components/ui/Upload/UploadMapColumns.tsx","../../src/components/ui/CompletCaseTypeLoader/withEpiCompleteCaseTypeLoader.tsx","../../src/components/ui/Upload/UploadEditColumnValuesDialog.tsx","../../src/components/ui/Upload/UploadCaseResultTable.tsx","../../src/components/ui/Upload/UploadPreviewNavigation.tsx","../../src/components/ui/Upload/UploadPreview.tsx","../../src/components/ui/Upload/UploadCreateCases.tsx","../../src/components/ui/Upload/UploadSelectSequenceFiles.tsx","../../src/components/ui/Upload/UploadMapSequences.tsx","../../src/components/ui/Upload/Upload.tsx"],"sourcesContent":["import type { ContainerOwnProps } from '@mui/material';\nimport {\n Box,\n Button,\n} from '@mui/material';\nimport { use } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\n\nexport type UploadNavigationProps = {\n readonly backLabel?: string;\n readonly containerProps?: ContainerOwnProps;\n readonly onGoBackButtonClick?: () => void;\n readonly onProceedButtonClick?: () => void;\n readonly proceedDisabled?: boolean;\n readonly proceedLabel?: string;\n};\n\nexport const UploadNavigation = ({\n backLabel,\n onGoBackButtonClick: onGoBack,\n onProceedButtonClick: onProceedButtonClick,\n proceedDisabled,\n proceedLabel,\n}: UploadNavigationProps) => {\n const { t } = useTranslation();\n const store = use(UploadStoreContext);\n const stepOrder = useStore(store, (state) => state.stepOrder);\n const activeStep = useStore(store, (state) => state.activeStep);\n const goBackFromFirstStepCallback = useStore(store, (state) => state.goBackFromFirstStepCallback);\n const goBackFromFirstStepLabel = useStore(store, (state) => state.goBackFromFirstStepLabel);\n\n const isFirstStep = activeStep === stepOrder[0];\n const onClickGoBack = isFirstStep ? (goBackFromFirstStepCallback ?? onGoBack) : onGoBack;\n const effectiveBackLabel = isFirstStep ? (goBackFromFirstStepLabel ?? backLabel) : backLabel;\n\n return (\n <Box\n sx={{\n borderTop: (theme) => `1px solid ${theme.palette.divider}`,\n display: 'flex',\n gap: 2,\n justifyContent: 'flex-end',\n marginTop: 1,\n paddingTop: 1,\n }}\n >\n {onClickGoBack && (\n <Button\n onClick={onClickGoBack}\n variant={'outlined'}\n >\n {effectiveBackLabel ?? t`Go back`}\n </Button>\n )}\n {onProceedButtonClick && (\n <Button\n color={'secondary'}\n disabled={proceedDisabled}\n onClick={onProceedButtonClick}\n variant={'contained'}\n >\n {proceedLabel ?? t`Next`}\n </Button>\n )}\n </Box>\n );\n\n};\n","import {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport type { Resolver } from 'react-hook-form';\nimport { useForm } from 'react-hook-form';\nimport {\n mixed,\n object,\n string,\n} from 'yup';\nimport {\n Alert,\n AlertTitle,\n Container,\n Typography,\n} from '@mui/material';\nimport { useStore } from 'zustand';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useItemQuery } from '@gen-epix/ui-client-common/hooks/useItemQuery';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\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';\n\nimport {\n useCaseTypeOptionsQuery,\n useCaseTypesQuery,\n} from '../../../dataHooks/useCaseTypesQuery';\nimport { useDataCollectionOptionsQuery } from '../../../dataHooks/useDataCollectionsQuery';\nimport { useColsQuery } from '../../../dataHooks/useColsQuery';\nimport { UploadUtil } from '../../../utils/UploadUtil';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\n\nimport { UploadNavigation } from './UploadNavigation';\n\ntype FormFields = {\n caseTypeId: string;\n createdInDataCollectionId: string;\n fileList: unknown;\n sheet: string;\n};\n\nexport const UploadSelectFile = () => {\n const { t } = useTranslation();\n const caseTypesQuery = useCaseTypesQuery();\n const caseTypeOptionsQuery = useCaseTypeOptionsQuery();\n const dataCollectionOptionsQuery = useDataCollectionOptionsQuery();\n const colsQuery = useColsQuery();\n const formId = useId();\n\n const store = use(UploadStoreContext);\n\n const caseTypeId = useStore(store, (state) => state.caseTypeId);\n const fileList = useStore(store, (state) => state.fileList);\n const fileName = useStore(store, (state) => state.fileName);\n const fileParsingError = useStore(store, (state) => state.fileParsingError);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const createdInDataCollectionOptions = useStore(store, (state) => state.createdInDataCollectionOptions);\n const rawData = useStore(store, (state) => state.rawData);\n const setCols = useStore(store, (state) => state.setCols);\n const setCaseTypeId = useStore(store, (state) => state.setCaseTypeId);\n const setCompleteCaseType = useStore(store, (state) => state.setCompleteCaseType);\n const setCreatedInDataCollectionId = useStore(store, (state) => state.setCreatedInDataCollectionId);\n const setFileList = useStore(store, (state) => state.setFileList);\n const setSheet = useStore(store, (state) => state.setSheet);\n const setDataCollectionOptions = useStore(store, (state) => state.setDataCollectionOptions);\n const sheet = useStore(store, (state) => state.sheet);\n const sheetOptions = useStore(store, (state) => state.sheetOptions);\n\n const schema = useMemo(() => object<FormFields>().shape({\n caseTypeId: string().uuid4().required(),\n createdInDataCollectionId: string().uuid4().required(),\n fileList: mixed().required(t`File is required`),\n sheet: string().when('fileList', {\n is: UploadUtil.isXlsxFile(fileName),\n otherwise: (sheetSchema) => sheetSchema.notRequired(),\n then: (sheetSchema) => sheetSchema.required(t`Sheet is required`),\n }),\n }), [fileName, t]);\n\n const formMethods = useForm<FormFields>({\n defaultValues: {\n caseTypeId: null,\n createdInDataCollectionId: null,\n fileList: null,\n sheet: null,\n },\n resolver: yupResolver(schema) as unknown as Resolver<FormFields>,\n values: {\n caseTypeId: store.getState().caseTypeId ?? null,\n createdInDataCollectionId: store.getState().createdInDataCollectionId ?? null,\n fileList: store.getState().fileList ?? null,\n sheet: store.getState().sheet ?? null,\n },\n });\n const { handleSubmit, setError, setValue } = formMethods;\n\n useEffect(() => {\n if (Array.isArray(colsQuery?.data)) {\n setCols(colsQuery.data);\n }\n }, [colsQuery.data, setCols]);\n\n useEffect(() => {\n if (dataCollectionOptionsQuery?.options?.length) {\n setDataCollectionOptions(dataCollectionOptionsQuery.options);\n }\n }, [dataCollectionOptionsQuery?.options, setDataCollectionOptions]);\n\n const { data: completeCaseType, error: completeCaseTypeError, isLoading: isCompleteCaseTypeLoading } = useItemQuery({\n baseQueryKey: CASEDB_QUERY_KEY.COMPLETE_CASE_TYPES,\n itemId: caseTypeId,\n useQueryOptions: {\n enabled: !!caseTypeId,\n queryFn: async ({ signal }) => {\n return (await CaseDbCaseApi.getInstance().completeCaseTypesGetOne(caseTypeId, { signal })).data;\n },\n },\n });\n\n useEffect(() => {\n if (completeCaseType) {\n setCompleteCaseType(completeCaseType);\n }\n }, [completeCaseType, setCompleteCaseType]);\n\n const onFileListChange = useCallback(async (value: FileList) => {\n await setFileList(value);\n }, [setFileList]);\n\n const onSheetChange = useCallback(async (value: unknown) => {\n await setSheet(value as string);\n }, [setSheet]);\n\n const onCaseTypeIdChange = useCallback((value: unknown) => {\n setCaseTypeId(value as string);\n }, [setCaseTypeId]);\n\n const onCreatedInDataCollectionIdChange = useCallback((value: unknown) => {\n setCreatedInDataCollectionId(value as string);\n }, [setCreatedInDataCollectionId]);\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => {\n const fields: FormFieldDefinition<FormFields>[] = [\n {\n accept: '.csv,.tsv,.txt,.xlsx',\n definition: FORM_FIELD_DEFINITION_TYPE.FILE,\n label: t`File`,\n name: 'fileList',\n onChange: onFileListChange,\n } as const satisfies FormFieldDefinition<FormFields>,\n ];\n\n if (UploadUtil.isXlsxFile(fileName)) {\n fields.push({\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Sheet`,\n name: 'sheet',\n onChange: onSheetChange,\n options: sheetOptions,\n } as const satisfies FormFieldDefinition<FormFields>);\n }\n\n fields.push(...[\n {\n definition: FORM_FIELD_DEFINITION_TYPE.AUTOCOMPLETE,\n disabled: !fileList,\n label: t`Case type`,\n loading: caseTypeOptionsQuery.isLoading,\n name: 'caseTypeId',\n onChange: onCaseTypeIdChange,\n options: caseTypeOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n disabled: !fileList || !caseTypeId,\n label: t`Create in data collection`,\n loading: dataCollectionOptionsQuery.isLoading || isCompleteCaseTypeLoading,\n name: 'createdInDataCollectionId',\n onChange: onCreatedInDataCollectionIdChange,\n options: createdInDataCollectionOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n ] as const);\n\n return fields;\n }, [t, onFileListChange, fileName, caseTypeOptionsQuery.options, caseTypeOptionsQuery.isLoading, fileList, onCaseTypeIdChange, createdInDataCollectionOptions, dataCollectionOptionsQuery.isLoading, isCompleteCaseTypeLoading, caseTypeId, onCreatedInDataCollectionIdChange, sheetOptions, onSheetChange]);\n\n useEffect(() => {\n if (fileParsingError) {\n setError('fileList', { message: fileParsingError, type: 'manual' });\n } else {\n setError('fileList', undefined);\n }\n }, [fileParsingError, setError, setValue]);\n\n const onFormSubmit = useCallback(async () => {\n await goToNextStep();\n }, [goToNextStep]);\n\n const loadables = useArray([\n caseTypesQuery,\n caseTypeOptionsQuery,\n dataCollectionOptionsQuery,\n colsQuery,\n ]);\n\n const onProceedButtonClick = useCallback(async () => {\n await handleSubmit(onFormSubmit)();\n }, [handleSubmit, onFormSubmit]);\n\n const canUpload = useMemo(() => {\n if (colsQuery.isLoading === false && colsQuery.data?.length === 0) {\n return false;\n }\n if (caseTypeOptionsQuery.isLoading === false && caseTypeOptionsQuery.options?.length === 0) {\n return false;\n }\n if (dataCollectionOptionsQuery.isLoading === false && dataCollectionOptionsQuery.options?.length === 0) {\n return false;\n }\n return true;\n }, [colsQuery.data?.length, colsQuery.isLoading, caseTypeOptionsQuery.isLoading, caseTypeOptionsQuery.options?.length, dataCollectionOptionsQuery.isLoading, dataCollectionOptionsQuery.options?.length]);\n\n return (\n\n <ResponseHandler\n error={completeCaseTypeError}\n inlineSpinner\n loadables={loadables}\n >\n <Container maxWidth={'lg'}>\n {!canUpload && (\n <Alert\n severity={'warning'}\n sx={{ mb: 2 }}\n >\n {t('Upload is disabled because you have insufficient data access to proceed. Contact your organization administrator for assistance.')}\n </Alert>\n )}\n {canUpload && (\n <>\n {rawData && rawData.length > 0 && (\n <Alert\n severity={'info'}\n sx={{ mb: 2 }}\n >\n <AlertTitle>\n {t('{{fileName}} loaded successfully', { fileName })}\n </AlertTitle>\n {sheet && (\n <Typography>\n {t('Sheet name: {{sheet}}', { sheet: sheet || '' })}\n </Typography>\n )}\n <Typography>\n {t('Number of columns: {{columnCount}}', { columnCount: rawData[0].length })}\n </Typography>\n <Typography>\n {t('Number of data rows: {{rowCount}}', { rowCount: rawData.length - 1 })}\n </Typography>\n </Alert>\n )}\n <GenericForm<FormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n <UploadNavigation\n onProceedButtonClick={onProceedButtonClick}\n />\n </>\n )}\n\n </Container>\n </ResponseHandler>\n );\n};\n","import type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport {\n useForm,\n useWatch,\n} from 'react-hook-form';\nimport {\n Alert,\n AlertTitle,\n Box,\n Container,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport uniq from 'lodash/uniq';\nimport { useStore } from 'zustand';\nimport difference from 'lodash/difference';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useIdentifierIssuerOwnOrganizationOptionsQuery } from '@gen-epix/ui-client-common/dataHooks/useIdentifierIssuerOwnOrganizationQuery';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\nimport { Select } from '@gen-epix/ui-core-form/components/fields/Select';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type { FormFieldDefinition } from '@gen-epix/ui-core-form/models/form';\n\nimport { useColMapQuery } from '../../../dataHooks/useColsQuery';\nimport type { UploadMappedColumnsFormFields } from '../../../models/upload';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UploadUtil } from '../../../utils/UploadUtil';\n\nimport { UploadNavigation } from './UploadNavigation';\n\n\nexport const UploadMapColumns = () => {\n const { t } = useTranslation();\n const colMap = useColMapQuery();\n const identifierIssuerOptionsQuery = useIdentifierIssuerOwnOrganizationOptionsQuery();\n\n const store = use(UploadStoreContext);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const rawData = useStore(store, (state) => state.rawData);\n const fileName = useStore(store, (state) => state.fileName);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const setMappedColumns = useStore(store, (state) => state.setMappedColumns);\n\n const loadables = useArray([\n colMap,\n identifierIssuerOptionsQuery,\n ]);\n\n const columnMappingFormId = useId();\n\n const schema = useMemo(() => {\n return UploadUtil.getColumnMappingSchema(rawData, completeCaseType);\n }, [completeCaseType, rawData]);\n\n const defaultValues: UploadMappedColumnsFormFields = useMemo(() => {\n return UploadUtil.getDefaultColumnMappingFormValues(rawData[0], store.getState().mappedColumns, identifierIssuerOptionsQuery.options);\n }, [rawData, store, identifierIssuerOptionsQuery.options]);\n\n const formMethods = useForm<UploadMappedColumnsFormFields>({\n defaultValues: { ...defaultValues },\n resolver: yupResolver(schema),\n values: { ...defaultValues },\n });\n\n const { clearErrors, control, handleSubmit } = formMethods;\n const columnMappingFormValues = useWatch({ control });\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<UploadMappedColumnsFormFields>[]>(() => {\n return UploadUtil.getColumnMappingFormFieldDefinitions(completeCaseType, rawData[0], fileName).map(def => ({\n ...def,\n onChange: () => clearErrors(),\n }));\n }, [completeCaseType, rawData, fileName, clearErrors]);\n\n useEffect(() => {\n const perform = async () => {\n await setMappedColumns(UploadUtil.getMappedColumnsFromFormData(columnMappingFormValues, rawData, colMap.map, completeCaseType));\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n }, [setMappedColumns, columnMappingFormValues, rawData, colMap.map, completeCaseType]);\n\n const unMappedColumns = useMemo(() => {\n const knownIndicies = rawData[0].map((_col, index) => index);\n const mappedIndicies = UploadUtil.getMappedColumnsFromFormData(columnMappingFormValues, rawData, colMap.map, completeCaseType).map(mappedColumn => mappedColumn.originalIndex);\n return difference(knownIndicies, mappedIndicies).map(index => {\n return {\n originalIndex: index,\n originalLabel: rawData[0][index],\n };\n });\n }, [colMap.map, rawData, columnMappingFormValues, completeCaseType]);\n\n const onFormSubmit = useCallback(async (data: UploadMappedColumnsFormFields) => {\n await setMappedColumns(UploadUtil.getMappedColumnsFromFormData(data, rawData, colMap.map, completeCaseType));\n await goToNextStep();\n }, [rawData, colMap.map, goToNextStep, setMappedColumns, completeCaseType]);\n\n const sampleIdColIds = useMemo(() => {\n return UploadUtil.getSampleIdColIds(completeCaseType);\n }, [completeCaseType]);\n\n const renderField = useCallback((definition: FormFieldDefinition<UploadMappedColumnsFormFields>, element: ReactElement) => {\n const columnIndexInRawData = parseInt(definition.name, 10);\n const columnValues = uniq(rawData.slice(1).map((row) => row[columnIndexInRawData] ?? '')).filter(x => !!x);\n const firstFiveValuesString = columnValues.slice(0, 5).join(', ').trim() || t('<no data>');\n\n let elementWithIssuer = element;\n const fieldValue = columnMappingFormValues[definition.name];\n if (sampleIdColIds.includes(fieldValue)) {\n elementWithIssuer = (\n <>\n <Box>\n {element}\n </Box>\n <Box\n sx={{\n marginTop: 1,\n }}\n >\n <Select\n label={t('{{columnLabel}}: Identifier issuer', { columnLabel: definition.label })}\n loading={identifierIssuerOptionsQuery.isLoading}\n name={fieldValue}\n options={identifierIssuerOptionsQuery.options}\n />\n </Box>\n </>\n );\n }\n\n return (\n <TableRow key={definition.name}>\n <TableCell>\n {definition.label}\n </TableCell>\n <TableCell>\n {elementWithIssuer}\n </TableCell>\n <TableCell>\n {firstFiveValuesString}\n </TableCell>\n </TableRow>\n );\n }, [columnMappingFormValues, identifierIssuerOptionsQuery.isLoading, identifierIssuerOptionsQuery.options, rawData, sampleIdColIds, t]);\n\n const wrapForm = useCallback((children: ReactElement) => {\n return (\n <Table\n size={'small'}\n >\n <TableHead\n sx={{\n backgroundColor: (theme) => theme.palette.background.paper,\n position: 'sticky',\n top: 0,\n zIndex: (theme) => theme.zIndex.appBar - 1,\n }}\n >\n <TableRow>\n <TableCell sx={{ width: '33%' }}>\n {t`Source`}\n </TableCell>\n <TableCell sx={{ width: '33%' }}>\n {ConfigService.getInstance().config.applicationName}\n </TableCell>\n <TableCell sx={{ width: '34%' }}>\n {t`Data preview (first 5 unique values)`}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {children}\n </TableBody>\n </Table>\n );\n }, [t]);\n\n const onProceedButtonClick = useCallback(async () => {\n await handleSubmit(onFormSubmit)();\n }, [handleSubmit, onFormSubmit]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n return (\n <ResponseHandler loadables={loadables}>\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'max-content auto max-content',\n height: '100%',\n }}\n >\n <Container\n maxWidth={'lg'}\n sx={{\n marginBottom: 2,\n }}\n >\n <Alert severity={unMappedColumns.length === 0 ? 'info' : 'warning'}>\n <AlertTitle>\n {unMappedColumns.length === 0 ?\n t('All columns in {{fileName}} have been mapped to known columns in {{applicationName}}', { applicationName: ConfigService.getInstance().config.applicationName, fileName })\n : t('{{numUnmappedColumns}} column(s) in {{fileName}} are not mapped', { fileName, numUnmappedColumns: unMappedColumns.length })}\n </AlertTitle>\n {unMappedColumns.map((unmappedColumn) => (\n <Box key={unmappedColumn.originalIndex}>\n {t('The column \"{{columnName}}\" (column {{columnIndex}}) has not been mapped.', { columnIndex: unmappedColumn.originalIndex + 1, columnName: unmappedColumn.originalLabel })}\n </Box>\n ))}\n {unMappedColumns.length === 0 && t('You can proceed to the next step.')}\n </Alert>\n </Container>\n <Box\n sx={{\n overflowY: 'auto',\n position: 'relative',\n }}\n >\n <Box\n sx={{\n bottom: 0,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n <Container>\n <GenericForm<UploadMappedColumnsFormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={columnMappingFormId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n renderField={renderField}\n schema={schema}\n wrapForm={wrapForm}\n />\n </Container>\n </Box>\n </Box>\n <Box>\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n />\n </Box>\n </Box>\n </ResponseHandler>\n );\n};\n","import {\n useCallback,\n useState,\n} from 'react';\nimport type { ComponentType } from 'react';\n\nimport type { CompletCaseTypeLoaderProps } from './CompletCaseTypeLoader';\nimport { CompletCaseTypeLoader } from './CompletCaseTypeLoader';\n\nexport type WithEpiCompleteCaseTypeLoaderProps = CompletCaseTypeLoaderProps;\n\nexport const withEpiCompleteCaseTypeLoader = <P extends WithEpiCompleteCaseTypeLoaderProps>(WrappedComponent: ComponentType<P>): ComponentType<P> => {\n return (props: WithEpiCompleteCaseTypeLoaderProps) => {\n const [isCompleteCaseTypeLoaded, setIsCompleteCaseTypeLoaded] = useState<boolean>(false);\n\n const onCompleteCaseTypeLoaded = useCallback(() => {\n setIsCompleteCaseTypeLoaded(true);\n }, []);\n\n return (\n <CompletCaseTypeLoader\n caseTypeId={props.caseTypeId}\n onCompleteCaseTypeLoaded={onCompleteCaseTypeLoaded}\n >\n {isCompleteCaseTypeLoaded && (\n <WrappedComponent\n {...props as P}\n />\n )}\n </CompletCaseTypeLoader>\n );\n };\n};\n","import { useTranslation } from 'react-i18next';\nimport type {\n CaseDbCase,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\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 { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport type { ReactElement } from 'react';\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n} from 'react';\nimport { yupResolver } from '@hookform/resolvers/yup';\nimport { useForm } from 'react-hook-form';\nimport {\n Alert,\n AlertTitle,\n Box,\n} from '@mui/material';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport { FormUtil } from '@gen-epix/ui-core-form/utils/FormUtil';\n\nimport { CaseTypeFormUtil } from '../../../utils/CaseTypeFormUtil';\n\n\nexport interface UploadEditColumnValuesDialogOpenProps {\n colId: string;\n completeCaseType: CaseDbCompleteCaseType;\n shouldShowRightsWarning?: boolean;\n}\n\nexport interface UploadEditColumnValuesDialogProps extends WithDialogRenderProps<UploadEditColumnValuesDialogOpenProps> {\n onSubmit: (content: CaseDbCase['content']) => void;\n}\n\nexport type UploadEditColumnValuesDialogRefMethods = WithDialogRefMethods<UploadEditColumnValuesDialogProps, UploadEditColumnValuesDialogOpenProps>;\n\n\nexport const UploadEditColumnValuesDialog = withDialog<UploadEditColumnValuesDialogProps, UploadEditColumnValuesDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onSubmit,\n onTitleChange,\n openProps,\n }: UploadEditColumnValuesDialogProps,\n): ReactElement => {\n const { t } = useTranslation();\n const formId = useId();\n\n const col = useMemo(() => {\n return openProps.completeCaseType.cols[openProps.colId];\n }, [openProps.completeCaseType.cols, openProps.colId]);\n\n useEffect(() => {\n onTitleChange(t('Edit values for {{colLabel}} (for selected rows)', { colLabel: col.label }));\n }, [onTitleChange, col.label, t]);\n\n const schema = useMemo(() => CaseTypeFormUtil.createYupSchema({\n completeCaseType: openProps.completeCaseType,\n includedColIds: [openProps.colId],\n }), [openProps.completeCaseType, openProps.colId]);\n\n const formMethods = useForm<CaseDbCase['content']>({\n resolver: yupResolver(schema),\n });\n const { handleSubmit } = formMethods;\n\n const { fieldDefinitions } = useMemo(() => {\n return CaseTypeFormUtil.createFormDefinitions({\n completeCaseType: openProps.completeCaseType,\n includedColIds: [openProps.colId],\n });\n }, [openProps.completeCaseType, openProps.colId]);\n\n const onFormSubmit = useCallback((content: CaseDbCase['content']) => {\n onSubmit(FormUtil.createStringValuesFromFormValues(fieldDefinitions, content));\n onClose();\n }, [fieldDefinitions, onClose, onSubmit]);\n\n useEffect(() => {\n const actions: DialogAction[] = [\n {\n ...TestIdUtil.createAttributes('UploadEditColumnValuesDialog-submitButton'),\n color: 'primary',\n form: formId,\n label: t`Save and revalidate`,\n type: 'submit',\n variant: 'contained',\n },\n ];\n onActionsChange(actions);\n }, [formId, onActionsChange, t]);\n\n return (\n <Box>\n {openProps.shouldShowRightsWarning && (\n <Box sx={{ marginBottom: 2 }}>\n <Alert severity={'warning'}>\n <AlertTitle>\n {t`You do not have the necessary rights to edit all rows in this column.`}\n </AlertTitle>\n {t`Only the cases that you have write access to for this column will be updated. Please review the changes carefully before submitting.`}\n </Alert>\n </Box>\n )}\n <GenericForm<CaseDbCase['content']>\n formFieldDefinitions={fieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={handleSubmit(onFormSubmit)}\n schema={schema}\n />\n </Box>\n );\n}, {\n defaultTitle: '',\n fullWidth: true,\n maxWidth: 'md',\n testId: 'UploadEditColumnValuesDialog',\n});\n","import type { ReactElement } from 'react';\nimport {\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport EditIcon from '@mui/icons-material/Edit';\nimport type { StoreApi } from 'zustand';\nimport {\n Box,\n ListItemIcon,\n ListItemText,\n MenuItem,\n Tooltip,\n useTheme,\n} from '@mui/material';\nimport ErrorOutlinedIcon from '@mui/icons-material/ErrorOutlined';\nimport AddIcon from '@mui/icons-material/Add';\nimport { useTranslation } from 'react-i18next';\nimport type {\n CaseDbCase,\n CaseDbCaseDataIssue,\n CaseDbCaseUploadResult,\n CaseDbCol,\n CaseDbCompleteCaseType,\n} from '@gen-epix/api-casedb';\nimport { CaseDbDataIssueType } from '@gen-epix/api-casedb';\nimport type {\n TableColumn,\n TableColumnParams,\n TableRowAndColumnParams,\n TableRowParams,\n} from '@gen-epix/ui-client-common/models/table';\nimport type { TableStore } from '@gen-epix/ui-client-common/stores/tableStore';\nimport {\n Table,\n TableMenu,\n} from '@gen-epix/ui-client-common/components/ui/Table';\nimport { TABLE_COLUMN_FROZEN } from '@gen-epix/ui-client-common/models/table';\nimport { TableUtil } from '@gen-epix/ui-client-common/utils/TableUtil';\nimport { useInitializeTableStore } from '@gen-epix/ui-client-common/hooks/useInitializeTableStore';\n\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport type { CaseContentFormDialogRefMethods } from '../CaseContentFormDialog';\nimport { CaseContentFormDialog } from '../CaseContentFormDialog';\n\nimport type { UploadEditColumnValuesDialogRefMethods } from './UploadEditColumnValuesDialog';\nimport { UploadEditColumnValuesDialog } from './UploadEditColumnValuesDialog';\n\n\nexport type UploadCaseResultTableProps = {\n readonly caseRightsColMap?: { [colId: string]: string[] };\n readonly caseUploadResults?: CaseDbCaseUploadResult[];\n readonly completeCaseType: CaseDbCompleteCaseType;\n readonly getOriginalCellValue: (col: CaseDbCol, cellParams: TableRowAndColumnParams<CaseDbCaseUploadResult, null>, issue: CaseDbCaseDataIssue) => string;\n readonly onCaseContentEditSubmit: (caseId: string, content: CaseDbCase['content']) => void;\n readonly onColContentEditSubmit: (contentPerCaseId: { [caseId: string]: CaseDbCase['content'] }) => void;\n readonly tableStore: StoreApi<TableStore<CaseDbCaseUploadResult>>;\n};\n\nexport const UploadCaseResultTable = ({ caseRightsColMap, caseUploadResults, completeCaseType, getOriginalCellValue, onCaseContentEditSubmit, onColContentEditSubmit, tableStore }: UploadCaseResultTableProps) => {\n const theme = useTheme();\n const { t } = useTranslation();\n const caseFormDialogRef = useRef<CaseContentFormDialogRefMethods>(null);\n const uploadEditColumnValuesDialogRef = useRef<UploadEditColumnValuesDialogRefMethods>(null);\n\n const dataRulePriority: CaseDbDataIssueType[] = useMemo(() => [\n CaseDbDataIssueType.UNAUTHORIZED,\n CaseDbDataIssueType.INVALID,\n CaseDbDataIssueType.CONFLICT,\n CaseDbDataIssueType.MISSING,\n CaseDbDataIssueType.DERIVED,\n CaseDbDataIssueType.TRANSFORMED,\n ], []);\n\n const errorIssueTypes: CaseDbDataIssueType[] = useMemo(() => [\n CaseDbDataIssueType.UNAUTHORIZED,\n CaseDbDataIssueType.INVALID,\n ], []);\n\n const warningIssueTypes: CaseDbDataIssueType[] = useMemo(() => [\n CaseDbDataIssueType.MISSING,\n CaseDbDataIssueType.CONFLICT,\n ], []);\n\n const onTableCustomHeaderIconClick = useCallback((params: TableColumnParams<CaseDbCaseUploadResult, null>) => {\n uploadEditColumnValuesDialogRef.current?.open({\n colId: params.column.id,\n completeCaseType,\n shouldShowRightsWarning: caseRightsColMap?.[params.column.id]?.length !== caseUploadResults?.length,\n });\n }, [completeCaseType, caseRightsColMap, caseUploadResults]);\n\n const onCaseContentFormDialogSubmit = useCallback((caseId: string, content: CaseDbCase['content']) => {\n onCaseContentEditSubmit(caseId, content);\n }, [onCaseContentEditSubmit]);\n\n const onEpiUploadEditColumnValuesDialogSubmit = useCallback((content: CaseDbCase['content']) => {\n const contentPerCaseId: { [caseId: string]: CaseDbCase['content'] } = {};\n Object.keys(content).forEach((colId) => {\n const caseIds = caseRightsColMap?.[colId] ?? [];\n caseIds.forEach((caseId) => {\n contentPerCaseId[caseId] = {\n ...(contentPerCaseId[caseId] ?? {}),\n [colId]: content[colId],\n };\n });\n });\n onColContentEditSubmit(contentPerCaseId);\n }, [onColContentEditSubmit, caseRightsColMap]);\n\n const getIssueTooltipMessages = useCallback((issues: CaseDbCaseDataIssue[]) => {\n const messages: { key: string; message: string }[] = [];\n issues.forEach((issue) => {\n const columnLabel = completeCaseType.cols[issue.col_id].label;\n const message = `${columnLabel}: ${issue.message}`;\n messages.push({\n key: `${issue.col_id}-${issue.data_issue_type}-${issue.code}`,\n message,\n });\n });\n return messages;\n }, [completeCaseType.cols]);\n\n const getIssueTooltipContent = useCallback((issues: CaseDbCaseDataIssue[]) => {\n const messages = getIssueTooltipMessages(issues);\n return (\n <>\n {messages.map(({ key, message }, index) => (\n <Box\n key={key}\n sx={{ marginTop: index > 0 ? 1 : 0 }}\n >\n {message}\n </Box>\n ))}\n </>\n );\n }, [getIssueTooltipMessages]);\n\n const getIssueTooltipLabel = useCallback((issues: CaseDbCaseDataIssue[]) => {\n const messages = getIssueTooltipMessages(issues);\n return messages.map(m => m.message).join(', ');\n }, [getIssueTooltipMessages]);\n\n const getFilteredIssueTypes = useCallback((id: string, issues: CaseDbCaseDataIssue[], value: string) => {\n return issues.filter((issue) => {\n if (issue.col_id !== id) {\n return false;\n }\n if (issue.data_issue_type === CaseDbDataIssueType.TRANSFORMED && issue.original_value === value) {\n return false;\n }\n return true;\n }).sort((a, b) => dataRulePriority.indexOf(a.data_issue_type) - dataRulePriority.indexOf(b.data_issue_type));\n }, [dataRulePriority]);\n\n const renderHasIssueHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t('Indicates if there are any issues with the case')}\n >\n <ErrorOutlinedIcon\n fontSize={'small'}\n />\n </Tooltip>\n );\n }, [t]);\n\n const renderHasIssueCell = useCallback(({ row }: TableRowParams<CaseDbCaseUploadResult>) => {\n const errorIssues = row.data_issues.filter(i => i.data_issue_type === CaseDbDataIssueType.INVALID || i.data_issue_type === CaseDbDataIssueType.UNAUTHORIZED);\n if (errorIssues.length > 0) {\n return (\n <Tooltip\n aria-hidden={false}\n aria-label={getIssueTooltipLabel(errorIssues)}\n arrow\n title={getIssueTooltipContent(errorIssues)}\n >\n <ErrorOutlinedIcon\n fontSize={'small'}\n sx={{\n color: theme.palette.error.main,\n marginTop: '5px',\n }}\n />\n </Tooltip>\n );\n }\n }, [getIssueTooltipContent, getIssueTooltipLabel, theme.palette.error.main]);\n\n const renderIsNewHeader = useCallback(() => {\n return (\n <Tooltip\n aria-hidden={false}\n arrow\n title={t('Indicates if case is new (will be created)')}\n >\n <AddIcon\n fontSize={'small'}\n />\n </Tooltip>\n );\n }, [t]);\n\n const renderIsNewCell = useCallback(({ row }: TableRowParams<CaseDbCaseUploadResult>) => {\n return row.id ? null : (\n <AddIcon\n aria-hidden={false}\n aria-label={t`This case does not have an ID and will be created`}\n fontSize={'small'}\n sx={{\n marginTop: '5px',\n position: 'absolute',\n }}\n />\n );\n }, [t]);\n\n const renderCell = useCallback(({ id, row }: TableRowParams<CaseDbCaseUploadResult>) => {\n const rowValue = CaseUtil.getRowValue(row.validated_content, completeCaseType.cols[id], completeCaseType);\n const value = rowValue.long;\n const issues = getFilteredIssueTypes(id, row.data_issues, value);\n\n if (issues.length === 0) {\n return (\n <>\n {value}\n </>\n );\n }\n\n let iconColor: string = theme.palette.info.main;\n if (errorIssueTypes.includes(issues[0].data_issue_type)) {\n iconColor = theme.palette.error.main;\n } else if (warningIssueTypes.includes(issues[0].data_issue_type)) {\n iconColor = theme.palette.warning.main;\n }\n\n const originalValue = issues.find(x => x.original_value)?.original_value || '';\n const shouldShowOriginalValue = originalValue && value && originalValue !== value;\n\n const content = (\n <>\n {shouldShowOriginalValue && (\n <>\n <s>\n {originalValue}\n </s>\n {'\\u00A0'}\n </>\n )}\n {value && (\n <>\n {value}\n </>\n )}\n </>\n );\n\n\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n }}\n >\n <Box\n sx={{\n height: theme.spacing(2),\n marginRight: theme.spacing(1),\n minHeight: theme.spacing(2),\n minWidth: theme.spacing(2),\n position: 'relative',\n width: theme.spacing(2),\n }}\n >\n <Tooltip\n arrow\n title={getIssueTooltipContent(issues)}\n >\n <ErrorOutlinedIcon\n fontSize={'small'}\n sx={{\n color: iconColor,\n marginTop: '-2px',\n position: 'absolute',\n }}\n />\n </Tooltip>\n </Box>\n <Box\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {content}\n </Box>\n </Box>\n );\n }, [completeCaseType, errorIssueTypes, getFilteredIssueTypes, getIssueTooltipContent, theme, warningIssueTypes]);\n\n const tableColumns = useMemo<TableColumn<CaseDbCaseUploadResult>[]>(() => {\n const tableCols: TableColumn<CaseDbCaseUploadResult>[] = [];\n if (!caseUploadResults?.length) {\n return tableCols;\n }\n tableCols.push(TableUtil.createReadableIndexColumn());\n tableCols.push(TableUtil.createSelectableColumn());\n tableCols.push({\n disableEllipsis: true,\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n headerName: '',\n hideInFilter: true,\n id: 'gen-epix-ui-issue',\n isInitiallyVisible: true,\n renderCell: renderHasIssueCell,\n renderHeader: renderHasIssueHeader,\n resizable: false,\n type: 'text',\n valueGetter: () => '',\n widthPx: 38,\n });\n tableCols.push({\n disableEllipsis: true,\n frozen: TABLE_COLUMN_FROZEN.LEFT,\n headerName: '',\n hideInFilter: true,\n id: 'gen-epix-ui-id',\n isInitiallyVisible: true,\n renderCell: renderIsNewCell,\n renderHeader: renderIsNewHeader,\n resizable: false,\n type: 'text',\n valueGetter: () => '',\n widthPx: 38,\n });\n\n const uniqueColIds: Set<string> = new Set();\n caseUploadResults.forEach((validatedCase) => {\n Object.keys(validatedCase.validated_content || {}).forEach((colId) => uniqueColIds.add(colId));\n validatedCase.data_issues.forEach((issue) => uniqueColIds.add(issue.col_id));\n });\n\n // eslint-disable-next-line react-hooks/refs\n completeCaseType.ordered_col_ids.forEach((colId) => {\n if (!uniqueColIds.has(colId)) {\n return;\n }\n const col = completeCaseType.cols[colId];\n\n const issuesForCol = caseUploadResults.flatMap(vc => vc.data_issues.filter((i) => i.col_id === col.id));\n const isInitiallyVisible = issuesForCol.length === 0 || issuesForCol.some(i => i.data_issue_type !== CaseDbDataIssueType.DERIVED);\n\n const shouldShowCustomHeaderIcon = caseRightsColMap[col.id]?.length;\n\n if (col) {\n tableCols.push({\n cellTitleGetter: (params) => {\n const issue = params.row.data_issues.find((i) => i.col_id === col.id);\n if (!issue && getOriginalCellValue) {\n const originalValue = getOriginalCellValue(col, params, issue) ?? '';\n return t('{{value}} (original value: \"{{originalValue}}\")', {\n originalValue,\n value: CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n });\n }\n return '';\n },\n customHeaderIcon: shouldShowCustomHeaderIcon ? {\n iconElement: (<EditIcon fontSize={'inherit'} />),\n label: t('Edit values for {{colLabel}} (for selected rows)', { colLabel: col.label }),\n onClick: onTableCustomHeaderIconClick,\n } : undefined,\n headerName: col.code,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible,\n renderCell,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 250,\n } satisfies TableColumn<CaseDbCaseUploadResult>);\n }\n });\n\n if (caseUploadResults.some(vc => vc.id)) {\n tableCols.push({\n headerName: t('case_id'),\n hideInFilter: true,\n id: 'case_id',\n isInitiallyVisible: true,\n type: 'text',\n valueGetter: (params) => params.row.id || '',\n widthPx: 250,\n } satisfies TableColumn<CaseDbCaseUploadResult>);\n }\n\n tableCols.push(TableUtil.createActionsColumn({\n getActions: (params: TableRowParams<CaseDbCaseUploadResult>) => {\n const actions: ReactElement[] = [];\n actions.push(\n <MenuItem\n key={'editCase'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => {\n caseFormDialogRef.current?.open({\n caseContent: params.row.validated_content,\n caseId: params.row.id,\n completeCaseType,\n enabledColIds: completeCaseType.ordered_col_ids,\n formId: `edit-case-form`,\n });\n }}\n >\n <ListItemIcon>\n <EditIcon />\n </ListItemIcon>\n <ListItemText>\n {t`Edit`}\n </ListItemText>\n </MenuItem>,\n );\n return actions;\n },\n t,\n }));\n return tableCols;\n }, [caseUploadResults, renderHasIssueCell, renderHasIssueHeader, renderIsNewCell, renderIsNewHeader, completeCaseType, t, caseRightsColMap, onTableCustomHeaderIconClick, renderCell, getOriginalCellValue]);\n\n useInitializeTableStore<CaseDbCaseUploadResult>({ columns: tableColumns, createFiltersFromColumns: true, rows: caseUploadResults, store: tableStore });\n\n return (\n <>\n <Box>\n <TableMenu\n ContainerProps={{\n sx: {\n display: 'inline-block',\n float: 'right',\n },\n }}\n />\n </Box>\n <Table\n font={theme['gen-epix-ui-client-casedb'].lineList.font}\n />\n <CaseContentFormDialog\n onSubmit={onCaseContentFormDialogSubmit}\n ref={caseFormDialogRef}\n />\n <UploadEditColumnValuesDialog\n onSubmit={onEpiUploadEditColumnValuesDialogSubmit}\n ref={uploadEditColumnValuesDialogRef}\n />\n </>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { use } from 'react';\nimport { useTableStoreContext } from '@gen-epix/ui-client-common/stores/tableStore';\nimport type { CaseDbCaseUploadResult } from '@gen-epix/api-casedb';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\n\nimport { UploadNavigation } from './UploadNavigation';\n\nexport type UploadPreviewNavigationProps = {\n readonly onGoBackButtonClick: () => void;\n readonly onProceedButtonClick: () => void;\n};\n\nexport const UploadPreviewNavigation = ({ onGoBackButtonClick, onProceedButtonClick }: UploadPreviewNavigationProps) => {\n const { t } = useTranslation();\n const tableStore = useTableStoreContext<CaseDbCaseUploadResult>();\n const uploadStore = use(UploadStoreContext);\n\n const completeCaseType = useStore(uploadStore, (state) => state.completeCaseType);\n const selectedIds = useStore(tableStore, (state) => state.selectedIds);\n\n const proceedDisabled = !selectedIds.length || selectedIds.length > completeCaseType.props.create_max_n_cases;\n\n return (\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n proceedDisabled={proceedDisabled}\n proceedLabel={selectedIds.length ? t('Proceed with {{count}} selected cases', { count: selectedIds.length }) : t('Proceed')}\n />\n );\n};\n","import {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand';\nimport {\n Alert,\n AlertTitle,\n Box,\n} from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport { useShallow } from 'zustand/shallow';\nimport type {\n CaseDbCase,\n CaseDbCaseDataIssue,\n CaseDbCaseUploadResult,\n CaseDbCol,\n CaseDbUploadCasesCommand,\n} from '@gen-epix/api-casedb';\nimport {\n CaseDbCaseApi,\n CaseDbDataIssueType,\n CaseDbEtlStatus,\n CaseDbUploadAction,\n} from '@gen-epix/api-casedb';\nimport type { ConfirmationRefMethods } from '@gen-epix/ui-core-components/components/Confirmation';\nimport type { TableRowAndColumnParams } from '@gen-epix/ui-client-common/models/table';\nimport { BackdropSpinner } from '@gen-epix/ui-core-components/components/BackdropSpinner';\nimport { Confirmation } from '@gen-epix/ui-core-components/components/Confirmation';\nimport {\n createTableStore,\n TableStoreContextProvider,\n} from '@gen-epix/ui-client-common/stores/tableStore';\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 { ObjectUtil } from '@gen-epix/ui-core/utils/ObjectUtil';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { withEpiCompleteCaseTypeLoader } from '../CompletCaseTypeLoader/withEpiCompleteCaseTypeLoader';\nimport { CaseUtil } from '../../../utils/CaseUtil';\n\nimport { UploadCaseResultTable } from './UploadCaseResultTable';\nimport { UploadPreviewNavigation } from './UploadPreviewNavigation';\n\nexport type UploadPreviewProps = {\n readonly caseTypeId: string;\n};\n\nexport const UploadPreview = withEpiCompleteCaseTypeLoader<UploadPreviewProps>(({ caseTypeId }) => {\n const { t } = useTranslation();\n\n const store = use(UploadStoreContext);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const casesForVerificationFromSourceData = useStore(store, (state) => state.casesForVerificationFromSourceData);\n const createdInDataCollectionId = useStore(store, (state) => state.createdInDataCollectionId);\n const validateCasesQueryKey = useStore(store, (state) => state.validateCasesQueryKey);\n const caseRightsColMap = useStore(store, (state) => state.caseRightsColMap);\n const [exceedsMaxNumCases, setExceedsMaxNumCases] = useState(false);\n const [isRevalidatingCases, setIsRevalidatingCases] = useState(false);\n const [revalidationError, setRevalidationError] = useState<Error | null>(null);\n const selectedIdsRef = useRef<string[]>([]);\n const continueWithoutFixingConfirmationRef = useRef<ConfirmationRefMethods>(null);\n const continueWithoutSelectingAllCasesRef = useRef<ConfirmationRefMethods>(null);\n\n const getOriginalCellValue = useCallback((col: CaseDbCol, params: TableRowAndColumnParams<CaseDbCaseUploadResult, null>, _issue: CaseDbCaseDataIssue): string => {\n return casesForVerificationFromSourceData[params.rowIndex]?.case?.content[col.id] ?? '';\n }, [casesForVerificationFromSourceData]);\n\n const caseUploadValidationResultQuery = useQueryMemo({\n enabled: casesForVerificationFromSourceData.length > 0,\n gcTime: Infinity,\n queryFn: async ({ signal }) => {\n const response = (await CaseDbCaseApi.getInstance().uploadCases(ObjectUtil.deepNullifyEmptyStrings<CaseDbUploadCasesCommand>({\n case_batch: {\n cases: casesForVerificationFromSourceData,\n },\n case_type_id: caseTypeId,\n default_created_in_data_collection_id: createdInDataCollectionId ?? undefined,\n on_exists: CaseDbUploadAction.UPDATE,\n verify_only: true,\n }), { signal })).data;\n return response;\n },\n queryKey: validateCasesQueryKey,\n select: (data) => data.cases.map((caseUploadResult, index) => ({\n ...caseUploadResult,\n id: casesForVerificationFromSourceData[index].id,\n })),\n staleTime: Infinity,\n });\n\n\n const loadables = useArray([\n caseUploadValidationResultQuery,\n ]);\n\n const tableStore = useMemo(() => createTableStore<CaseDbCaseUploadResult>({\n idSelectorCallback: (row) => row.id,\n }), []);\n const setSelectedIds = useStore(tableStore, useShallow((state) => state.setSelectedIds));\n\n const revalidateCases = useCallback(async (casesToValidate: Array<{ content: CaseDbCase['content']; row: CaseDbCaseUploadResult }>) => {\n setIsRevalidatingCases(true);\n try {\n const batchValidationResult = (await CaseDbCaseApi.getInstance().uploadCases(ObjectUtil.deepNullifyEmptyStrings<CaseDbUploadCasesCommand>({\n case_batch: {\n cases: casesToValidate.map(({ content, row }, index) => {\n const caseFromSourceData = casesForVerificationFromSourceData.find(c => c.id === row.id);\n return {\n case: {\n case_type_id: completeCaseType.id,\n content: Object.fromEntries(\n Object.entries(content).map(([colId]) => {\n const col = completeCaseType.cols[colId];\n if (!col) {\n return [colId, content[colId]];\n }\n const rowValue = CaseUtil.getRowValue(content, col, completeCaseType);\n return [colId, rowValue.isMissing ? '' : rowValue.long];\n }),\n ),\n created_in_data_collection_id: caseFromSourceData?.case?.created_in_data_collection_id ?? createdInDataCollectionId,\n id: row.id ?? casesForVerificationFromSourceData[index].id,\n },\n };\n }),\n },\n case_type_id: caseTypeId,\n default_created_in_data_collection_id: createdInDataCollectionId ?? undefined,\n on_exists: CaseDbUploadAction.UPDATE,\n verify_only: true,\n }))).data;\n\n const resultById = new Map(\n casesToValidate.map(({ row }, index) => [row.id, batchValidationResult.cases[index]]),\n );\n\n QueryClientService.getInstance().queryClient.setQueryData(validateCasesQueryKey, {\n cases: caseUploadValidationResultQuery.data.map(row => {\n const newResult = resultById.get(row.id);\n if (newResult) {\n return { ...newResult, id: row.id };\n }\n return row;\n }),\n });\n\n const newlyFailedIds: string[] = [];\n casesToValidate.forEach(({ row }, index) => {\n const newResult = batchValidationResult.cases[index];\n if (newResult.status !== CaseDbEtlStatus.SKIPPED && newResult.status !== CaseDbEtlStatus.SUCCESS && newResult.status !== CaseDbEtlStatus.UPDATED) {\n if (!selectedIdsRef.current.includes(row.id)) {\n selectedIdsRef.current.push(row.id);\n newlyFailedIds.push(row.id);\n }\n }\n });\n\n if (newlyFailedIds.length > 0) {\n const currentSelectedIds = tableStore.getState().selectedIds;\n const idsToAdd = newlyFailedIds.filter(id => !currentSelectedIds.includes(id));\n if (idsToAdd.length > 0) {\n setSelectedIds([...currentSelectedIds, ...idsToAdd]);\n }\n }\n } catch (error) {\n setRevalidationError(error as Error);\n } finally {\n setIsRevalidatingCases(false);\n }\n\n }, [caseTypeId, caseUploadValidationResultQuery.data, casesForVerificationFromSourceData, completeCaseType, createdInDataCollectionId, setSelectedIds, tableStore, validateCasesQueryKey]);\n\n const onColContentEditSubmit = useCallback(async (contentPerCaseId: { [caseId: string]: CaseDbCase['content'] }) => {\n const selectedIds = tableStore.getState().selectedIds;\n await revalidateCases(\n caseUploadValidationResultQuery.data\n .filter(row => selectedIds.includes(row.id))\n .map(row => ({\n content: { ...row.validated_content, ...contentPerCaseId[row.id] },\n row,\n })),\n );\n }, [caseUploadValidationResultQuery.data, revalidateCases, tableStore]);\n\n const onCaseContentEditSubmit = useCallback(async (caseId: string, content: CaseDbCase['content']) => {\n const originalCaseUploadResult = caseUploadValidationResultQuery.data.find(r => r.id === caseId);\n await revalidateCases([{ content, row: originalCaseUploadResult }]);\n }, [caseUploadValidationResultQuery.data, revalidateCases]);\n\n useEffect(() => {\n const unsubscribe = tableStore.subscribe((state, prevState) => {\n if (state.selectedIds === prevState.selectedIds) {\n return;\n }\n selectedIdsRef.current = state.selectedIds;\n const newExceedsMaxNumCases = state.selectedIds.length > completeCaseType.props.create_max_n_cases;\n setExceedsMaxNumCases(newExceedsMaxNumCases);\n });\n\n return () => {\n unsubscribe();\n };\n }, [completeCaseType.props.create_max_n_cases, tableStore]);\n\n useEffect(() => {\n const newSelectedIds = (caseUploadValidationResultQuery.data ?? []).filter(validatedCase => {\n return !validatedCase.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID || issue.data_issue_type === CaseDbDataIssueType.UNAUTHORIZED);\n }).map(vc => vc.id);\n setSelectedIds(newSelectedIds);\n }, [caseUploadValidationResultQuery.data, setSelectedIds]);\n\n\n const onProceedWithoutFixingIssues = useCallback(async () => {\n const selectedIds = tableStore.getState().selectedIds;\n const validCases = caseUploadValidationResultQuery.data.filter(row => selectedIds.includes(row.id) && !row.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID));\n store.setState((state) => ({\n ...state,\n selectedIdsForUpload: validCases.map(c => c.id),\n validatedCases: caseUploadValidationResultQuery.data,\n }));\n await goToNextStep();\n }, [caseUploadValidationResultQuery.data, goToNextStep, store, tableStore]);\n\n const onProceed = useCallback(async () => {\n store.setState((state) => ({\n ...state,\n selectedIdsForUpload: selectedIdsRef.current,\n validatedCases: caseUploadValidationResultQuery.data,\n }));\n\n await goToNextStep();\n }, [goToNextStep, caseUploadValidationResultQuery.data, store]);\n\n const onProceedButtonClick = useCallback(async () => {\n if (caseUploadValidationResultQuery.data.some(row => tableStore.getState().selectedIds.includes(row.id) && (row.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID) || row.status === CaseDbEtlStatus.FAILED))) {\n continueWithoutFixingConfirmationRef.current?.open();\n return;\n }\n\n if (caseUploadValidationResultQuery.data.some(row => !tableStore.getState().selectedIds.includes(row.id) && !row.data_issues.some(issue => issue.data_issue_type === CaseDbDataIssueType.INVALID))) {\n continueWithoutSelectingAllCasesRef.current?.open();\n return;\n }\n\n await onProceed();\n }, [caseUploadValidationResultQuery.data, onProceed, tableStore]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: `${exceedsMaxNumCases ? 'max-content' : ''} max-content auto max-content`,\n height: '100%',\n position: 'relative',\n width: '100%',\n }}\n >\n <TableStoreContextProvider store={tableStore}>\n <ResponseHandler\n error={revalidationError}\n inlineSpinner\n loadables={loadables}\n loadingMessage={t('Validating cases')}\n takingLongerTimeoutMs={10000}\n >\n {exceedsMaxNumCases && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'error'}>\n <AlertTitle>\n {t('You have exceeded the maximum number of {{maxCases}} cases for this case type. Please reduce the number of selected cases before proceeding.', {\n maxCases: completeCaseType.props.create_max_n_cases,\n })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n <UploadCaseResultTable\n caseRightsColMap={caseRightsColMap}\n caseUploadResults={caseUploadValidationResultQuery.data || []}\n completeCaseType={completeCaseType}\n getOriginalCellValue={getOriginalCellValue}\n onCaseContentEditSubmit={onCaseContentEditSubmit}\n onColContentEditSubmit={onColContentEditSubmit}\n tableStore={tableStore}\n />\n <UploadPreviewNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n />\n </ResponseHandler>\n </TableStoreContextProvider>\n <BackdropSpinner\n label={t('Revalidating cases')}\n open={isRevalidatingCases}\n />\n <Confirmation\n body={t`Some of the selected cases contain issues. If you proceed, these cases will be excluded. Are you sure you want to proceed without them?`}\n cancelLabel={t`Cancel`}\n confirmLabel={t`Proceed`}\n onConfirm={onProceedWithoutFixingIssues}\n ref={continueWithoutFixingConfirmationRef}\n title={t`Issues found with selected cases`}\n />\n <Confirmation\n body={t`Not all cases are selected. Do you want to proceed without them?`}\n cancelLabel={t`Cancel`}\n confirmLabel={t`Proceed`}\n onConfirm={onProceed}\n ref={continueWithoutSelectingAllCasesRef}\n title={t`Not all cases are selected.`}\n />\n </Box>\n );\n});\n","import { useTranslation } from 'react-i18next';\nimport type { ReactNode } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Alert,\n AlertTitle,\n Box,\n Button,\n Container,\n} from '@mui/material';\nimport { useStore } from 'zustand';\nimport { GenericErrorMessage } from '@gen-epix/ui-client-common/components/ui/GenericErrorMessage';\nimport { InactivityService } from '@gen-epix/ui-client-common/classes/services/InactivityService';\nimport { LinearProgressWithLabel } from '@gen-epix/ui-core-components/components/LinearProgressWithLabel';\nimport { RouterService } from '@gen-epix/ui-client-common/classes/services/RouterService';\n\nimport { CaseTypeUtil } from '../../../utils/CaseTypeUtil';\nimport { UploadError } from '../../../classes/errors';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UploadUtil } from '../../../utils/UploadUtil';\n\nimport { UploadNavigation } from './UploadNavigation';\n\n\nexport const UploadCreateCases = () => {\n const { t } = useTranslation();\n\n const store = use(UploadStoreContext);\n const reset = useStore(store, (state) => state.reset);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const sequenceMapping = useStore(store, (state) => state.sequenceMapping);\n const sequenceFilesDataTransfer = useStore(store, (state) => state.sequenceFilesDataTransfer);\n const validatedCases = useStore(store, (state) => state.validatedCases);\n const selectedIdsForUpload = useStore(store, (state) => state.selectedIdsForUpload);\n const casesForVerificationFromSourceData = useStore(store, (state) => state.casesForVerificationFromSourceData);\n const uploadCompleteButtonCallback = useStore(store, (state) => state.uploadCompleteButtonCallback);\n const uploadCompleteButtonLabel = useStore(store, (state) => state.uploadCompleteButtonLabel);\n const onUploadComplete = useStore(store, (state) => state.onUploadComplete);\n\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const [progress, setProgress] = useState(0);\n const [progressMessage, setProgressMessage] = useState('');\n\n const [isUploadStarted, setIsUploadStarted] = useState(false);\n const [isUploadCompleted, setIsUploadCompleted] = useState(false);\n const [error, setError] = useState<unknown>(undefined);\n\n const sequenceFileStats = useMemo(() => {\n return UploadUtil.getSequenceMappingStats(sequenceMapping, sequenceFilesDataTransfer);\n }, [sequenceFilesDataTransfer, sequenceMapping]);\n\n const selectedValidatedCases = useMemo(() => {\n return validatedCases.filter(vc => selectedIdsForUpload.includes(vc.id));\n }, [validatedCases, selectedIdsForUpload]);\n\n useEffect(() => {\n const abortController = new AbortController();\n const { signal } = abortController;\n\n const abort = () => {\n abortController.abort();\n InactivityService.getInstance().resume();\n };\n\n if (!isUploadStarted) {\n return abort;\n }\n InactivityService.getInstance().pause();\n\n const perform = async () => {\n const result = await UploadUtil.createCasesAndUploadFiles({\n assemblyProtocolId: store.getState().assemblyProtocolId,\n casesForVerificationFromSourceData,\n completeCaseType: store.getState().completeCaseType,\n createdInDataCollectionId: store.getState().createdInDataCollectionId,\n mappedColumns: store.getState().mappedColumns,\n onComplete: () => {\n setIsUploadCompleted(true);\n },\n onError: (e: Error) => {\n setError(e);\n },\n onProgress: (percentage: number, message: string) => {\n setProgress(percentage);\n setProgressMessage(message);\n },\n sampleIdColId: store.getState().sampleIdColId,\n selectedValidatedCases,\n sequenceFilesDataTransfer,\n sequenceMapping,\n sequencingProtocolId: store.getState().sequencingProtocolId,\n signal,\n });\n if (onUploadComplete) {\n await onUploadComplete(result);\n }\n };\n\n perform().catch((e) => {\n if (!signal.aborted) {\n setError(e);\n }\n });\n\n\n return abort;\n }, [isUploadStarted, sequenceFilesDataTransfer, sequenceMapping, store, t, selectedValidatedCases, casesForVerificationFromSourceData, onUploadComplete]);\n\n\n const onStartOverButtonClick = useCallback(async () => {\n await reset();\n }, [reset]);\n\n const onStartUploadButtonClick = useCallback(() => {\n setIsUploadStarted(true);\n }, []);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n const onGotoCasesButtonClick = useCallback(async () => {\n const link = CaseTypeUtil.createCaseTypeLink(completeCaseType);\n await RouterService.getInstance().router.navigate(link);\n }, [completeCaseType]);\n\n let content: ReactNode;\n\n if (error) {\n content = (\n <Box>\n {error instanceof UploadError && (\n <Alert severity={'error'}>\n <AlertTitle>\n {t('Failed to create cases during upload.')}\n </AlertTitle>\n {t('An error occurred while creating cases. Please try again or contact support if the issue persists. Cases may have been partially created. No files were uploaded.')}\n </Alert>\n )}\n <GenericErrorMessage error={error} />\n </Box>\n );\n } else if (isUploadCompleted) {\n content = (\n <Box>\n <Box>\n <Alert severity={'success'}>\n <AlertTitle>\n {t('Upload completed.')}\n </AlertTitle>\n </Alert>\n </Box>\n <Box\n sx={{\n display: 'flex',\n gap: 2,\n justifyContent: 'flex-end',\n marginBottom: 1,\n marginTop: 2,\n }}\n >\n {uploadCompleteButtonCallback && uploadCompleteButtonLabel ? (\n <Button\n // eslint-disable-next-line @eslint-react/kit/jsx-handler-names\n onClick={uploadCompleteButtonCallback}\n variant={'contained'}\n >\n {uploadCompleteButtonLabel}\n </Button>\n ) : (\n <>\n <Button\n onClick={onStartOverButtonClick}\n variant={'outlined'}\n >\n {t('Upload more cases')}\n </Button>\n <Button\n onClick={onGotoCasesButtonClick}\n variant={'contained'}\n >\n {t('View uploaded cases')}\n </Button>\n </>\n )}\n </Box>\n </Box>\n );\n } else if (isUploadStarted) {\n content = (\n <Box>\n <Box\n sx={{\n marginBottom: 4,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('Uploading cases and files.')}\n </AlertTitle>\n {t('Please wait while the cases and associated files are being uploaded. This may take a while depending on the number and size of the files being uploaded.')}\n </Alert>\n </Box>\n <Box\n sx={{\n marginBottom: 2,\n marginTop: 4,\n }}\n >\n <LinearProgressWithLabel value={progress} />\n </Box>\n <Box\n sx={{\n fontWeight: 700,\n }}\n >\n {progressMessage}\n </Box>\n </Box>\n );\n } else {\n content = (\n <Box>\n <Box>\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('{{numCases}} cases are ready to be uploaded.', { numCases: selectedValidatedCases.length })}\n </AlertTitle>\n </Alert>\n </Box>\n {sequenceFileStats.mappedSequenceFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('{{numSequenceFiles}} genome files are ready to be uploaded.', { numSequenceFiles: sequenceFileStats.mappedSequenceFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {sequenceFileStats.mappedReadsFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('{{numReadsFiles}} reads files are ready to be uploaded.', { numReadsFiles: sequenceFileStats.mappedReadsFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {validatedCases.length - selectedValidatedCases.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'warning'}>\n <AlertTitle>\n {t('{{numCases}} cases were not selected and will not be uploaded.', { numCases: validatedCases.length - selectedValidatedCases.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {sequenceFileStats.unmappedSequenceFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'warning'}>\n <AlertTitle>\n {t('{{unmappedSequenceFiles}} unmapped genome files will not be uploaded.', { unmappedSequenceFiles: sequenceFileStats.unmappedSequenceFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n {sequenceFileStats.unmappedReadsFiles.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Alert severity={'warning'}>\n <AlertTitle>\n {t('{{unmappedReadsFiles}} unmapped reads files will not be uploaded.', { unmappedReadsFiles: sequenceFileStats.unmappedReadsFiles.length })}\n </AlertTitle>\n </Alert>\n </Box>\n )}\n </Box>\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onStartUploadButtonClick}\n proceedLabel={'Start upload'}\n />\n </Box>\n );\n }\n\n return (\n <Container\n maxWidth={'xl'}\n sx={{\n height: '100%',\n }}\n >\n {content}\n </Container>\n );\n};\n","import {\n Alert,\n AlertTitle,\n Box,\n useTheme,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport {\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 { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\nimport { GenericForm } from '@gen-epix/ui-core-form/components/helpers/GenericForm';\nimport type {\n FormFieldDefinition,\n SelectOption,\n} from '@gen-epix/ui-core-form/models/form';\nimport { FORM_FIELD_DEFINITION_TYPE } from '@gen-epix/ui-core-form/models/form';\nimport { MultiFileUploader } from '@gen-epix/ui-core-components/components/MultiFileUploader';\n\nimport { UploadUtil } from '../../../utils/UploadUtil';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { useSequencingProtocolOptionsQuery } from '../../../dataHooks/useSequencingProtocolsQuery';\nimport { useAssemblyProtocolOptionsQuery } from '../../../dataHooks/useAssemblyProtocolsQuery';\n\nimport { UploadNavigation } from './UploadNavigation';\n\n\ntype FormFields = {\n assemblyProtocolId: string;\n sampleIdColId: string;\n sequencingProtocolId: string;\n};\n\nconst getSelectedFiles = (dataTransfer?: DataTransfer) => {\n return Array.from(dataTransfer?.files ?? []);\n};\n\nconst createSchema = ({\n hasGenomeFiles,\n hasReadsFiles,\n hasSelectedFiles,\n}: {\n hasGenomeFiles: boolean;\n hasReadsFiles: boolean;\n hasSelectedFiles: boolean;\n}) => {\n return object<FormFields>().shape({\n assemblyProtocolId: hasGenomeFiles ? string().uuid4().required() : string().nullable().notRequired(),\n sampleIdColId: hasSelectedFiles ? string().uuid4().required() : string().nullable().notRequired(),\n sequencingProtocolId: hasReadsFiles ? string().uuid4().required() : string().nullable().notRequired(),\n });\n};\n\nexport const UploadSelectSequenceFiles = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n\n const store = use(UploadStoreContext);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const mappedColumns = useStore(store, (state) => state.mappedColumns);\n const validatedCases = useStore(store, (state) => state.validatedCases);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const setSequenceFilesDataTransfer = useStore(store, (state) => state.setSequenceFilesDataTransfer);\n const sampleIdColId = useStore(store, (state) => state.sampleIdColId);\n const initialDataTransfer = useStore(store, (state) => state.sequenceFilesDataTransfer);\n const [currentDataTransfer, setCurrentDataTransfer] = useState(initialDataTransfer);\n\n const formId = useId();\n\n const sequencingProtocolOptionsQuery = useSequencingProtocolOptionsQuery();\n const assemblyProtocolOptionsQuery = useAssemblyProtocolOptionsQuery();\n\n const loadables = useArray([\n sequencingProtocolOptionsQuery,\n assemblyProtocolOptionsQuery,\n ]);\n\n const sampleIdColIdOptions = useMemo<SelectOption<string>[]>(() => {\n return mappedColumns.filter(mc => mc.isSampleIdColumn).map(mc => ({\n label: mc.col.label,\n value: mc.col.id,\n } satisfies SelectOption<string>));\n }, [mappedColumns]);\n\n const selectedFiles = useMemo(() => {\n return getSelectedFiles(currentDataTransfer);\n }, [currentDataTransfer]);\n\n const hasSelectedFiles = selectedFiles.length > 0;\n const hasGenomeFiles = useMemo(() => {\n return selectedFiles.some(file => UploadUtil.isGenomeFile(file.name));\n }, [selectedFiles]);\n const hasReadsFiles = useMemo(() => {\n return selectedFiles.some(file => UploadUtil.isReadsFile(file.name));\n }, [selectedFiles]);\n\n const schema = useMemo(() => {\n return createSchema({\n hasGenomeFiles,\n hasReadsFiles,\n hasSelectedFiles,\n });\n }, [hasGenomeFiles, hasReadsFiles, hasSelectedFiles]);\n\n const defaultFormValues = useMemo<FormFields>(() => {\n return {\n assemblyProtocolId: store.getState().assemblyProtocolId ?? null,\n sampleIdColId: store.getState().sampleIdColId ?? null,\n sequencingProtocolId: store.getState().sequencingProtocolId ?? null,\n };\n }, [store]);\n\n const formMethods = useForm<FormFields>({\n defaultValues: defaultFormValues,\n resolver: yupResolver(schema) as unknown as Resolver<FormFields>,\n values: defaultFormValues,\n });\n const { handleSubmit, setValue } = formMethods;\n\n useEffect(() => {\n if (sequencingProtocolOptionsQuery.isLoading || assemblyProtocolOptionsQuery.isLoading) {\n return;\n }\n if (!store.getState().sequencingProtocolId) {\n setValue('sequencingProtocolId', sequencingProtocolOptionsQuery.options[0]?.value || null);\n store.setState({ sequencingProtocolId: sequencingProtocolOptionsQuery.options[0]?.value || null });\n }\n if (!store.getState().assemblyProtocolId) {\n setValue('assemblyProtocolId', assemblyProtocolOptionsQuery.options[0]?.value || null);\n store.setState({ assemblyProtocolId: assemblyProtocolOptionsQuery.options[0]?.value || null });\n }\n if (!store.getState().sampleIdColId) {\n setValue('sampleIdColId', sampleIdColIdOptions[0]?.value || null);\n store.setState({ sampleIdColId: sampleIdColIdOptions[0]?.value || null });\n }\n }, [assemblyProtocolOptionsQuery.isLoading, assemblyProtocolOptionsQuery.options, sequencingProtocolOptionsQuery.isLoading, sequencingProtocolOptionsQuery.options, setValue, store, sampleIdColIdOptions]);\n\n const onSequencingProtocolChange = useCallback((value: string) => {\n store.setState({ sequencingProtocolId: value });\n }, [store]);\n\n const onAssemblyProtocolChange = useCallback((value: string) => {\n store.setState({ assemblyProtocolId: value });\n }, [store]);\n\n const onSampleIdColIdChange = useCallback((value: string) => {\n store.setState({ sampleIdColId: value });\n }, [store]);\n\n const formFieldDefinitions = useMemo<FormFieldDefinition<FormFields>[]>(() => {\n return [\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Genome files: assembly protocol`,\n loading: assemblyProtocolOptionsQuery.isLoading,\n name: 'assemblyProtocolId',\n onChange: onAssemblyProtocolChange,\n options: assemblyProtocolOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Reads files: sequencing protocol`,\n loading: sequencingProtocolOptionsQuery.isLoading,\n name: 'sequencingProtocolId',\n onChange: onSequencingProtocolChange,\n options: sequencingProtocolOptionsQuery.options,\n } as const satisfies FormFieldDefinition<FormFields>,\n {\n definition: FORM_FIELD_DEFINITION_TYPE.SELECT,\n label: t`Sample ID column`,\n name: 'sampleIdColId',\n onChange: onSampleIdColIdChange,\n options: sampleIdColIdOptions,\n } as const satisfies FormFieldDefinition<FormFields>,\n ];\n }, [assemblyProtocolOptionsQuery.isLoading, assemblyProtocolOptionsQuery.options, onAssemblyProtocolChange, onSampleIdColIdChange, onSequencingProtocolChange, sampleIdColIdOptions, sequencingProtocolOptionsQuery.isLoading, sequencingProtocolOptionsQuery.options, t]);\n\n\n const hasWritableSampleIdColumn = useMemo(() => {\n return mappedColumns.some(mappedColumn => {\n return mappedColumn.isSampleIdColumn && mappedColumn.sampleIdentifierIssuerId;\n });\n }, [mappedColumns]);\n\n const hasRowContentForSampleIdColId = useMemo(() => {\n if (!sampleIdColId) {\n return false;\n }\n return validatedCases.some(vc => {\n return vc.validated_content[sampleIdColId]?.trim().length > 0;\n });\n }, [sampleIdColId, validatedCases]);\n\n const completeCaseTypeColStats = useMemo(() => {\n return UploadUtil.getCompleteCaseTypeColStats(completeCaseType);\n }, [completeCaseType]);\n\n const canUploadSequences = useMemo(() => {\n return completeCaseTypeColStats.sequenceColumns.length > 0;\n }, [completeCaseTypeColStats]);\n\n const canUploadReads = useMemo(() => {\n return completeCaseTypeColStats.readsColumns.length > 0;\n }, [completeCaseTypeColStats]);\n\n const canUpload = useMemo(() => {\n return hasWritableSampleIdColumn && hasRowContentForSampleIdColId && (canUploadSequences || canUploadReads);\n }, [hasWritableSampleIdColumn, hasRowContentForSampleIdColId, canUploadSequences, canUploadReads]);\n\n const accept = useMemo(() => {\n let acc = '';\n if (canUploadSequences) {\n acc += '.fa,.fasta,.fa.gz,.fasta.gz,';\n }\n if (canUploadReads) {\n acc += '.fq,.fastq,.fq.gz,.fastq.gz,';\n }\n return acc;\n }, [canUploadReads, canUploadSequences]);\n\n const onProceedButtonClick = useCallback(async () => {\n setSequenceFilesDataTransfer(canUpload ? currentDataTransfer : new DataTransfer());\n await handleSubmit(async () => {\n await goToNextStep();\n })();\n }, [canUpload, currentDataTransfer, goToNextStep, handleSubmit, setSequenceFilesDataTransfer]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n const onDataTransferChange = useCallback((dt: DataTransfer) => {\n setCurrentDataTransfer(dt);\n setSequenceFilesDataTransfer(dt);\n }, [setSequenceFilesDataTransfer]);\n\n const wrapForm = useCallback((children: ReactElement) => {\n return (\n <Box\n sx={{\n display: 'grid',\n gap: theme.spacing(1),\n gridTemplateColumns: '1fr 1fr 1fr',\n }}\n >\n {children}\n </Box>\n );\n }, [theme]);\n\n const cantUploadMessage = useMemo<{ message: string; title: string }>(() => {\n if (!hasWritableSampleIdColumn) {\n return {\n message: t`No columns have been mapped as writable sample ID column with selected identifier issuer provider.`,\n title: t('Uploading of files is disabled.'),\n };\n }\n if (!hasRowContentForSampleIdColId) {\n return {\n message: t`No rows have a sample ID filled for the selected sample ID column.`,\n title: t('Uploading of files is disabled.'),\n };\n }\n if (!canUploadReads) {\n return {\n message: t`The selected case type does not support uploading read files.`,\n title: t('Uploading of read files is disabled.'),\n };\n }\n if (!canUploadSequences) {\n return {\n message: t`The selected case type does not support uploading sequence files.`,\n title: t('Uploading of sequence files is disabled.'),\n };\n }\n return null;\n }, [canUploadReads, canUploadSequences, hasRowContentForSampleIdColId, hasWritableSampleIdColumn, t]);\n\n const onSubmit = useCallback(() => {\n // noop, as we handle form submission manually in onProceedButtonClick\n }, []);\n\n return (\n <ResponseHandler\n loadables={loadables}\n >\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: `${canUpload ? '' : 'max-content '}max-content auto max-content`,\n height: '100%',\n position: 'relative',\n }}\n >\n {!canUpload && (\n <Box\n sx={{\n marginBottom: 2,\n }}\n >\n <Alert severity={'error'}>\n <AlertTitle>\n {cantUploadMessage.title}\n </AlertTitle>\n {cantUploadMessage.message}\n </Alert>\n </Box>\n )}\n <Box\n sx={{\n borderBottom: `1px solid ${theme.palette.divider}`,\n }}\n >\n <Box\n sx={{\n maxWidth: theme.spacing(128),\n }}\n >\n <GenericForm<FormFields>\n formFieldDefinitions={formFieldDefinitions}\n formId={formId}\n formMethods={formMethods}\n onSubmit={onSubmit}\n schema={schema}\n wrapForm={wrapForm}\n />\n </Box>\n {!canUploadSequences && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('Uploading of sequences has been disabled.')}\n </AlertTitle>\n <Box>\n {t('Uploading of sequences is not supported for the selected case type.')}\n </Box>\n </Alert>\n </Box>\n )}\n {!canUploadReads && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Alert severity={'info'}>\n <AlertTitle>\n {t('Uploading of read files has been disabled.')}\n </AlertTitle>\n <Box>\n {t('Uploading of read files is not supported for the selected case type.')}\n </Box>\n </Alert>\n </Box>\n )}\n </Box>\n <Box\n sx={{\n position: 'relative',\n }}\n >\n\n <Box\n sx={{\n bottom: 0,\n height: '100%',\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n }}\n >\n {canUpload && (\n <MultiFileUploader\n accept={accept}\n initialDataTransfer={initialDataTransfer}\n numFilesAllowed={Infinity}\n onDataTransferChange={onDataTransferChange}\n />\n )}\n </Box>\n </Box>\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n proceedLabel={!canUpload ? t`Proceed` : undefined}\n />\n </Box>\n </ResponseHandler>\n );\n};\n","import {\n Alert,\n AlertTitle,\n Autocomplete,\n Box,\n TextField,\n useTheme,\n} from '@mui/material';\nimport {\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/react/shallow';\nimport type {\n CaseDbCaseUploadResult,\n CaseDbCol,\n} from '@gen-epix/api-casedb';\nimport type {\n TableColumn,\n TableRowParams,\n} from '@gen-epix/ui-client-common/models/table';\nimport {\n createTableStore,\n TableStoreContextProvider,\n} from '@gen-epix/ui-client-common/stores/tableStore';\nimport { Table } from '@gen-epix/ui-client-common/components/ui/Table';\nimport { TableUtil } from '@gen-epix/ui-client-common/utils/TableUtil';\nimport { useInitializeTableStore } from '@gen-epix/ui-client-common/hooks/useInitializeTableStore';\n\nimport { CaseUtil } from '../../../utils/CaseUtil';\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UploadUtil } from '../../../utils/UploadUtil';\n\nimport { UploadNavigation } from './UploadNavigation';\n\nexport const UploadMapSequences = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n\n const store = use(UploadStoreContext);\n const goToNextStep = useStore(store, (state) => state.goToNextStep);\n const goToPreviousStep = useStore(store, (state) => state.goToPreviousStep);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const sampleIdColId = useStore(store, (state) => state.sampleIdColId);\n const sequenceFilesDataTransfer = useStore(store, (state) => state.sequenceFilesDataTransfer);\n const selectedValidatedCases = useStore(store, useShallow((state) => {\n const selectedIdsForUpload = state.selectedIdsForUpload;\n return state.validatedCases.filter(vc => selectedIdsForUpload.includes(vc.id));\n }));\n const setSequenceMapping = useStore(store, (state) => state.setSequenceMapping);\n\n const completeCaseTypeColStats = useMemo(() => {\n return UploadUtil.getCompleteCaseTypeColStats(completeCaseType);\n }, [completeCaseType]);\n\n const alertTitleId = useId();\n const alertContentId = useId();\n\n const uploadSequenceMappingRef = useRef(store.getState().sequenceMapping);\n\n const onProceedButtonClick = useCallback(async () => {\n setSequenceMapping(uploadSequenceMappingRef.current);\n await goToNextStep();\n }, [setSequenceMapping, goToNextStep]);\n\n const onGoBackButtonClick = useCallback(() => {\n goToPreviousStep();\n }, [goToPreviousStep]);\n\n const updateAlert = useCallback(() => {\n // Note: This is done via DOM manipulation to prevent excessive re-renders of the entire table\n\n const alertTitleElement = document.getElementById(alertTitleId);\n const alertContentElement = document.getElementById(alertContentId);\n if (!alertTitleElement || !alertContentElement) {\n return;\n }\n const {\n mappedFiles,\n numberOfFilesToMap,\n unmappedFileNames,\n } = UploadUtil.getSequenceMappingStats(uploadSequenceMappingRef.current, sequenceFilesDataTransfer);\n\n alertTitleElement.innerHTML = numberOfFilesToMap === mappedFiles.length ? t('All {{numberOfFilesToMap}} files are mapped', { numberOfFilesToMap }) : t('{{mappedFilesLength}} of {{numberOfFilesToMap}} files mapped', { mappedFilesLength: mappedFiles.length, numberOfFilesToMap });\n alertContentElement.innerHTML = numberOfFilesToMap === mappedFiles.length ? '' : t('Unmapped files: {{unmappedFileNames}}', { unmappedFileNames: unmappedFileNames.join(', ') });\n }, [alertContentId, alertTitleId, sequenceFilesDataTransfer, t]);\n\n useEffect(() => {\n updateAlert();\n }, [updateAlert]);\n\n const tableStore = useMemo(() => createTableStore<CaseDbCaseUploadResult>({\n idSelectorCallback: (row) => row.id,\n }), []);\n\n const caseHasColumnContent = useCallback((rows: CaseDbCaseUploadResult[], col: CaseDbCol): boolean => {\n return rows.some((row) => {\n const value = CaseUtil.getRowValue(row.validated_content, col, completeCaseType);\n return value && !value?.isMissing;\n });\n }, [completeCaseType]);\n\n const sequenceDropDownOptions = useMemo(() => {\n return Array.from(sequenceFilesDataTransfer.files).map((file) => file.name).filter(name => name.endsWith('.fasta') || name.endsWith('.fa') || name.endsWith('.fa.gz') || name.endsWith('.fasta.gz'));\n }, [sequenceFilesDataTransfer.files]);\n\n const readsDropDownOptions = useMemo(() => {\n return Array.from(sequenceFilesDataTransfer.files).map((file) => file.name).filter(name => name.endsWith('.fastq') || name.endsWith('.fq') || name.endsWith('.fq.gz') || name.endsWith('.fastaq.gz'));\n }, [sequenceFilesDataTransfer.files]);\n\n const createDropDown = useCallback((kwArgs: { dropDownOptions: string[]; dropDownValue: string; label: string; onChange: (newValue: string) => void }) => {\n const { dropDownOptions, dropDownValue, label, onChange } = kwArgs;\n\n return (\n <Autocomplete\n freeSolo\n fullWidth\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onChange={(_, newValue) => {\n onChange(newValue);\n setSequenceMapping(uploadSequenceMappingRef.current);\n updateAlert();\n }}\n options={dropDownOptions}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n renderInput={(params) => (\n <TextField\n {...params}\n label={label}\n size={'small'}\n />\n )}\n sx={{\n lineHeight: 'initial',\n }}\n value={dropDownValue}\n />\n );\n }, [setSequenceMapping, updateAlert]);\n\n const renderSequenceCell = useCallback((tableRowParams: TableRowParams<CaseDbCaseUploadResult>) => {\n const col = completeCaseType.cols[tableRowParams.id];\n\n const id = tableRowParams.row.id;\n const dropDownValue = uploadSequenceMappingRef.current?.[tableRowParams.row.id]?.sequenceFileNames[col.id] || '';\n const onChange = (newValue: string) => {\n if (!newValue) {\n delete uploadSequenceMappingRef.current?.[id]?.sequenceFileNames[col.id];\n } else {\n uploadSequenceMappingRef.current[id].sequenceFileNames[col.id] = newValue;\n }\n };\n\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n justifyContent: 'center',\n }}\n >\n {createDropDown({\n dropDownOptions: sequenceDropDownOptions,\n dropDownValue,\n label: col.label,\n onChange,\n })}\n </Box>\n );\n }, [completeCaseType, createDropDown, sequenceDropDownOptions]);\n\n\n const renderReadsCell = useCallback((tableRowParams: TableRowParams<CaseDbCaseUploadResult>) => {\n const col = completeCaseType.cols[tableRowParams.id];\n const isSequenceColumn = completeCaseTypeColStats.sequenceColumns.includes(col);\n\n const id = tableRowParams.row.id;\n const dropDownValueFwd = uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.fwd || '';\n const dropDownValueRev = uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.rev || '';\n const onChangeFwd = (newValue: string) => {\n if (!newValue) {\n\n delete uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.fwd;\n } else {\n uploadSequenceMappingRef.current[id].readsFileNames[col.id].fwd = newValue;\n }\n };\n const onChangeRev = (newValue: string) => {\n if (!newValue) {\n\n delete uploadSequenceMappingRef.current?.[id]?.readsFileNames?.[col.id]?.rev;\n } else {\n uploadSequenceMappingRef.current[id].readsFileNames[col.id].rev = newValue;\n }\n };\n\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'row',\n gap: 1,\n height: '100%',\n justifyContent: 'center',\n }}\n >\n {createDropDown({\n dropDownOptions: isSequenceColumn ? sequenceDropDownOptions : readsDropDownOptions,\n dropDownValue: dropDownValueFwd,\n label: `${col.label} FWD`,\n onChange: onChangeFwd,\n })}\n {createDropDown({\n dropDownOptions: isSequenceColumn ? sequenceDropDownOptions : readsDropDownOptions,\n dropDownValue: dropDownValueRev,\n label: `${col.label} REV`,\n onChange: onChangeRev,\n })}\n </Box>\n );\n }, [completeCaseType, completeCaseTypeColStats.sequenceColumns, createDropDown, sequenceDropDownOptions, readsDropDownOptions]);\n\n\n const tableColumns = useMemo<TableColumn<CaseDbCaseUploadResult>[]>(() => {\n const tableCols: TableColumn<CaseDbCaseUploadResult>[] = [];\n tableCols.push(\n TableUtil.createReadableIndexColumn(),\n );\n\n const columnsUsedForMapping = [\n ...completeCaseTypeColStats.sampleIdColumns,\n ...completeCaseTypeColStats.sequenceColumns,\n ...completeCaseTypeColStats.readsColumns,\n ];\n\n const sampleIdCol = completeCaseTypeColStats.sampleIdColumns.find(x => x.id === sampleIdColId);\n if (sampleIdCol && caseHasColumnContent(selectedValidatedCases, sampleIdCol)) {\n tableCols.push({\n headerName: sampleIdCol.label,\n hideInFilter: true,\n id: sampleIdCol.id,\n isInitiallyVisible: true,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, sampleIdCol, completeCaseType).short,\n widthPx: 300,\n });\n }\n\n // eslint-disable-next-line react-hooks/refs\n completeCaseTypeColStats.sequenceColumns.forEach((col) => {\n tableCols.push({\n cellTitleGetter: () => null,\n headerName: col.label,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible: true,\n renderCell: renderSequenceCell,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 400,\n });\n });\n\n // eslint-disable-next-line react-hooks/refs\n completeCaseTypeColStats.readsColumns.forEach((col) => {\n tableCols.push({\n cellTitleGetter: () => null,\n headerName: col.label,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible: true,\n renderCell: renderReadsCell,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 800,\n });\n });\n\n const uniqueColIds: Set<string> = new Set();\n selectedValidatedCases.forEach((vc) => {\n Object.keys(vc.validated_content || {}).forEach((colId) => uniqueColIds.add(colId));\n });\n\n const colIdsToIgnore = [...completeCaseTypeColStats.sequenceColumns.map(x => x.id), ...completeCaseTypeColStats.readsColumns.map(x => x.id), sampleIdCol?.id];\n\n completeCaseType.ordered_col_ids.forEach((colId) => {\n if (colIdsToIgnore.includes(colId) || !uniqueColIds.has(colId) || columnsUsedForMapping.find(c => c.id === colId)) {\n return;\n }\n\n const col = completeCaseType.cols[colId];\n if (col) {\n tableCols.push({\n headerName: col.code,\n hideInFilter: true,\n id: col.id,\n isInitiallyVisible: true,\n type: 'text',\n valueGetter: (params) => CaseUtil.getRowValue(params.row.validated_content, col, completeCaseType).short,\n widthPx: 250,\n } satisfies TableColumn<CaseDbCaseUploadResult>);\n }\n });\n\n return tableCols;\n }, [caseHasColumnContent, completeCaseType, completeCaseTypeColStats.readsColumns, completeCaseTypeColStats.sampleIdColumns, completeCaseTypeColStats.sequenceColumns, renderReadsCell, renderSequenceCell, sampleIdColId, selectedValidatedCases]);\n\n useInitializeTableStore<CaseDbCaseUploadResult>({ columns: tableColumns, createFiltersFromColumns: true, rows: selectedValidatedCases, store: tableStore });\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'max-content auto max-content',\n height: '100%',\n }}\n >\n <Box sx={{ paddingBottom: 1 }}>\n <Alert severity={'info'}>\n <AlertTitle id={alertTitleId} />\n <Box id={alertContentId} />\n </Alert>\n </Box>\n <TableStoreContextProvider store={tableStore}>\n <Table\n font={theme['gen-epix-ui-client-casedb'].lineList.font}\n rowHeight={7}\n />\n <UploadNavigation\n onGoBackButtonClick={onGoBackButtonClick}\n onProceedButtonClick={onProceedButtonClick}\n />\n </TableStoreContextProvider>\n </Box>\n );\n};\n","import Box from '@mui/material/Box';\nimport { useTranslation } from 'react-i18next';\nimport {\n use,\n useMemo,\n} from 'react';\nimport {\n Container,\n useTheme,\n} from '@mui/material';\nimport { useStore } from 'zustand';\nimport { Stepper } from '@gen-epix/ui-core-components/components/Stepper';\nimport type { Step } from '@gen-epix/ui-core-components/components/Stepper';\n\nimport { UploadStoreContext } from '../../../stores/uploadStore';\nimport { UPLOAD_STEP } from '../../../models/upload';\n\nimport { UploadSelectFile } from './UploadSelectFile';\nimport { UploadMapColumns } from './UploadMapColumns';\nimport { UploadPreview } from './UploadPreview';\nimport { UploadCreateCases } from './UploadCreateCases';\nimport { UploadSelectSequenceFiles } from './UploadSelectSequenceFiles';\nimport { UploadMapSequences } from './UploadMapSequences';\n\nexport const Upload = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n\n const store = use(UploadStoreContext);\n const completeCaseType = useStore(store, (state) => state.completeCaseType);\n const activeStep = useStore(store, (state) => state.activeStep);\n const stepOrder = useStore(store, (state) => state.stepOrder);\n\n const stepLabels = useMemo<Record<UPLOAD_STEP, string>>(() => {\n return {\n [UPLOAD_STEP.CREATE_CASES]: t`Submit`,\n [UPLOAD_STEP.MAP_COLUMNS]: t`Map columns`,\n [UPLOAD_STEP.MAP_SEQUENCES]: t`Map sequences`,\n [UPLOAD_STEP.PREVIEW]: t`Preview`,\n [UPLOAD_STEP.SELECT_FILE]: t`Select file`,\n [UPLOAD_STEP.SELECT_SEQUENCE_FILES]: t`Select sequence files`,\n };\n }, [t]);\n\n const optionalSteps = useMemo<UPLOAD_STEP[]>(() => {\n return [\n UPLOAD_STEP.SELECT_SEQUENCE_FILES,\n UPLOAD_STEP.MAP_SEQUENCES,\n ];\n }, []);\n\n const steps = useMemo<Step[]>(() => {\n return stepOrder.map((step) => ({\n key: String(step),\n label: stepLabels[step],\n optional: optionalSteps.includes(step),\n }));\n }, [optionalSteps, stepLabels, stepOrder]);\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'max-content auto',\n height: '100%',\n position: 'relative',\n width: '100%',\n }}\n >\n <Container>\n <Stepper\n activeStep={String(activeStep)}\n steps={steps}\n sx={{\n marginY: 2,\n }}\n />\n </Container>\n <Box\n sx={{\n height: `calc(100% - ${theme.spacing(4)})`,\n marginBottom: 2,\n marginTop: 2,\n position: 'relative',\n }}\n >\n {activeStep === UPLOAD_STEP.SELECT_FILE && (\n <UploadSelectFile />\n )}\n {activeStep === UPLOAD_STEP.MAP_COLUMNS && (\n <UploadMapColumns />\n )}\n {activeStep === UPLOAD_STEP.PREVIEW && (\n <UploadPreview\n caseTypeId={completeCaseType.id}\n />\n )}\n {activeStep === UPLOAD_STEP.SELECT_SEQUENCE_FILES && (\n <UploadSelectSequenceFiles />\n )}\n {activeStep === UPLOAD_STEP.MAP_SEQUENCES && (\n <UploadMapSequences />\n )}\n {activeStep === UPLOAD_STEP.CREATE_CASES && (\n <UploadCreateCases />\n )}\n </Box>\n </Box>\n );\n};\n"],"mappings":"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"}
|