diff --git a/backend/src/main/kotlin/org/loculus/backend/api/SubmissionTypes.kt b/backend/src/main/kotlin/org/loculus/backend/api/SubmissionTypes.kt index 0c34e620a..9c9918f08 100644 --- a/backend/src/main/kotlin/org/loculus/backend/api/SubmissionTypes.kt +++ b/backend/src/main/kotlin/org/loculus/backend/api/SubmissionTypes.kt @@ -113,6 +113,7 @@ data class SequenceEntryVersionToEdit( "Issues where data is not necessarily wrong, but the user might want to look into those warnings.", ) val warnings: List? = null, + val submissionId: String, ) : AccessionVersionInterface typealias SegmentName = String diff --git a/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt b/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt index d58832503..1b084d08c 100644 --- a/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt +++ b/backend/src/main/kotlin/org/loculus/backend/service/submission/SubmissionDatabaseService.kt @@ -876,6 +876,7 @@ class SubmissionDatabaseService( SequenceEntriesView.errorsColumn, SequenceEntriesView.warningsColumn, SequenceEntriesView.isRevocationColumn, + SequenceEntriesView.submissionIdColumn, ) .where { SequenceEntriesView.accessionVersionEquals(accessionVersion) } .first() @@ -901,6 +902,7 @@ class SubmissionDatabaseService( ), errors = selectedSequenceEntry[SequenceEntriesView.errorsColumn], warnings = selectedSequenceEntry[SequenceEntriesView.warningsColumn], + submissionId = selectedSequenceEntry[SequenceEntriesView.submissionIdColumn], ) } diff --git a/kubernetes/loculus/templates/_inputFieldsFromValues.tpl b/kubernetes/loculus/templates/_inputFieldsFromValues.tpl index 90a16ed16..d58b04f67 100644 --- a/kubernetes/loculus/templates/_inputFieldsFromValues.tpl +++ b/kubernetes/loculus/templates/_inputFieldsFromValues.tpl @@ -2,7 +2,7 @@ {{- $data := . }} {{- $metadata := $data.metadata }} {{- $extraFields := $data.extraInputFields }} -{{- $TO_KEEP := list "name" "displayName" "definition" "guidance" "example" "required" }} +{{- $TO_KEEP := list "name" "displayName" "definition" "guidance" "example" "required" "noEdit"}} {{- $fieldsDict := dict }} diff --git a/kubernetes/loculus/values.yaml b/kubernetes/loculus/values.yaml index c53ef073b..c7c92d239 100644 --- a/kubernetes/loculus/values.yaml +++ b/kubernetes/loculus/values.yaml @@ -748,6 +748,7 @@ defaultOrganismConfig: &defaultOrganismConfig guidance: Used to match the sequence(s) to the metadata example: GJP123 position: first + noEdit: true preprocessing: - &preprocessing version: 1 diff --git a/website/src/components/Edit/EditPage.tsx b/website/src/components/Edit/EditPage.tsx index 193a0ceee..577d7701a 100644 --- a/website/src/components/Edit/EditPage.tsx +++ b/website/src/components/Edit/EditPage.tsx @@ -29,6 +29,18 @@ type EditPageProps = { const logger = getClientLogger('EditPage'); +type SubmissionProps = { + submissionId: string; +}; + +const SubmissionIdRow: FC = ({ submissionId }) => ( + + Submission ID: + + {submissionId} + +); + const InnerEditPage: FC = ({ organism, dataToEdit, @@ -102,10 +114,10 @@ const InnerEditPage: FC = ({ onConfirmation={submitEditedDataForAccessionVersion} /> - + key !== ACCESSION_FIELD)} setEditedMetadata={setEditedMetadata} @@ -238,26 +250,30 @@ const EditableOriginalData: FC = ({ editedMetadata, s }; } - return ( - - setEditedMetadata((prevRows: Row[]) => { - const relevantOldRow = prevRows.find((oldRow) => oldRow.key === editedRow.key); - - if (relevantOldRow !== undefined) { - return prevRows.map((prevRow) => - prevRow.key === editedRow.key ? { ...prevRow, value: editedRow.value } : prevRow, - ); - } else { - return [...prevRows, editedRow]; - } - }) - } - /> - ); + if (!(inputField.noEdit !== undefined && inputField.noEdit === true)) { + return ( + + setEditedMetadata((prevRows: Row[]) => { + const relevantOldRow = prevRows.find((oldRow) => oldRow.key === editedRow.key); + + if (relevantOldRow !== undefined) { + return prevRows.map((prevRow) => + prevRow.key === editedRow.key + ? { ...prevRow, value: editedRow.value } + : prevRow, + ); + } else { + return [...prevRows, editedRow]; + } + }) + } + /> + ); + } })} ); diff --git a/website/src/types/backend.ts b/website/src/types/backend.ts index 1ad891082..407aa58e5 100644 --- a/website/src/types/backend.ts +++ b/website/src/types/backend.ts @@ -174,6 +174,7 @@ export const sequenceEntryToEdit = accessionVersion.merge( z.object({ status: statusThatAllowsEditing, groupId: z.number(), + submissionId: z.string(), errors: z.array(processingAnnotation).nullable(), warnings: z.array(processingAnnotation).nullable(), originalData: z.object({ diff --git a/website/src/types/config.ts b/website/src/types/config.ts index 46b87161d..e1c4c2340 100644 --- a/website/src/types/config.ts +++ b/website/src/types/config.ts @@ -43,6 +43,7 @@ export const metadata = z.object({ export const inputField = z.object({ name: z.string(), displayName: z.string().optional(), + noEdit: z.boolean().optional(), }); export type InputField = z.infer; diff --git a/website/vitest.setup.ts b/website/vitest.setup.ts index 50748b02c..7eee3f5c8 100755 --- a/website/vitest.setup.ts +++ b/website/vitest.setup.ts @@ -96,6 +96,7 @@ export const defaultReviewData: SequenceEntryToEdit = { processedInsertionGeneName: ['aminoAcidInsertion1', 'aminoAcidInsertion2'], }, }, + submissionId: 'defaultSubmitter', }; export const testOrganism = 'testOrganism';