Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
4ced0e5
[autocommit] bumping build number
rob-ouser-bi Apr 23, 2026
37bc32b
[BI-2844] BI-2844 - Updated germplasm import template download link t…
humsika May 1, 2026
21fb51b
[BI-2844] BI-2844 - Updated germplasm import template download link t…
humsika May 4, 2026
fa0c131
Merge pull request #465 from Breeding-Insight/feature/BI-2844
nickpalladino May 4, 2026
7d419e8
[autocommit] bumping build number
rob-ouser-bi May 4, 2026
3fb9449
[BI-2843] BI-2843 - Updated the Genotype upload page.
humsika May 6, 2026
5ff671e
Merge branch 'develop' into feature/BI-2843
jloux-brapi May 7, 2026
6168013
Merge pull request #467 from Breeding-Insight/feature/BI-2843
jloux-brapi May 7, 2026
08c7e82
[autocommit] bumping build number
rob-ouser-bi May 7, 2026
62490ab
Merge branch 'bug/BI-2860-v1.3' into develop
nickpalladino May 13, 2026
aa67f70
[autocommit] bumping build number
rob-ouser-bi May 13, 2026
504708f
Updated version
nickpalladino May 13, 2026
d688437
[autocommit] bumping build number
rob-ouser-bi May 13, 2026
4e37a44
codex first pass
nickpalladino Jun 2, 2026
0624896
Update response model to match backend
nickpalladino Jun 5, 2026
d1d5775
Updated pagination controls and added backend pagination calls
nickpalladino Jun 5, 2026
a5060e2
Update to use backend sorting
nickpalladino Jun 5, 2026
1163d46
Remove hoverable row highlighting
nickpalladino Jun 5, 2026
3c02a96
Updated heading text and margins for consistency
nickpalladino Jun 5, 2026
bd723c8
Add backend filtering support
nickpalladino Jun 5, 2026
5f29910
[BI-2878] retreive External UID from External Reference, and display it.
Jun 8, 2026
3c7f404
Merge pull request #472 from Breeding-Insight/feature/BI-2878
jloux-brapi Jun 10, 2026
8f3ad21
[autocommit] bumping build number
rob-ouser-bi Jun 10, 2026
2b7a4f5
Remove row click links
nickpalladino Jun 16, 2026
482304f
Merge branch 'develop' into feature/BI-2679
nickpalladino Jun 16, 2026
6c92b13
Merge pull request #471 from Breeding-Insight/feature/BI-2679
humsika Jun 16, 2026
efd1529
[autocommit] bumping build number
rob-ouser-bi Jun 16, 2026
f66e1db
[BI-2850] - Add download options to new genotyping page
HMS17 Jun 23, 2026
5f354b1
Merge pull request #474 from Breeding-Insight/feature/BI-2850
jloux-brapi Jun 30, 2026
70e0ebb
[autocommit] bumping build number
rob-ouser-bi Jun 30, 2026
1494a2b
[BI-2941] BI-2941 - Added logic to catch the "413 - Request entity to…
humsika Jul 1, 2026
420a63f
Merge pull request #475 from Breeding-Insight/feature/BI-2941
nickpalladino Jul 7, 2026
0a55d6d
[autocommit] bumping build number
rob-ouser-bi Jul 7, 2026
9598588
Fix response delay and update messages
nickpalladino Jul 13, 2026
b793584
Merge pull request #476 from Breeding-Insight/feature/BI-2869
humsika Jul 14, 2026
8521936
[autocommit] bumping build number
rob-ouser-bi Jul 14, 2026
3e778fa
[BI-2850] - Add download options to new genotyping page
HMS17 Jul 14, 2026
59e0d64
Merge branch 'develop' into feature/BI-2850
HMS17 Jul 14, 2026
add45e7
[BI-2958] BI-2958: Updated Germplasm Import Template version.
humsika Jul 16, 2026
3afd0a2
Merge pull request #478 from Breeding-Insight/feature/BI-2958
jloux-brapi Jul 16, 2026
61bc772
[autocommit] bumping build number
rob-ouser-bi Jul 16, 2026
a21f86d
Updated error message for sample submission delete
nickpalladino Jul 17, 2026
f7548ce
[BI-2959] BI-2959: Updated frontend External UID lookup logic to disp…
humsika Jul 17, 2026
a3fef9d
Merge branch 'develop' into feature/BI-2850
nickpalladino Jul 17, 2026
1232b74
Merge pull request #477 from Breeding-Insight/feature/BI-2850
nickpalladino Jul 17, 2026
ea8198c
[autocommit] bumping build number
rob-ouser-bi Jul 17, 2026
968961d
Merge branch 'develop' into feature/BI-2936
humsika Jul 20, 2026
f5857e0
Merge pull request #479 from Breeding-Insight/feature/BI-2936
humsika Jul 20, 2026
e269124
[autocommit] bumping build number
rob-ouser-bi Jul 20, 2026
1762fbf
Merge branch 'develop' into feature/BI-2959
HMS17 Jul 20, 2026
83179e5
Merge pull request #480 from Breeding-Insight/feature/BI-2959
HMS17 Jul 20, 2026
3306264
[autocommit] bumping build number
rob-ouser-bi Jul 20, 2026
c543453
[BI-2967] BI-2967: Update the ImportGeno.vue file to handle the file …
humsika Jul 23, 2026
4d75612
Merge pull request #482 from Breeding-Insight/feature/BI-2967
HMS17 Jul 29, 2026
dc278cb
[autocommit] bumping build number
rob-ouser-bi Jul 29, 2026
6fef585
[BI-2981] - Improve message: duplicate germplasm detected
HMS17 Jul 30, 2026
1ac826a
[BI-1968] - Change default experimental download to "All Environments"
HMS17 Jul 30, 2026
55c8543
[BI-2980] BI-2980: Updated the dropbox sample submission template link.
humsika Jul 31, 2026
8d88392
Merge pull request #485 from Breeding-Insight/feature/BI-2980
HMS17 Aug 3, 2026
5602838
[autocommit] bumping build number
rob-ouser-bi Aug 3, 2026
e1749b2
Merge branch 'develop' into feature/BI-2981
jloux-brapi Aug 3, 2026
5a1a641
Merge pull request #483 from Breeding-Insight/feature/BI-2981
jloux-brapi Aug 3, 2026
91242ac
[autocommit] bumping build number
rob-ouser-bi Aug 3, 2026
3de0b10
Merge branch 'develop' into feature/BI-1968
jloux-brapi Aug 3, 2026
8ceefee
Merge pull request #484 from Breeding-Insight/feature/BI-1968
jloux-brapi Aug 3, 2026
2d41778
[autocommit] bumping build number
rob-ouser-bi Aug 3, 2026
ae2cada
[BI-3018] - Erroneous message during .vcf upload
HMS17 Aug 5, 2026
6847ebf
Merge pull request #486 from Breeding-Insight/bug/BI-3018
nickpalladino Aug 6, 2026
f3ac21e
[autocommit] bumping build number
rob-ouser-bi Aug 10, 2026
a273f34
[BI-3033] Deprecate Genotypic Data Visualization
HMS17 Sep 1, 2026
f37fc57
[BI-3033] Callsets label accessibility fix
HMS17 Sep 1, 2026
1d69897
Merge pull request #491 from Breeding-Insight/bug/BI-3033
jloux-brapi Sep 2, 2026
9006754
[autocommit] bumping build number
rob-ouser-bi Sep 2, 2026
d54d28d
Merge branch 'main' into release/1.4
nickpalladino Sep 9, 2026
bb5049d
[autocommit] bumping build number
rob-ouser-bi Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.development
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ VUE_APP_LOG_LEVEL=${WEB_LOG_LEVEL}

