From 8a053146e910048c980ac2b992763b10e8a0db5c Mon Sep 17 00:00:00 2001 From: Julen Mendieta Date: Tue, 25 Aug 2026 17:30:42 +0200 Subject: [PATCH 1/6] Add selected sequence to block label --- model/src/index.ts | 5 ++++- model/src/label.ts | 6 ++++++ model/src/types.ts | 1 + ui/src/pages/MainPage.vue | 22 +++++++++++----------- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/model/src/index.ts b/model/src/index.ts index 3b59c1e..6a26f49 100644 --- a/model/src/index.ts +++ b/model/src/index.ts @@ -42,6 +42,7 @@ const blockDataModel = new DataModelBuilder() customBlockLabel: args?.customBlockLabel ?? "", datasetRef: args?.datasetRef, targetRef: args?.targetRef, + targetColumnLabel: undefined, fileHandle: args?.fileHandle, fileExtension: args?.fileExtension, detectedXsvType: args?.detectedXsvType, @@ -64,6 +65,7 @@ const blockDataModel = new DataModelBuilder() customBlockLabel: "", datasetRef: undefined, targetRef: undefined, + targetColumnLabel: undefined, fileHandle: undefined, fileExtension: undefined, detectedXsvType: undefined, @@ -81,9 +83,10 @@ const blockDataModel = new DataModelBuilder() lastAppliedModality: undefined, })); -function deriveDefaultLabel(data: BlockData): string { +export function deriveDefaultLabel(data: BlockData): string { return getDefaultBlockLabel({ fileName: data.fileHandle ? getFileNameFromHandle(data.fileHandle) : undefined, + targetColumnLabel: data.targetColumnLabel, similarityType: data.settings.similarityType, identity: data.settings.identity, coverageThreshold: data.settings.coverageThreshold, diff --git a/model/src/label.ts b/model/src/label.ts index 3ba98df..c216272 100644 --- a/model/src/label.ts +++ b/model/src/label.ts @@ -1,5 +1,6 @@ export function getDefaultBlockLabel(data: { fileName?: string; + targetColumnLabel?: string; similarityType: "alignment-score" | "sequence-identity" | "exact-match"; identity: number; coverageThreshold: number; @@ -11,6 +12,11 @@ export function getDefaultBlockLabel(data: { parts.push(data.fileName); } + // The matched sequence column + if (data.targetColumnLabel) { + parts.push(data.targetColumnLabel); + } + // Sequence Match mode has no identity/coverage thresholds — they are meaningless. if (data.similarityType === "exact-match") { parts.push("Sequence match"); diff --git a/model/src/types.ts b/model/src/types.ts index 2b70861..bf5a81c 100644 --- a/model/src/types.ts +++ b/model/src/types.ts @@ -33,6 +33,7 @@ export type BlockData = { customBlockLabel: string; datasetRef?: PlRef; targetRef?: SUniversalPColumnId; + targetColumnLabel?: string; fileHandle?: ImportFileHandle; fileExtension?: string; detectedXsvType?: "csv" | "tsv"; diff --git a/ui/src/pages/MainPage.vue b/ui/src/pages/MainPage.vue index 2d9a3cd..ba48c56 100644 --- a/ui/src/pages/MainPage.vue +++ b/ui/src/pages/MainPage.vue @@ -2,7 +2,7 @@ import { PlMultiSequenceAlignment } from "@milaboratories/multi-sequence-alignment"; import strings from "@milaboratories/strings"; import { - getDefaultBlockLabel, + deriveDefaultLabel, type Settings, } from "@platforma-open/milaboratories.immune-assay-data.model"; import type { @@ -11,6 +11,7 @@ import type { LocalImportFileHandle, PlSelectionModel, PTableKey, + SUniversalPColumnId, } from "@platforma-sdk/model"; import { getFileNameFromHandle, @@ -72,16 +73,7 @@ const PEPTIDE_DEFAULTS: Settings = { coverageThreshold: 1.0, }; -const defaultLabel = computed(() => - getDefaultBlockLabel({ - fileName: app.model.data.fileHandle - ? getFileNameFromHandle(app.model.data.fileHandle) - : undefined, - similarityType: app.model.data.settings.similarityType, - identity: app.model.data.settings.identity, - coverageThreshold: app.model.data.settings.coverageThreshold, - }), -); +const defaultLabel = computed(() => deriveDefaultLabel(app.model.data)); const settingsOpen = ref(app.model.data.datasetRef === undefined); const multipleSequenceAlignmentAssayOpen = ref(false); @@ -171,6 +163,13 @@ watch(assayFileBytes, (bytes) => { processFileBytes(bytes, app.model.data.fileExtension); }); +// Mirror the picked column's display label into data +const setTarget = (target: SUniversalPColumnId | undefined) => { + app.model.data.targetColumnLabel = target + ? app.model.outputs.targetOptions?.find((o) => o.value === target)?.label + : undefined; +}; + const setFile = async (file: ImportFileHandle | undefined) => { // Clear all dependent state so the new file's columns are detected fresh. app.model.data.importColumns = undefined; @@ -367,6 +366,7 @@ const similarityTypeOptions = [ label="Sequence column to match" clearable required + @update:model-value="setTarget" >