From 4e37a442413b23f2fc463a5371108cf923b7e549 Mon Sep 17 00:00:00 2001 From: nickpalladino Date: Tue, 2 Jun 2026 16:39:21 -0400 Subject: [PATCH 1/8] codex first pass --- AGENTS.md | 105 ++++++++++ src/breeding-insight/dao/GenoDAO.ts | 11 +- src/breeding-insight/model/GenotypeImport.ts | 89 +++++++++ src/breeding-insight/service/GenoService.ts | 27 ++- src/components/layouts/UserSideBarLayout.vue | 11 ++ src/config/AppAbility.ts | 4 +- src/config/ability.ts | 5 +- src/router/index.ts | 11 ++ src/views/genotyping/Genotyping.vue | 195 +++++++++++++++++++ 9 files changed, 453 insertions(+), 5 deletions(-) create mode 100644 AGENTS.md create mode 100644 src/breeding-insight/model/GenotypeImport.ts create mode 100644 src/views/genotyping/Genotyping.vue diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..bf18a5c45 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,105 @@ +# AGENTS.md + +Instructions for automated coding agents working in this repository. + +## Scope + +These instructions apply to the whole repository. + +## Project Overview + +`bi-web` is a Vue 2.7 frontend for Breeding Insight. It uses Vue CLI 4, +TypeScript, Vuex, Vue Router, Buefy/Bulma, Vuelidate, CASL abilities, and an +axios wrapper for API calls. + +Important directories: + +- `src/views`: route-level pages. +- `src/components`: reusable Vue components and layout templates. +- `src/store`: Vuex root store and feature modules. +- `src/breeding-insight/model`: application domain models. +- `src/breeding-insight/dao`: raw API access using `src/util/api`. +- `src/breeding-insight/service`: business logic and response mapping. +- `src/breeding-insight/brapi/model`: generated BrAPI/OpenAPI models. +- `tests/unit`: Jest and Vue Test Utils unit tests. +- `tests/e2e`: Cypress end-to-end tests. +- `task`: Node task wrappers used by npm scripts. + +## Setup + +- Use npm and `package-lock.json`; do not introduce Yarn or pnpm. +- Use `npm install` for local setup, or `npm ci` for clean/install-in-CI style + runs. +- The Dockerfile uses Node 14 and npm 8.12.1. Avoid dependency or syntax changes + that require a newer runtime unless the runtime is intentionally updated. +- `npm run githooks` configures the repository's commit message hook. +- Local environment overrides belong in ignored `.env.local` or `.env.*.local` + files, not in tracked env files. + +## Common Commands + +- `npm run serve`: start the dev server. The default port is `8080`; `PORT` + overrides it. +- `npm run build`: production build. The task wrapper runs npm audit checks + before building. +- `npm run lint`: run Vue CLI ESLint. +- `npm run test:unit`: run existing Jest unit tests only when explicitly + requested. +- `npm run test:e2e`: run existing Cypress e2e tests only when explicitly + requested. +- `npm run test:accessibility`: run pa11y accessibility checks. This expects + the dev server to be running and `task/.pa11yTargets.json` to exist; use it + only when explicitly requested. + +This repository does not add or maintain tests as part of normal feature or bug +work. Do not create new tests, update existing tests, add test-only selectors, +or spend time repairing unrelated test failures unless the user explicitly asks +for test work. Prefer `npm run lint`, `npm run build`, or a focused manual smoke +check for verification when practical. + +## Coding Conventions + +- Preserve the existing Apache 2.0 notice header when editing files that have + it. Add the same header to new `.ts`, `.js`, and `.vue` source files. +- Keep TypeScript strictness in mind. Prefer explicit domain models and local + service/DAO patterns over loose `any` unless surrounding code already forces + it. +- Use the `@/` alias for imports from `src` when consistent with nearby files. +- Vue components commonly use class-style components with + `vue-property-decorator`; match the surrounding component style. +- ESLint requires long-form Vue directives: use `v-bind:` and `v-on:` instead + of shorthand in templates. +- Keep API calls centralized through `src/util/api`. DAOs should make HTTP + requests, while services should handle application mapping and user-facing + error logic. +- `src/breeding-insight/brapi/model` files are generated by Swagger/OpenAPI. + Do not hand-edit them unless the task explicitly calls for it. +- Reuse existing layouts in `src/components/layouts` and visual conventions + from the authenticated `/style-guide` page. Prefer existing Buefy/Bulma + patterns and the configured Feather icon pack. + +## Configuration Notes + +`vue.config.js` derives frontend runtime values from environment variables: + +- `VUE_APP_BI_API_ROOT` defaults to `http://localhost`. +- `VUE_APP_BI_API_V1_PATH` is computed as `${VUE_APP_BI_API_ROOT}/v1`. +- `VUE_APP_LOG_LEVEL` defaults to `error`. +- `VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED` and + `VUE_APP_ALTERNATE_AUTHENTICATION_ENABLED` are enabled only when set to the + string `true`. + +`.env.development` maps these values from shell environment variables such as +`API_BASE_URL`, `SANDBOX_MODE`, and `WEB_LOG_LEVEL`. + +## Working Safely + +- Check `git status --short` before editing and do not overwrite unrelated + local changes. +- Do not commit generated output, `node_modules`, `dist`, local env files, IDE + files, Cypress screenshots/videos, or task logs. +- Do not change `package-lock.json` unless dependency changes are intentional. +- Keep changes scoped to the requested behavior. Avoid broad refactors unless + they are required to make the requested change safely. +- If backend behavior is relevant, make the frontend assumption explicit in the + code review or final notes; this repository only contains the web client. diff --git a/src/breeding-insight/dao/GenoDAO.ts b/src/breeding-insight/dao/GenoDAO.ts index 7df9fb97b..e7eb8003f 100644 --- a/src/breeding-insight/dao/GenoDAO.ts +++ b/src/breeding-insight/dao/GenoDAO.ts @@ -42,4 +42,13 @@ export class GenoDAO { return new BiResponse(data); } -} \ No newline at end of file + + static async fetchGenotypeImports(programId: string): Promise { + const {data} = await api.call({ + url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/geno/imports`, + method: 'get' + }) as Response; + + return new BiResponse(data); + } +} diff --git a/src/breeding-insight/model/GenotypeImport.ts b/src/breeding-insight/model/GenotypeImport.ts new file mode 100644 index 000000000..cd8c47acc --- /dev/null +++ b/src/breeding-insight/model/GenotypeImport.ts @@ -0,0 +1,89 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +interface DisplayUser { + name?: string; + email?: string; +} + +type DisplayUserValue = string | DisplayUser; + +export interface GenotypeImportResponse { + id?: string; + genotypeImportId?: string; + importerImportId?: string; + sampleSubmissionId?: string; + sampleSubmissionDbId?: string; + submissionId?: string; + projectName?: string; + sampleSubmissionName?: string; + sampleSubmissionCreatedBy?: DisplayUserValue; + sampleSubmissionCreatedByUser?: DisplayUserValue; + sampleSubmissionCreatedByName?: string; + genotypingFileName?: string; + fileName?: string; + uploadFileName?: string; + genotypingImportDate?: string; + genotypingImportedDate?: string; + importDate?: string; + importedAt?: string; + createdAt?: string; + genotypingImportedBy?: DisplayUserValue; + genotypingImportedByUser?: DisplayUserValue; + genotypingImportedByName?: string; + importedBy?: DisplayUserValue; + importedByUser?: DisplayUserValue; +} + +export class GenotypeImport { + id?: string; + sampleSubmissionId?: string; + projectName?: string; + sampleSubmissionCreatedBy?: string; + genotypingFileName?: string; + genotypingImportDate?: string; + genotypingImportedBy?: string; + + constructor(record: GenotypeImportResponse = {}) { + this.id = record.id || record.genotypeImportId || record.importerImportId; + this.sampleSubmissionId = record.sampleSubmissionId || record.sampleSubmissionDbId || record.submissionId; + this.projectName = record.projectName || record.sampleSubmissionName; + this.sampleSubmissionCreatedBy = GenotypeImport.displayUser( + record.sampleSubmissionCreatedBy || record.sampleSubmissionCreatedByUser || record.sampleSubmissionCreatedByName + ); + this.genotypingFileName = record.genotypingFileName || record.fileName || record.uploadFileName; + this.genotypingImportDate = record.genotypingImportDate || record.genotypingImportedDate || record.importDate || + record.importedAt || record.createdAt; + this.genotypingImportedBy = GenotypeImport.displayUser( + record.genotypingImportedBy || record.genotypingImportedByUser || record.genotypingImportedByName || + record.importedBy || record.importedByUser + ); + } + + private static displayUser(value?: DisplayUserValue): string | undefined { + if (typeof value === 'string') { + return value; + } + if (value && value.name) { + return value.name; + } + if (value && value.email) { + return value.email; + } + return undefined; + } +} diff --git a/src/breeding-insight/service/GenoService.ts b/src/breeding-insight/service/GenoService.ts index 245569aac..b862eeb27 100644 --- a/src/breeding-insight/service/GenoService.ts +++ b/src/breeding-insight/service/GenoService.ts @@ -19,6 +19,7 @@ import { GenoDAO } from '@/breeding-insight/dao/GenoDAO'; import { BiResponse } from '@/breeding-insight/model/BiResponse'; import { ImportResponse } from '@/breeding-insight/model/import/ImportResponse'; import { GermplasmGenotype } from '@/breeding-insight/model/GermplasmGenotype'; +import { GenotypeImport, GenotypeImportResponse } from '@/breeding-insight/model/GenotypeImport'; export class GenoService { @@ -47,4 +48,28 @@ export class GenoService { return resp.result as GermplasmGenotype; } -} \ No newline at end of file + + static async fetchGenotypeImports(programId: string): Promise { + if (!programId) { + throw 'Program ID not provided'; + } + + const response = await GenoDAO.fetchGenotypeImports(programId); + const responseData = response.result && response.result.data ? response.result.data : response.result; + + if (!Array.isArray(responseData)) { + return []; + } + + return responseData + .map((record: GenotypeImportResponse) => new GenotypeImport(record)) + .sort((first: GenotypeImport, second: GenotypeImport) => { + return this.dateValue(second.genotypingImportDate) - this.dateValue(first.genotypingImportDate); + }); + } + + private static dateValue(date?: string): number { + const value = Date.parse(date || ''); + return Number.isNaN(value) ? 0 : value; + } +} diff --git a/src/components/layouts/UserSideBarLayout.vue b/src/components/layouts/UserSideBarLayout.vue index 2498cf42c..9c7b9f5e7 100644 --- a/src/components/layouts/UserSideBarLayout.vue +++ b/src/components/layouts/UserSideBarLayout.vue @@ -140,6 +140,16 @@ Sample Management +
  • + + Genotyping + +
  • + + + + From 0624896bfc6b7fe8adaa8ab9936a474356d6692c Mon Sep 17 00:00:00 2001 From: nickpalladino Date: Fri, 5 Jun 2026 14:32:51 -0400 Subject: [PATCH 2/8] Update response model to match backend --- src/breeding-insight/model/GenotypeImport.ts | 80 ++++---------------- src/breeding-insight/service/GenoService.ts | 4 +- src/views/genotyping/Genotyping.vue | 10 +-- 3 files changed, 23 insertions(+), 71 deletions(-) diff --git a/src/breeding-insight/model/GenotypeImport.ts b/src/breeding-insight/model/GenotypeImport.ts index cd8c47acc..02e2c8e9c 100644 --- a/src/breeding-insight/model/GenotypeImport.ts +++ b/src/breeding-insight/model/GenotypeImport.ts @@ -15,75 +15,27 @@ * limitations under the License. */ -interface DisplayUser { - name?: string; - email?: string; -} - -type DisplayUserValue = string | DisplayUser; - -export interface GenotypeImportResponse { - id?: string; - genotypeImportId?: string; - importerImportId?: string; - sampleSubmissionId?: string; - sampleSubmissionDbId?: string; - submissionId?: string; - projectName?: string; - sampleSubmissionName?: string; - sampleSubmissionCreatedBy?: DisplayUserValue; - sampleSubmissionCreatedByUser?: DisplayUserValue; - sampleSubmissionCreatedByName?: string; - genotypingFileName?: string; - fileName?: string; - uploadFileName?: string; - genotypingImportDate?: string; - genotypingImportedDate?: string; - importDate?: string; - importedAt?: string; - createdAt?: string; - genotypingImportedBy?: DisplayUserValue; - genotypingImportedByUser?: DisplayUserValue; - genotypingImportedByName?: string; - importedBy?: DisplayUserValue; - importedByUser?: DisplayUserValue; -} - export class GenotypeImport { - id?: string; sampleSubmissionId?: string; - projectName?: string; + projectNameForSampleSubmission?: string; sampleSubmissionCreatedBy?: string; genotypingFileName?: string; genotypingImportDate?: string; - genotypingImportedBy?: string; - - constructor(record: GenotypeImportResponse = {}) { - this.id = record.id || record.genotypeImportId || record.importerImportId; - this.sampleSubmissionId = record.sampleSubmissionId || record.sampleSubmissionDbId || record.submissionId; - this.projectName = record.projectName || record.sampleSubmissionName; - this.sampleSubmissionCreatedBy = GenotypeImport.displayUser( - record.sampleSubmissionCreatedBy || record.sampleSubmissionCreatedByUser || record.sampleSubmissionCreatedByName - ); - this.genotypingFileName = record.genotypingFileName || record.fileName || record.uploadFileName; - this.genotypingImportDate = record.genotypingImportDate || record.genotypingImportedDate || record.importDate || - record.importedAt || record.createdAt; - this.genotypingImportedBy = GenotypeImport.displayUser( - record.genotypingImportedBy || record.genotypingImportedByUser || record.genotypingImportedByName || - record.importedBy || record.importedByUser - ); - } + genotypingImportBy?: string; - private static displayUser(value?: DisplayUserValue): string | undefined { - if (typeof value === 'string') { - return value; - } - if (value && value.name) { - return value.name; - } - if (value && value.email) { - return value.email; - } - return undefined; + constructor({ + sampleSubmissionId, + projectNameForSampleSubmission, + sampleSubmissionCreatedBy, + genotypingFileName, + genotypingImportDate, + genotypingImportBy + }: GenotypeImport = {}) { + this.sampleSubmissionId = sampleSubmissionId; + this.projectNameForSampleSubmission = projectNameForSampleSubmission; + this.sampleSubmissionCreatedBy = sampleSubmissionCreatedBy; + this.genotypingFileName = genotypingFileName; + this.genotypingImportDate = genotypingImportDate; + this.genotypingImportBy = genotypingImportBy; } } diff --git a/src/breeding-insight/service/GenoService.ts b/src/breeding-insight/service/GenoService.ts index b862eeb27..4c426cb7b 100644 --- a/src/breeding-insight/service/GenoService.ts +++ b/src/breeding-insight/service/GenoService.ts @@ -19,7 +19,7 @@ import { GenoDAO } from '@/breeding-insight/dao/GenoDAO'; import { BiResponse } from '@/breeding-insight/model/BiResponse'; import { ImportResponse } from '@/breeding-insight/model/import/ImportResponse'; import { GermplasmGenotype } from '@/breeding-insight/model/GermplasmGenotype'; -import { GenotypeImport, GenotypeImportResponse } from '@/breeding-insight/model/GenotypeImport'; +import { GenotypeImport } from '@/breeding-insight/model/GenotypeImport'; export class GenoService { @@ -62,7 +62,7 @@ export class GenoService { } return responseData - .map((record: GenotypeImportResponse) => new GenotypeImport(record)) + .map((record: GenotypeImport) => new GenotypeImport(record)) .sort((first: GenotypeImport, second: GenotypeImport) => { return this.dateValue(second.genotypingImportDate) - this.dateValue(first.genotypingImportDate); }); diff --git a/src/views/genotyping/Genotyping.vue b/src/views/genotyping/Genotyping.vue index 93cdc62b0..31f52f58b 100644 --- a/src/views/genotyping/Genotyping.vue +++ b/src/views/genotyping/Genotyping.vue @@ -54,7 +54,7 @@ > - {{ displayValue(props.row.data.projectName) }} + {{ displayValue(props.row.data.projectNameForSampleSubmission) }} - {{ displayValue(props.row.data.projectName) }} + {{ displayValue(props.row.data.projectNameForSampleSubmission) }} - {{ displayValue(props.row.data.genotypingImportedBy) }} + {{ displayValue(props.row.data.genotypingImportBy) }} \ No newline at end of file + From bd723c8fea6b656d6b1c97412da1c20337dc4689 Mon Sep 17 00:00:00 2001 From: nickpalladino Date: Fri, 5 Jun 2026 15:39:30 -0400 Subject: [PATCH 7/8] Add backend filtering support --- src/breeding-insight/dao/GenoDAO.ts | 6 ++-- src/breeding-insight/model/Sort.ts | 2 ++ src/breeding-insight/service/GenoService.ts | 7 +++-- src/views/genotyping/Genotyping.vue | 32 +++++++++++++++------ 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/breeding-insight/dao/GenoDAO.ts b/src/breeding-insight/dao/GenoDAO.ts index cdc914df8..f4167ead6 100644 --- a/src/breeding-insight/dao/GenoDAO.ts +++ b/src/breeding-insight/dao/GenoDAO.ts @@ -18,7 +18,7 @@ import * as api from '@/util/api'; import { BiResponse, Response } from '@/breeding-insight/model/BiResponse'; import { PaginationQuery } from '@/breeding-insight/model/PaginationQuery'; -import { GenotypeImportSort } from '@/breeding-insight/model/Sort'; +import { GenotypeImportFilters, GenotypeImportSort } from '@/breeding-insight/model/Sort'; export class GenoDAO { @@ -48,12 +48,14 @@ export class GenoDAO { static async fetchGenotypeImports( programId: string, {page, pageSize}: PaginationQuery, - {field, order}: GenotypeImportSort + {field, order}: GenotypeImportSort, + filters: GenotypeImportFilters ): Promise { const {data} = await api.call({ url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/geno/imports`, method: 'get', params: { + ...filters, page, pageSize, sortField: field, diff --git a/src/breeding-insight/model/Sort.ts b/src/breeding-insight/model/Sort.ts index 87fb9a98f..e2e9da50e 100644 --- a/src/breeding-insight/model/Sort.ts +++ b/src/breeding-insight/model/Sort.ts @@ -227,6 +227,8 @@ export enum GenotypeImportSortField { GenotypingImportBy = 'genotypingImportBy' } +export type GenotypeImportFilters = Partial>; + export class GenotypeImportSort { field: GenotypeImportSortField; order: SortOrder; diff --git a/src/breeding-insight/service/GenoService.ts b/src/breeding-insight/service/GenoService.ts index 684d97a40..25191a13a 100644 --- a/src/breeding-insight/service/GenoService.ts +++ b/src/breeding-insight/service/GenoService.ts @@ -21,7 +21,7 @@ import { ImportResponse } from '@/breeding-insight/model/import/ImportResponse'; import { GermplasmGenotype } from '@/breeding-insight/model/GermplasmGenotype'; import { GenotypeImport } from '@/breeding-insight/model/GenotypeImport'; import { PaginationQuery } from '@/breeding-insight/model/PaginationQuery'; -import { GenotypeImportSort } from '@/breeding-insight/model/Sort'; +import { GenotypeImportFilters, GenotypeImportSort } from '@/breeding-insight/model/Sort'; export class GenoService { @@ -54,13 +54,14 @@ export class GenoService { static async fetchGenotypeImports( programId: string, paginationQuery: PaginationQuery, - sort: GenotypeImportSort + sort: GenotypeImportSort, + filters: GenotypeImportFilters ): Promise<[GenotypeImport[], Metadata]> { if (!programId) { throw 'Program ID not provided'; } - const response = await GenoDAO.fetchGenotypeImports(programId, paginationQuery, sort); + const response = await GenoDAO.fetchGenotypeImports(programId, paginationQuery, sort, filters); const responseData = response.result && response.result.data ? response.result.data : response.result; if (!Array.isArray(responseData)) { diff --git a/src/views/genotyping/Genotyping.vue b/src/views/genotyping/Genotyping.vue index 2d9bf47db..78f2f567b 100644 --- a/src/views/genotyping/Genotyping.vue +++ b/src/views/genotyping/Genotyping.vue @@ -43,12 +43,14 @@ v-bind:loading="loading" v-bind:pagination="paginationController" v-bind:default-sort="['data.genotypingImportDate', 'desc']" - v-bind:debounce-search="400" + v-bind:search-debounce="400" v-bind:editable="false" v-bind:is-show-all-enabled="false" + backend-filtering backend-pagination backend-sorting v-on:click="navigateToSampleSubmission" + v-on:search="initSearch" v-on:sort="setSort" > = new Array(); private paginationController: PaginationController = new PaginationController(); private genotypeImportCallStack!: CallStack; + private filters: GenotypeImportFilters = {}; private genotypeImportSort = new GenotypeImportSort( GenotypeImportSortField.GenotypingImportDate, SortOrder.Descending @@ -169,11 +173,12 @@ export default class Genotyping extends ProgramsBase { }; mounted() { - this.genotypeImportCallStack = new CallStack((paginationQuery: PaginationQuery) => { + this.genotypeImportCallStack = new CallStack((filters: GenotypeImportFilters) => { return GenoService.fetchGenotypeImports( this.activeProgram!.id!, - paginationQuery, - this.genotypeImportSort + this.paginationController.currentCall!, + this.genotypeImportSort, + filters ); }); this.paginationChanged(); @@ -199,12 +204,13 @@ export default class Genotyping extends ProgramsBase { } this.paginationController.setCurrentCall(paginationQuery); - this.fetchGenotypeImports(paginationQuery); + this.fetchGenotypeImports(); } - async fetchGenotypeImports(paginationQuery: PaginationQuery) { + @Watch('filters', {deep: true}) + async fetchGenotypeImports() { this.loading = true; - const {call, callId} = this.genotypeImportCallStack.makeCall(paginationQuery); + const {call, callId} = this.genotypeImportCallStack.makeCall(this.filters); try { const [genotypeImports, metadata] = await call; @@ -231,10 +237,20 @@ export default class Genotyping extends ProgramsBase { setSort(field: string, order: string) { if (field in this.fieldMap) { this.genotypeImportSort = new GenotypeImportSort(this.fieldMap[field], Sort.orderAsBI(order)); - this.fetchGenotypeImports(this.paginationController.currentCall!); + this.fetchGenotypeImports(); } } + initSearch(filters: {[key: string]: string}) { + this.filters = Object.keys(filters).reduce((normalizedFilters: GenotypeImportFilters, field: string) => { + if (field in this.fieldMap) { + normalizedFilters[this.fieldMap[field]] = filters[field]; + } + return normalizedFilters; + }, {}); + this.paginationController.updatePage(1); + } + importGenotypingFile() { this.$router.push({ name: 'geno-import', From 2b7a4f5752daa23a61027a8a325c7d34e1020085 Mon Sep 17 00:00:00 2001 From: nickpalladino Date: Tue, 16 Jun 2026 14:45:01 -0400 Subject: [PATCH 8/8] Remove row click links --- src/views/genotyping/Genotyping.vue | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/views/genotyping/Genotyping.vue b/src/views/genotyping/Genotyping.vue index 78f2f567b..17e21803d 100644 --- a/src/views/genotyping/Genotyping.vue +++ b/src/views/genotyping/Genotyping.vue @@ -49,7 +49,6 @@ backend-filtering backend-pagination backend-sorting - v-on:click="navigateToSampleSubmission" v-on:search="initSearch" v-on:sort="setSort" > @@ -131,7 +130,6 @@ import {Program} from '@/breeding-insight/model/Program'; import {PaginationController} from '@/breeding-insight/model/view_models/PaginationController'; import {GenotypeImport} from '@/breeding-insight/model/GenotypeImport'; import {GenoService} from '@/breeding-insight/service/GenoService'; -import {TableRow} from '@/breeding-insight/model/view_models/TableRow'; import {PaginationQuery} from '@/breeding-insight/model/PaginationQuery'; import {CallStack} from '@/breeding-insight/utils/CallStack'; import { @@ -260,20 +258,6 @@ export default class Genotyping extends ProgramsBase { }); } - navigateToSampleSubmission(row: TableRow) { - if (!row.data.sampleSubmissionId) { - return; - } - - this.$router.push({ - name: 'submission-details', - params: { - programId: this.activeProgram!.id!, - submissionId: row.data.sampleSubmissionId - } - }); - } - displayValue(value?: string): string { return value || ''; }