# The reference source
VUE_APP_BI_REFERENCE_SOURCE=${BRAPI_REFERENCE_SOURCE}
VUE_APP_MAX_GENOTYPE_UPLOAD_MB=${MAX_GENOTYPE_UPLOAD_MB}

# feature flags
VUE_APP_BRAPI_VENDOR_SUBMISSION_ENABLED=${BRAPI_VENDOR_SUBMISSION_ENABLED}
Expand Down
105 changes: 105 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -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.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bi-web",
"version": "v1.3.0",
"version": "v1.4.0+989",
"private": true,
"scripts": {
"build": "node $npm_package_config_task_path/build.js --dev-audit-level=critical --prod-audit-level=none",
Expand Down Expand Up @@ -96,5 +96,5 @@
"vue-cli-plugin-axios": "0.0.4",
"vue-template-compiler": "^2.7.14"
},
"versionInfo": "https://github.com/Breeding-Insight/bi-web/releases/tag/v1.3.0"
"versionInfo": "https://github.com/Breeding-Insight/bi-web/commit/d54d28db116a99e278f5c055d8868cd8d790df29"
}
30 changes: 26 additions & 4 deletions src/breeding-insight/dao/GenoDAO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,18 @@

import * as api from '@/util/api';
import { BiResponse, Response } from '@/breeding-insight/model/BiResponse';
import { PaginationQuery } from '@/breeding-insight/model/PaginationQuery';
import { GenotypeImportFilters, GenotypeImportSort } from '@/breeding-insight/model/Sort';

