From d41923146cb65216d80bc6b7d6092d7da63e5910 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 31 Dec 2024 18:09:55 +0000 Subject: [PATCH] Pull through display names --- .../components/Submission/DataUploadForm.tsx | 2 +- .../FileUpload/ColumnMappingModal.tsx | 56 +++++++++++++------ .../components/Submission/RevisionForm.tsx | 2 +- .../components/Submission/SubmissionForm.tsx | 2 +- website/src/config.ts | 12 +++- .../[organism]/submission/template/index.ts | 2 +- 6 files changed, 51 insertions(+), 25 deletions(-) diff --git a/website/src/components/Submission/DataUploadForm.tsx b/website/src/components/Submission/DataUploadForm.tsx index 9a2d093e04..75b98a43ae 100644 --- a/website/src/components/Submission/DataUploadForm.tsx +++ b/website/src/components/Submission/DataUploadForm.tsx @@ -35,7 +35,7 @@ type DataUploadFormProps = { action: UploadAction; group: Group; referenceGenomeSequenceNames: ReferenceGenomesSequenceNames; - metadataTemplateFields: string[]; + metadataTemplateFields: Map; onSuccess: () => void; onError: (message: string) => void; }; diff --git a/website/src/components/Submission/FileUpload/ColumnMappingModal.tsx b/website/src/components/Submission/FileUpload/ColumnMappingModal.tsx index fd7440f3fb..0c916373e3 100644 --- a/website/src/components/Submission/FileUpload/ColumnMappingModal.tsx +++ b/website/src/components/Submission/FileUpload/ColumnMappingModal.tsx @@ -4,48 +4,58 @@ import { BaseDialog } from '../../common/BaseDialog'; export class ColumnMapping { private readonly map: ReadonlyMap; + private readonly displayNames: ReadonlyMap; - private constructor(map: Map) { + private constructor(map: ReadonlyMap, displayNames: ReadonlyMap) { this.map = map; + this.displayNames = displayNames; } /* Create a new mapping with the given columns, doing a best-effort to pre-match columns. */ - public static fromColumns(sourceColumns: string[], targetColumns: string[]) { + public static fromColumns(sourceColumns: string[], targetColumns: Map) { const mapping = new Map(); - targetColumns.forEach((targetColumn) => { - // TODO also check for display name similarity. + [...targetColumns.entries()].forEach(([targetColumn, targetColumnDisplayName]) => { + // TODO improve with fuzzy matching if (sourceColumns.includes(targetColumn)) { mapping.set(targetColumn, targetColumn); + // TODO improve with fuzzy matching + } else if (targetColumnDisplayName !== undefined && sourceColumns.includes(targetColumnDisplayName)) { + mapping.set(targetColumn, targetColumnDisplayName); } else { mapping.set(targetColumn, sourceColumns[0]); } }); - return new ColumnMapping(mapping); + return new ColumnMapping(mapping, targetColumns); } /* Update the mapping with new source and target columns, trying to keep as much of the mapping intact as possible. */ - public update(newSourceColumns: string[], newTargetColumns: string[]): ColumnMapping { + public update(newSourceColumns: string[], newTargetColumns: Map): ColumnMapping { const newMapping = new Map(); - newTargetColumns.forEach((targetColumn) => { + [...newTargetColumns.entries()].forEach(([targetColumn, _targetColumnDisplayName]) => { const prevSourceCol = this.map.get(targetColumn); if (prevSourceCol && newSourceColumns.includes(prevSourceCol)) { newMapping.set(targetColumn, prevSourceCol); } else { + // TODO improve this newMapping.set(targetColumn, newSourceColumns[0]); } }); - return new ColumnMapping(newMapping); + return new ColumnMapping(newMapping, newTargetColumns); } - public entries(): [string, string][] { - return Array.from(this.map.entries()); + public entries(): [string, string | undefined, string][] { + return Array.from(this.map.entries()).map(([targetCol, sourceCol]) => [ + targetCol, + this.displayNames.get(targetCol), + sourceCol, + ]); } public updateWith(k: string, v: string): ColumnMapping { const newMapping = new Map(this.map); newMapping.set(k, v); - return new ColumnMapping(newMapping); + return new ColumnMapping(newMapping, this.displayNames); } /* Apply this mapping to a TSV file, returning a new file with remapped columns. */ @@ -69,7 +79,7 @@ interface ColumnMappingModalProps { inputFile: File; columnMapping: ColumnMapping | null; setColumnMapping: (newMapping: ColumnMapping) => void; - possibleTargetColumns: string[]; + possibleTargetColumns: Map; } export const ColumnMappingModal: FC = ({ @@ -134,11 +144,12 @@ export const ColumnMappingModal: FC = ({ - {currentMapping.entries().map(([k, v]) => ( + {currentMapping.entries().map(([targetCol, targetColDisplayName, sourceCol]) => ( @@ -173,6 +184,7 @@ async function extractColumns(_tsvFile: File): Promise { interface ColumnSelectorRowProps { selectingFor: string; + selectingForDisplayName: string | undefined; options: string[]; selectedOption: string; setColumnMapping: Dispatch>; @@ -180,14 +192,22 @@ interface ColumnSelectorRowProps { export const ColumnSelectorRow: FC = ({ selectingFor, + selectingForDisplayName, options, selectedOption, setColumnMapping, }) => { - // TODO it would be cool to have the 'display name' for the columns available here return ( - {selectingFor} + + {selectingForDisplayName ? ( + <> + {selectingForDisplayName} ({selectingFor}) + + ) : ( + <>{selectingFor} + )} +