export class GenoDAO {

static async uploadData(programId: string, experimentId: string, file: File): Promise<any> {
static async uploadData(programId: string, submissionId: string, file: File): Promise<any> {

var formData = new FormData();
formData.append("file", file);
formData.append("filename", file.name);

const {data} = await api.call({
url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/experiments/${experimentId}/geno/import`,
url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/submissions/${submissionId}/geno/import`,
method: 'post', data: formData}
) as Response;

Expand All @@ -42,4 +43,25 @@ export class GenoDAO {

return new BiResponse(data);
}
}

static async fetchGenotypeImports(
programId: string,
{page, pageSize}: PaginationQuery,
{field, order}: GenotypeImportSort,
filters: GenotypeImportFilters
): Promise<BiResponse> {
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,
sortOrder: order
}
}) as Response;

return new BiResponse(data);
}
}
2 changes: 1 addition & 1 deletion src/breeding-insight/model/ExperimentExportOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export class ExperimentExportOptions {
public fileExtension: string = FileTypeOption.xls.id;
public datasetId: string;
public environments: string[] = [];
public allEnvironments: boolean = false;
public allEnvironments: boolean = true;
public includeTimestamps: string = 'No';

public timestampsTrueFalseString(): string {
Expand Down
44 changes: 44 additions & 0 deletions src/breeding-insight/model/GenotypeImport.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* 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.
*/

export class GenotypeImport {
genotypeImportId?: string;
sampleSubmissionId?: string;
projectNameForSampleSubmission?: string;
sampleSubmissionCreatedBy?: string;
genotypingFileName?: string;
genotypingImportDate?: string;
genotypingImportBy?: string;

constructor({
genotypeImportId,
sampleSubmissionId,
projectNameForSampleSubmission,
sampleSubmissionCreatedBy,
genotypingFileName,
genotypingImportDate,
genotypingImportBy
}: GenotypeImport = {}) {
this.genotypeImportId = genotypeImportId;
this.sampleSubmissionId = sampleSubmissionId;
this.projectNameForSampleSubmission = projectNameForSampleSubmission;
this.sampleSubmissionCreatedBy = sampleSubmissionCreatedBy;
this.genotypingFileName = genotypingFileName;
this.genotypingImportDate = genotypingImportDate;
this.genotypingImportBy = genotypingImportBy;
}
}
23 changes: 22 additions & 1 deletion src/breeding-insight/model/Sort.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ export enum GermplasmSortField {
Pedigree = "pedigree",
FemaleParent = "femaleParentGID",
MaleParent = "maleParentGID",
ExternalUID = "externalUID",
CreatedDate = "createdDate",
UserName = "createdByUserName"
}
Expand Down Expand Up @@ -217,4 +218,24 @@ export class GermplasmListSort {
this.field = field;
this.order = order;
}
}
}

export enum GenotypeImportSortField {
ProjectNameForSampleSubmission = 'projectNameForSampleSubmission',
SampleSubmissionCreatedBy = 'sampleSubmissionCreatedBy',
GenotypingFileName = 'genotypingFileName',
GenotypingImportDate = 'genotypingImportDate',
GenotypingImportBy = 'genotypingImportBy'
}

export type GenotypeImportFilters = Partial<Record<GenotypeImportSortField, string>>;

export class GenotypeImportSort {
field: GenotypeImportSortField;
order: SortOrder;

constructor(field: GenotypeImportSortField, order: SortOrder) {
this.field = field;
this.order = order;
}
}
11 changes: 5 additions & 6 deletions src/breeding-insight/model/import/germplasm/ExternalUID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,16 @@
export class ExternalUID {

/**
* Get ExternalUID value from germplasm BrAPI external references array based
* on the seedSource value
* Get ExternalUID value from germplasm BrAPI external references array using
* the canonical External UID reference source.
*
* @param externalReferences
* @param source
*/
public static getExternalUIDFromExternalReferences(externalReferences: Array<any>, source : string) : string | undefined {
if (externalReferences === undefined || source === undefined) {
public static getExternalUIDFromExternalReferences(externalReferences: Array<any>) : string | undefined {
if (externalReferences === undefined) {
return undefined;
}
const externalUID = externalReferences.find( ({ referenceSource }) => referenceSource === source );
const externalUID = externalReferences.find( ({ referenceSource }) => referenceSource === "External UID" );
if (externalUID !== undefined) {
return externalUID.referenceID;
} else
Expand Down
37 changes: 31 additions & 6 deletions src/breeding-insight/service/GenoService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,24 @@
*/

import { GenoDAO } from '@/breeding-insight/dao/GenoDAO';
import { BiResponse } from '@/breeding-insight/model/BiResponse';
import { BiResponse, Metadata } from '@/breeding-insight/model/BiResponse';
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 { GenotypeImportFilters, GenotypeImportSort } from '@/breeding-insight/model/Sort';

export class GenoService {

static async uploadData(programId: string, experimentId: string, file: File): Promise<ImportResponse> {
static async uploadData(programId: string, submissionId: string, file: File): Promise<ImportResponse> {
if (!programId) {
throw 'Program ID not provided';
}
if (!experimentId) {
throw 'Experiment ID not provided';
if (!submissionId) {
throw 'Submission ID not provided';
}

const response: BiResponse = await GenoDAO.uploadData(programId, experimentId, file);
const response: BiResponse = await GenoDAO.uploadData(programId, submissionId, file);
const data: any = response.result;
return new ImportResponse(data);
}
Expand All @@ -47,4 +50,26 @@ export class GenoService {

return resp.result as GermplasmGenotype;
}
}

static async fetchGenotypeImports(
programId: string,
paginationQuery: PaginationQuery,
sort: GenotypeImportSort,
filters: GenotypeImportFilters
): Promise<[GenotypeImport[], Metadata]> {
if (!programId) {
throw 'Program ID not provided';
}

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)) {
return [[], response.metadata];
}

const genotypeImports = responseData.map((record: GenotypeImport) => new GenotypeImport(record));

return [genotypeImports, response.metadata];
}
}
5 changes: 3 additions & 2 deletions src/breeding-insight/utils/GermplasmUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@
import moment from "moment";
import {Germplasm} from "@/breeding-insight/brapi/model/germplasm";
import {MOMENT_BRAPI_DATE_FORMAT} from "@/breeding-insight/utils/BrAPIDateTime";
import {ExternalReferences} from "@/breeding-insight/brapi/model/externalReferences";

// The moment.js interpretable format for Date values sent and received via the BI API.
export const MOMENT_DATE_PERSISTED_FORMAT = 'DD/MM/YYYY h:mm:ss';

export class GermplasmUtils {
static getExternalUID(germplasm: Germplasm): string | undefined {
let val;
if (germplasm.externalReferences && germplasm.seedSource) {
val = germplasm.externalReferences!.filter(ref => ref.referenceSource == germplasm.seedSource!)
if (germplasm.externalReferences) {
val = germplasm.externalReferences!.filter(ref => ref.referenceSource == "External UID")
.map(ref => ref.referenceID);
return val ? val[0]: "";
}
Expand Down
6 changes: 5 additions & 1 deletion src/components/VueFeatherIconPack.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import { ArrowDownIcon,
ChevronLeftIcon,
ChevronRightIcon,
ChevronUpIcon,
DownloadIcon,
UploadIcon,
LogOutIcon,
UserIcon} from "vue-feather-icons";

Expand All @@ -39,7 +41,9 @@ export default {
ArrowUpIcon,
ArrowDownIcon,
LogOutIcon,
UserIcon
UserIcon,
DownloadIcon,
UploadIcon
},
props: {
icon: [String, Array],
Expand Down
Loading
Loading