From 2c6cc2c4fead8f7dd3ec3a9e7b172dd8eccf03f2 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Tue, 25 Jul 2023 14:04:47 -0400 Subject: [PATCH 01/18] [BI-1647] WIP --- src/views/import/Dataset.vue | 89 ++++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 3 deletions(-) diff --git a/src/views/import/Dataset.vue b/src/views/import/Dataset.vue index 8644384d5..9d0dc98aa 100644 --- a/src/views/import/Dataset.vue +++ b/src/views/import/Dataset.vue @@ -39,9 +39,76 @@ + + + {{ props.row.data.germplasmName }} + + + {{ props.row.data.studyName }} + + + {{ props.row.data.locationName }} + + + {{ props.row.data.observationUnitName }} + + + {{ props.row.data.observationUnitName }} + + + + + + \ No newline at end of file + From 696307ba18e0019cff877f6ca01a4f20774e663d Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Thu, 27 Jul 2023 09:52:03 -0400 Subject: [PATCH 02/18] [BI-1647] WIP --- src/breeding-insight/model/DatasetTableRow.ts | 83 +++++++++++++++++++ src/breeding-insight/model/ObservationUnit.ts | 6 +- src/views/import/Dataset.vue | 68 ++++++++++----- 3 files changed, 137 insertions(+), 20 deletions(-) create mode 100644 src/breeding-insight/model/DatasetTableRow.ts diff --git a/src/breeding-insight/model/DatasetTableRow.ts b/src/breeding-insight/model/DatasetTableRow.ts new file mode 100644 index 000000000..016685413 --- /dev/null +++ b/src/breeding-insight/model/DatasetTableRow.ts @@ -0,0 +1,83 @@ +/* + * 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 DatasetTableRow { + germplasmName?: string; + gid?: string; + tOrC?: string; + env?: string; + envLocation?: string; + envYear?: string; + expUnitId?: string; + expReplicate?: string; + expBlock?: string; + row?: string; + column?: string; + obsUnitId?: string; + traits?: string[] = []; + + + constructor(germplasmName?: string, + gid?: string, + tOrC?: string, + env?: string, + envLocation?: string, + envYear?: string, + expUnitId?: string, + expReplicate?: string, + expBlock?: string, + row?: string, + column?: string, + obsUnitId?: string, + traits?: string[]) { + this.germplasmName = germplasmName; + this.gid = gid; + this.tOrC = tOrC; + this.env = env; + this.envLocation = envLocation; + this.envYear = envYear; + this.expUnitId = expUnitId; + this.expReplicate = expReplicate; + this.expBlock = expBlock; + this.row = row; + this.column = column; + this.obsUnitId = obsUnitId; + this.traits = traits; + + } + + static assign(dataset: DatasetTableRow): DatasetTableRow { + + return new DatasetTableRow( + dataset.germplasmName, + dataset.gid, + dataset.tOrC, + dataset.env, + dataset.envLocation, + dataset.envYear, + dataset.expUnitId, + dataset.expReplicate, + dataset.expBlock, + dataset.row, + dataset.column, + dataset.obsUnitId, + dataset.traits + ); + } + + +} \ No newline at end of file diff --git a/src/breeding-insight/model/ObservationUnit.ts b/src/breeding-insight/model/ObservationUnit.ts index 14a24fc67..5cc4e1f77 100644 --- a/src/breeding-insight/model/ObservationUnit.ts +++ b/src/breeding-insight/model/ObservationUnit.ts @@ -15,15 +15,19 @@ * limitations under the License. */ +import {ExternalReferences} from "@/breeding-insight/brapi/model/externalReferences"; + export class ObservationUnit { id?: string; name?: string; position?: ObservationUnitPosition; + externalReferences?: ExternalReferences; - constructor(id?:string, name?:string, position?:ObservationUnitPosition) { + constructor(id?:string, name?:string, position?:ObservationUnitPosition, externalReferences?: ExternalReferences) { this.id = id; this.name = name; this.position = position; + this.externalReferences = externalReferences; } } diff --git a/src/views/import/Dataset.vue b/src/views/import/Dataset.vue index 9d0dc98aa..06f9742ca 100644 --- a/src/views/import/Dataset.vue +++ b/src/views/import/Dataset.vue @@ -19,16 +19,25 @@
loading dataset... - +
-
-
+
+
-
+
Observation unit: {{ observationUnit }}
Phenotypes: {{ phenotypesCount }}
Total observations: {{ totalObservationsCount }}
@@ -55,7 +64,7 @@ searchable :th-attrs="(column) => ({scope:'col'})" > - {{ props.row.data.germplasmName }} + {{ removeUnique(props.row.data.germplasmName) }} - {{ props.row.data.studyName }} + {{ removeUnique( props.row.data.studyName ) }} - {{ props.row.data.locationName }} + {{ removeUnique( props.row.data.locationName ) }} - {{ props.row.data.observationUnitName }} + {{ removeUnique( props.row.data.observationUnitName ) }} - {{ props.row.data.observationUnitName }} - - - + > + {{ getBreedingInsightId(props.row.data.externalReferences, "/observationunits") }} + + + {{ `"X";` }} + @@ -276,6 +288,10 @@ export default class Dataset extends ProgramsBase { return second.localeCompare(first); } } + + /* + * remove the '[....]' found at the end of the string + * */ removeUnique(str: string): string{ str = str.trim(); const reg = /\[[^\]]*\]$/; @@ -287,10 +303,18 @@ export default class Dataset extends ProgramsBase { let datasetTableRow: DatasetTableRow = new DatasetTableRow(); datasetTableRow.germplasmName = this.removeUnique(unit.germplasmName); + // GID + datasetTableRow.gid = ""; + if(unit.additionalInfo){ + datasetTableRow.gid = unit.additionalInfo.gid; + } + datasetTableRow.env = this.removeUnique(unit.studyName); datasetTableRow.envLocation = this.removeUnique(unit.locationName); datasetTableRow.expUnitId = this.removeUnique(unit.observationUnitName); datasetTableRow.obsUnitId = BrAPIUtils.getBreedingInsightId(unit.externalReferences, "/observationunits"); + + //Exp Replicate # and Exp Block # datasetTableRow.expReplicate = ""; datasetTableRow.expBlock = ""; if( unit.observationUnitPosition && unit.observationUnitPosition.observationLevelRelationships ){ @@ -304,9 +328,10 @@ export default class Dataset extends ProgramsBase { } } - datasetTableRow.row = ""; - datasetTableRow.column = ""; + // Column and Row if( unit.observationUnitPosition ){ + // Column + datasetTableRow.column = ""; if(unit.observationUnitPosition.positionCoordinateXType && unit.observationUnitPosition.positionCoordinateXType==='GRID_COL'){ datasetTableRow.column = unit.observationUnitPosition.positionCoordinateX; } @@ -314,6 +339,8 @@ export default class Dataset extends ProgramsBase { datasetTableRow.column = unit.observationUnitPosition.positionCoordinateY; } + // Row + datasetTableRow.row = ""; if(unit.observationUnitPosition.positionCoordinateXType && unit.observationUnitPosition.positionCoordinateXType==='GRID_ROW'){ datasetTableRow.row = unit.observationUnitPosition.positionCoordinateX; } @@ -321,6 +348,7 @@ export default class Dataset extends ProgramsBase { datasetTableRow.row = unit.observationUnitPosition.positionCoordinateY; } } + datasetTableRow.traitValues = this.unitDbId_to_traitValues[ unit.observationUnitDbId ]; this.datasetTableRows.push(datasetTableRow); } From 18a4713fb1b43cd243027f6d1a9413a29c061c41 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Tue, 1 Aug 2023 12:01:28 -0400 Subject: [PATCH 08/18] [BI-1647] reformat code --- src/views/import/Dataset.vue | 370 ++++++++++++++++++----------------- 1 file changed, 188 insertions(+), 182 deletions(-) diff --git a/src/views/import/Dataset.vue b/src/views/import/Dataset.vue index 56ef03a76..e9670a596 100644 --- a/src/views/import/Dataset.vue +++ b/src/views/import/Dataset.vue @@ -20,156 +20,165 @@
loading dataset...
-
-
-
-
-
- Observation unit: {{ observationUnit }}
- Phenotypes: {{ phenotypesCount }}
- Total observations: {{ totalObservationsCount }}
- Observations with data: {{ observationsWithData }}
- Observations without data: {{ observationsWithoutData }}
+
+
+
+
+
+ Observation unit: {{ observationUnit }}
+ Phenotypes: {{ + phenotypesCount + }}
+ Total observations: {{ + totalObservationsCount + }}
+ Observations with data: {{ + observationsWithData + }}
+ Observations without data: {{ + observationsWithoutData + }}
+
-
-
- - - {{ props.row.data.germplasmName }} - - - {{ props.row.data.gid }} - - - {{ props.row.data.env }} - - - {{ props.row.data.envLocation }} - - - {{ props.row.data.expUnitId }} - - - {{ props.row.data.expReplicate }} - - - {{ props.row.data.expBlock }} - - - {{ props.row.data.row }} - - - {{ props.row.data.column }} - - + - {{ props.row.data.obsUnitId }} - - - {{ props.row.data.traitValues[index] }} - - - + + {{ props.row.data.germplasmName }} + + + {{ props.row.data.gid }} + + + {{ props.row.data.env }} + + + {{ props.row.data.envLocation }} + + + {{ props.row.data.expUnitId }} + + + {{ props.row.data.expReplicate }} + + + {{ props.row.data.expBlock }} + + + {{ props.row.data.row }} + + + {{ props.row.data.column }} + + + {{ props.row.data.obsUnitId }} + + + {{ props.row.data.traitValues[index] }} + + +
@@ -213,7 +222,7 @@ export default class Dataset extends ProgramsBase { private unitDbId_to_traitValues = {}; - mounted () { + mounted() { this.load(); } @@ -224,18 +233,18 @@ export default class Dataset extends ProgramsBase { return this.$route.params.experimentId; } - get observationUnit(): string{ + get observationUnit(): string { let ou = "NA" - if(this.experiment && this.experiment.additionalInfo && this.experiment.additionalInfo.defaultObservationLevel){ + if (this.experiment && this.experiment.additionalInfo && this.experiment.additionalInfo.defaultObservationLevel) { ou = this.experiment.additionalInfo.defaultObservationLevel; } return ou; } - get phenotypesCount(): number{ + get phenotypesCount(): number { let count = 0; - if(this.datasetModel && this.datasetModel.observationVariables){ + if (this.datasetModel && this.datasetModel.observationVariables) { count = this.datasetModel.observationVariables.length; } return count @@ -244,7 +253,7 @@ export default class Dataset extends ProgramsBase { // Total observations get totalObservationsCount(): number { let count = "0"; - if(this.datasetModel && this.datasetModel.additionalInfo){ + if (this.datasetModel && this.datasetModel.additionalInfo) { count = this.datasetModel.additionalInfo.observations; } return count @@ -253,7 +262,7 @@ export default class Dataset extends ProgramsBase { // Observations with data get observationsWithData(): number { let count = "0"; - if(this.datasetModel && this.datasetModel.additionalInfo){ + if (this.datasetModel && this.datasetModel.additionalInfo) { count = this.datasetModel.additionalInfo.observationsWithData; } return count @@ -262,27 +271,28 @@ export default class Dataset extends ProgramsBase { // Observations without data get observationsWithoutData(): number { let count = "0"; - if(this.datasetModel && this.datasetModel.additionalInfo){ + if (this.datasetModel && this.datasetModel.additionalInfo) { count = this.datasetModel.additionalInfo.observationsWithoutData; } return count } - getBreedingInsightId(refs: ExternalReferences, source: string): string{ + + getBreedingInsightId(refs: ExternalReferences, source: string): string { return BrAPIUtils.getBreedingInsightId(refs, source); } - filterByObservations(index:number, propsRow, input){ + filterByObservations(index: number, propsRow, input) { let obsValue = propsRow.data.traitValues[index]; - obsValue = obsValue? obsValue: ""; //convert null or undefined to an empty string + obsValue = obsValue ? obsValue : ""; //convert null or undefined to an empty string return obsValue.includes(input); } sortObservations(index: number, a: any, b: any, isAsc: boolean) { let first = a.data.traitValues[index]; - first = first? first: ""; //convert null or undefined to an empty string + first = first ? first : ""; //convert null or undefined to an empty string let second = b.data.traitValues[index]; - second = second? second: ""; //convert null or undefined to an empty string - if(isAsc) { + second = second ? second : ""; //convert null or undefined to an empty string + if (isAsc) { return first.localeCompare(second); } else { return second.localeCompare(first); @@ -292,20 +302,20 @@ export default class Dataset extends ProgramsBase { /* * remove the '[....]' found at the end of the string * */ - removeUnique(str: string): string{ + removeUnique(str: string): string { str = str.trim(); const reg = /\[[^\]]*\]$/; return str.replace(reg, '').trim(); } - createDatasetTableRows (){ + createDatasetTableRows() { for (let unit of this.datasetModel.observationUnits) { let datasetTableRow: DatasetTableRow = new DatasetTableRow(); datasetTableRow.germplasmName = this.removeUnique(unit.germplasmName); // GID datasetTableRow.gid = ""; - if(unit.additionalInfo){ + if (unit.additionalInfo) { datasetTableRow.gid = unit.additionalInfo.gid; } @@ -317,46 +327,44 @@ export default class Dataset extends ProgramsBase { //Exp Replicate # and Exp Block # datasetTableRow.expReplicate = ""; datasetTableRow.expBlock = ""; - if( unit.observationUnitPosition && unit.observationUnitPosition.observationLevelRelationships ){ - for( const relationship of unit.observationUnitPosition.observationLevelRelationships){ - if (relationship.levelName === 'replicate'){ + if (unit.observationUnitPosition && unit.observationUnitPosition.observationLevelRelationships) { + for (const relationship of unit.observationUnitPosition.observationLevelRelationships) { + if (relationship.levelName === 'replicate') { datasetTableRow.expReplicate = relationship.levelOrder; } - if (relationship.levelName === 'block'){ + if (relationship.levelName === 'block') { datasetTableRow.expBlock = relationship.levelOrder; } } } // Column and Row - if( unit.observationUnitPosition ){ + if (unit.observationUnitPosition) { // Column datasetTableRow.column = ""; - if(unit.observationUnitPosition.positionCoordinateXType && unit.observationUnitPosition.positionCoordinateXType==='GRID_COL'){ + if (unit.observationUnitPosition.positionCoordinateXType && unit.observationUnitPosition.positionCoordinateXType === 'GRID_COL') { datasetTableRow.column = unit.observationUnitPosition.positionCoordinateX; - } - else if(unit.observationUnitPosition.positionCoordinateYType && unit.observationUnitPosition.positionCoordinateYType==='GRID_COL'){ + } else if (unit.observationUnitPosition.positionCoordinateYType && unit.observationUnitPosition.positionCoordinateYType === 'GRID_COL') { datasetTableRow.column = unit.observationUnitPosition.positionCoordinateY; } // Row datasetTableRow.row = ""; - if(unit.observationUnitPosition.positionCoordinateXType && unit.observationUnitPosition.positionCoordinateXType==='GRID_ROW'){ + if (unit.observationUnitPosition.positionCoordinateXType && unit.observationUnitPosition.positionCoordinateXType === 'GRID_ROW') { datasetTableRow.row = unit.observationUnitPosition.positionCoordinateX; - } - else if(unit.observationUnitPosition.positionCoordinateYType && unit.observationUnitPosition.positionCoordinateYType==='GRID_ROW'){ + } else if (unit.observationUnitPosition.positionCoordinateYType && unit.observationUnitPosition.positionCoordinateYType === 'GRID_ROW') { datasetTableRow.row = unit.observationUnitPosition.positionCoordinateY; } } - datasetTableRow.traitValues = this.unitDbId_to_traitValues[ unit.observationUnitDbId ]; + datasetTableRow.traitValues = this.unitDbId_to_traitValues[unit.observationUnitDbId]; this.datasetTableRows.push(datasetTableRow); } } createUnitDbId_to_traitValues(): {} { let unitDbId_to_traitValues = {}; - let arrayLength:number = this.phenotypesCount; + let arrayLength: number = this.phenotypesCount; let units: [ObservationUnit] = this.datasetModel.observationUnits; for (let unit of units) { @@ -369,33 +377,31 @@ export default class Dataset extends ProgramsBase { let unitDbId = observation.observationUnitDbId; let traitValueArray = unitDbId_to_traitValues[unitDbId]; traitValueArray[obsVar_index] = obs_value; - } + } return unitDbId_to_traitValues; } - createVariableDbId_to_index(): {}{ + createVariableDbId_to_index(): {} { let variableDbId_to_index = {} for (let index = 0; index < this.datasetModel.observationVariables.length; index++) { - variableDbId_to_index[ this.datasetModel.observationVariables[index].observationVariableDbId ] = index; + variableDbId_to_index[this.datasetModel.observationVariables[index].observationVariableDbId] = index; } return variableDbId_to_index; } - @Watch('$route') - async load () { + async load() { this.loading = true; //Set this.experiment - let experimentResult = await ExperimentService.getSingleExperiment(this.activeProgram!.id!, this.experimentUUID,false); + let experimentResult = await ExperimentService.getSingleExperiment(this.activeProgram!.id!, this.experimentUUID, false); this.experiment = experimentResult.value; - if( this.datasetId==='observation'){ + if (this.datasetId === 'observation') { this.resultDatasetId = this.experiment.additionalInfo.observationDatasetId; - } - else{ + } else { this.resultDatasetId = this.datasetId; } From 331b642c112bd282fbef1369ce096fd6d5bf86f6 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Tue, 1 Aug 2023 15:52:27 -0400 Subject: [PATCH 09/18] [BI-1647] tighten up code --- src/breeding-insight/model/DatasetModel.ts | 35 +++++----- src/breeding-insight/model/Experiment.ts | 69 +++++++++++++++++++ src/breeding-insight/model/ObservationUnit.ts | 40 +++++++++-- .../model/ObservationVariable.ts | 6 +- src/breeding-insight/utils/BrAPIUtils.ts | 3 +- src/views/experiment/Experiments.vue | 58 ++++++++++++++++ src/views/import/Dataset.vue | 21 +++--- 7 files changed, 196 insertions(+), 36 deletions(-) create mode 100644 src/breeding-insight/model/Experiment.ts create mode 100644 src/views/experiment/Experiments.vue diff --git a/src/breeding-insight/model/DatasetModel.ts b/src/breeding-insight/model/DatasetModel.ts index d2feeb5ab..1acd5016b 100644 --- a/src/breeding-insight/model/DatasetModel.ts +++ b/src/breeding-insight/model/DatasetModel.ts @@ -20,21 +20,22 @@ import {ObservationUnit} from "@/breeding-insight/model/ObservationUnit"; import {ObservationVariable} from "@/breeding-insight/model/ObservationVariable"; export class DatasetModel { - id?: string; - experimentId?: string; + id: string; + experimentId: string; + data: Observation[]; + observationUnits: ObservationUnit[]; + observationVariables: ObservationVariable[]; additionalInfo?: any; - data?: Observation[]; - observationUnits?: ObservationUnit[]; - observationVariables?: ObservationVariable[]; - - - constructor(id?: string, - experimentId?: string, - additionalInfo?: any, - data?: Observation[], - observationUnits?: ObservationUnit[], - observationVariables?: ObservationVariable[] - ) { + + + + constructor(id: string, + experimentId: string, + data: Observation[], + observationUnits: ObservationUnit[], + observationVariables: ObservationVariable[], + additionalInfo?: any + ) { this.id = id; this.experimentId = experimentId; this.additionalInfo = additionalInfo; @@ -48,10 +49,10 @@ export class DatasetModel { return new DatasetModel( dataset.id, dataset.experimentId, - dataset.additionalInfo, dataset.data, - dataset.observationUnits - ); + dataset.observationUnits, + dataset.additionalInfo + ); } equals(dataset?: DatasetModel): boolean { diff --git a/src/breeding-insight/model/Experiment.ts b/src/breeding-insight/model/Experiment.ts new file mode 100644 index 000000000..6a61cccbf --- /dev/null +++ b/src/breeding-insight/model/Experiment.ts @@ -0,0 +1,69 @@ +/* + * 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. + */ + +import {ExternalReferences} from "@/breeding-insight/brapi/model/externalReferences"; + +export class Experiment { + trialDbId?: string; + active?: boolean; + additionalInfo?: any; + externalReferences?: ExternalReferences; + programDbId?: string; + programName?: string; + trialDescription?: string; + trialName?: string; + + constructor(trialDbId?: string, + active?: boolean, + additionalInfo?: any, + externalReferences?: ExternalReferences, + programDbId?: string, + programName?: string, + trialDescription?: string, + trialName?: string + ) { + this.trialDbId = trialDbId; + this.active = active; + this.additionalInfo = additionalInfo; + this.externalReferences = externalReferences; + this.programDbId = programDbId; + this.trialDescription = trialDescription; + this.trialName = trialName; + } + + + static assign(experiment: Experiment): Experiment { + + return new Experiment( + experiment.trialDbId, + experiment.active, + experiment.additionalInfo, + experiment.externalReferences, + experiment.programDbId, + experiment.programName, + experiment.trialDescription, + experiment.trialName + ); + } + + equals(experiment?: Experiment): boolean { + if (!experiment) { + return false; + } + return (this.trialDbId === experiment.trialDbId); + } +} \ No newline at end of file diff --git a/src/breeding-insight/model/ObservationUnit.ts b/src/breeding-insight/model/ObservationUnit.ts index a7023a8cf..f22c69751 100644 --- a/src/breeding-insight/model/ObservationUnit.ts +++ b/src/breeding-insight/model/ObservationUnit.ts @@ -18,12 +18,26 @@ import {ExternalReferences} from "@/breeding-insight/brapi/model/externalReferences"; export class ObservationUnit { - observationUnitDbId?: string; + observationUnitDbId: string; + germplasmDbId?: string; + germplasmName: string; + locationDbI?: string; + locationName: string; observationUnitName?: string; + observationUnitPUI?: string; + programDbId?: string; + programName?: string; + studyDbId?: string; + studyName: string; + trialDbId?: string; + trialName?: string; observationUnitPosition?: ObservationUnitPosition; externalReferences?: ExternalReferences; - - constructor(observationUnitDbId?:string, observationUnitName?:string, observationUnitPosition?:ObservationUnitPosition, externalReferences?: ExternalReferences) { + additionalInfo?: any; + treatments?: any; + + + constructor(observationUnitDbId:string, observationUnitName?:string, observationUnitPosition?:ObservationUnitPosition, externalReferences?: ExternalReferences) { this.observationUnitDbId = observationUnitDbId; this.observationUnitName = observationUnitName; this.observationUnitPosition = observationUnitPosition; @@ -34,20 +48,34 @@ export class ObservationUnit { export class ObservationUnitPosition { level?: string; observationLevelRelationships?: ObservationLevelRelationship[]; + positionCoordinateXType?: string; + positionCoordinateX?: string; + positionCoordinateYType?: string; + positionCoordinateY?: string; - constructor(level?:string, observationLevelRelationships?: ObservationLevelRelationship[]) { + constructor(level?:string, + observationLevelRelationships?: ObservationLevelRelationship[], + positionCoordinateXType?: string, + positionCoordinateX?: string, + positionCoordinateYType?: string, + positionCoordinateY?: string, + ) { this.level = level; this.observationLevelRelationships = observationLevelRelationships; + this.positionCoordinateXType = positionCoordinateXType; + this.positionCoordinateX = positionCoordinateX; + this.positionCoordinateYType = positionCoordinateYType; + this.positionCoordinateY = positionCoordinateY; } } export class ObservationLevelRelationship { levelName?: string; - levelOrder?: number; + levelOrder?: string; levelCode?: string; - constructor(levelName?: string, levelOrder?: number, levelCode?: string) { + constructor(levelName?: string, levelOrder?: string, levelCode?: string) { this.levelName = levelName; this.levelOrder = levelOrder; this.levelCode = levelCode; diff --git a/src/breeding-insight/model/ObservationVariable.ts b/src/breeding-insight/model/ObservationVariable.ts index 828028ad4..7e044399a 100644 --- a/src/breeding-insight/model/ObservationVariable.ts +++ b/src/breeding-insight/model/ObservationVariable.ts @@ -21,20 +21,20 @@ import {Scale} from "@/breeding-insight/model/Scale"; // TODO: eventually refactor Trait into Observation Variable to be consistent with the BrAPI model export class ObservationVariable { - id?: string; + observationVariableDbId?: string; observationVariableName?: string; additionalInfo?: OVAdditionalInfo; trait?: Trait; method?: Method; scale?: Scale; - constructor(id?:string, + constructor(observationVariableDbId?:string, observationVariableName?:string, additionalInfo?:OVAdditionalInfo, trait?:Trait, method?:Method, scale?:Scale) { - this.id = id; + this.observationVariableDbId = observationVariableDbId; this.observationVariableName = observationVariableName; if (additionalInfo){ this.additionalInfo = OVAdditionalInfo.assign({...additionalInfo} as OVAdditionalInfo); diff --git a/src/breeding-insight/utils/BrAPIUtils.ts b/src/breeding-insight/utils/BrAPIUtils.ts index 1f9b3cf78..232562dc6 100644 --- a/src/breeding-insight/utils/BrAPIUtils.ts +++ b/src/breeding-insight/utils/BrAPIUtils.ts @@ -18,7 +18,8 @@ import {ExternalReferences} from "@/breeding-insight/brapi/model/externalReferences"; export class BrAPIUtils { - static getBreedingInsightId(references: ExternalReferences, referenceSourcePath: string = ""): string | undefined { + static getBreedingInsightId(references: ExternalReferences|undefined, referenceSourcePath: string = ""): string | undefined { + if(!references){ return undefined; } let val = references.find(ref => ref.referenceSource === process.env.VUE_APP_BI_REFERENCE_SOURCE + referenceSourcePath); return val ? val.referenceID : ""; } diff --git a/src/views/experiment/Experiments.vue b/src/views/experiment/Experiments.vue new file mode 100644 index 000000000..6960a9218 --- /dev/null +++ b/src/views/experiment/Experiments.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/views/import/Dataset.vue b/src/views/import/Dataset.vue index e9670a596..a4707f4dc 100644 --- a/src/views/import/Dataset.vue +++ b/src/views/import/Dataset.vue @@ -198,6 +198,7 @@ import ExpandableTable from "@/components/tables/expandableTable/ExpandableTable import {BrAPIUtils} from "@/breeding-insight/utils/BrAPIUtils"; import {ExternalReferences} from "@/breeding-insight/brapi/model/externalReferences"; import {DatasetTableRow} from "@/breeding-insight/model/DatasetTableRow"; +import {Experiment} from "@/breeding-insight/model/Experiment"; import {dmyFormat} from "@/breeding-insight/utils/filters"; @Component({ @@ -212,11 +213,11 @@ import {dmyFormat} from "@/breeding-insight/utils/filters"; }) export default class Dataset extends ProgramsBase { private activeProgram: Program; - private datasetModel: DatasetModel = []; + private datasetModel: DatasetModel; private experiment: Experiment; private observationUnits: ObservationUnit[] = []; private loading: boolean = true; - private resultDatasetId: string; + private resultDatasetId: string | undefined; private paginationController: PaginationController = new PaginationController(); private datasetTableRows: DatasetTableRow[] = []; @@ -251,7 +252,7 @@ export default class Dataset extends ProgramsBase { } // Total observations - get totalObservationsCount(): number { + get totalObservationsCount(): string { let count = "0"; if (this.datasetModel && this.datasetModel.additionalInfo) { count = this.datasetModel.additionalInfo.observations; @@ -260,7 +261,7 @@ export default class Dataset extends ProgramsBase { } // Observations with data - get observationsWithData(): number { + get observationsWithData(): string { let count = "0"; if (this.datasetModel && this.datasetModel.additionalInfo) { count = this.datasetModel.additionalInfo.observationsWithData; @@ -269,7 +270,7 @@ export default class Dataset extends ProgramsBase { } // Observations without data - get observationsWithoutData(): number { + get observationsWithoutData(): string { let count = "0"; if (this.datasetModel && this.datasetModel.additionalInfo) { count = this.datasetModel.additionalInfo.observationsWithoutData; @@ -277,11 +278,12 @@ export default class Dataset extends ProgramsBase { return count } - getBreedingInsightId(refs: ExternalReferences, source: string): string { + getBreedingInsightId(refs: ExternalReferences, source: string): string | undefined { return BrAPIUtils.getBreedingInsightId(refs, source); } - filterByObservations(index: number, propsRow, input) { + filterByObservations(index: number, propsRow: any, input: string) { + console.log(Object.prototype.toString.call(propsRow) ); let obsValue = propsRow.data.traitValues[index]; obsValue = obsValue ? obsValue : ""; //convert null or undefined to an empty string return obsValue.includes(input); @@ -302,7 +304,8 @@ export default class Dataset extends ProgramsBase { /* * remove the '[....]' found at the end of the string * */ - removeUnique(str: string): string { + removeUnique(str: string|undefined): string { + if(!str){ return "";} str = str.trim(); const reg = /\[[^\]]*\]$/; return str.replace(reg, '').trim(); @@ -366,7 +369,7 @@ export default class Dataset extends ProgramsBase { let unitDbId_to_traitValues = {}; let arrayLength: number = this.phenotypesCount; - let units: [ObservationUnit] = this.datasetModel.observationUnits; + let units: ObservationUnit[] = this.datasetModel.observationUnits; for (let unit of units) { unitDbId_to_traitValues[unit.observationUnitDbId] = new Array(arrayLength); } From 9340faf18ed143d6804f2bc97eb5c6d68f638d8c Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Tue, 1 Aug 2023 15:57:05 -0400 Subject: [PATCH 10/18] [BI-1647] WIP --- src/views/experiment/Experiments.vue | 58 ---------------------------- 1 file changed, 58 deletions(-) delete mode 100644 src/views/experiment/Experiments.vue diff --git a/src/views/experiment/Experiments.vue b/src/views/experiment/Experiments.vue deleted file mode 100644 index 6960a9218..000000000 --- a/src/views/experiment/Experiments.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - From 0100301a7c03363797dde0555b98ef21a636c808 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Wed, 2 Aug 2023 09:23:02 -0400 Subject: [PATCH 11/18] [BI-1647] add dummy code for tOrC --- src/views/import/Dataset.vue | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/views/import/Dataset.vue b/src/views/import/Dataset.vue index a4707f4dc..f07a05fb3 100644 --- a/src/views/import/Dataset.vue +++ b/src/views/import/Dataset.vue @@ -80,6 +80,17 @@ > {{ props.row.data.gid }} + + {{ props.row.data.tOrC }} + Date: Wed, 2 Aug 2023 15:03:37 -0400 Subject: [PATCH 12/18] [BI-1647] added support for tOrC and fixed bugs related to Replicate # and Block # --- src/breeding-insight/model/DatasetTableRow.ts | 8 ++++---- src/breeding-insight/model/ObservationUnit.ts | 7 +++++-- src/views/import/Dataset.vue | 14 +++++++------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/breeding-insight/model/DatasetTableRow.ts b/src/breeding-insight/model/DatasetTableRow.ts index 244f31cad..ab4afbaf7 100644 --- a/src/breeding-insight/model/DatasetTableRow.ts +++ b/src/breeding-insight/model/DatasetTableRow.ts @@ -23,8 +23,8 @@ export class DatasetTableRow { envLocation?: string; envYear?: string; expUnitId?: string; - expReplicate?: string; - expBlock?: string; + expReplicate?: number; + expBlock?: number; row?: string; column?: string; obsUnitId?: string; @@ -38,8 +38,8 @@ export class DatasetTableRow { envLocation?: string, envYear?: string, expUnitId?: string, - expReplicate?: string, - expBlock?: string, + expReplicate?: number, + expBlock?: number, row?: string, column?: string, obsUnitId?: string, diff --git a/src/breeding-insight/model/ObservationUnit.ts b/src/breeding-insight/model/ObservationUnit.ts index f22c69751..c6736b73c 100644 --- a/src/breeding-insight/model/ObservationUnit.ts +++ b/src/breeding-insight/model/ObservationUnit.ts @@ -52,6 +52,7 @@ export class ObservationUnitPosition { positionCoordinateX?: string; positionCoordinateYType?: string; positionCoordinateY?: string; + entryType?: string; constructor(level?:string, observationLevelRelationships?: ObservationLevelRelationship[], @@ -59,6 +60,7 @@ export class ObservationUnitPosition { positionCoordinateX?: string, positionCoordinateYType?: string, positionCoordinateY?: string, + entryType?: string, ) { this.level = level; this.observationLevelRelationships = observationLevelRelationships; @@ -66,6 +68,7 @@ export class ObservationUnitPosition { this.positionCoordinateX = positionCoordinateX; this.positionCoordinateYType = positionCoordinateYType; this.positionCoordinateY = positionCoordinateY; + this.entryType = entryType } } @@ -73,9 +76,9 @@ export class ObservationUnitPosition { export class ObservationLevelRelationship { levelName?: string; levelOrder?: string; - levelCode?: string; + levelCode?: number; - constructor(levelName?: string, levelOrder?: string, levelCode?: string) { + constructor(levelName?: string, levelOrder?: string, levelCode?: number) { this.levelName = levelName; this.levelOrder = levelOrder; this.levelCode = levelCode; diff --git a/src/views/import/Dataset.vue b/src/views/import/Dataset.vue index f07a05fb3..845b4d73e 100644 --- a/src/views/import/Dataset.vue +++ b/src/views/import/Dataset.vue @@ -54,7 +54,7 @@
Date: Mon, 7 Aug 2023 09:39:30 -0400 Subject: [PATCH 13/18] [BI-1647] Fix pagination bugs, add T or C to dataset table --- src/views/import/Dataset.vue | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/views/import/Dataset.vue b/src/views/import/Dataset.vue index 845b4d73e..1f5d70c3b 100644 --- a/src/views/import/Dataset.vue +++ b/src/views/import/Dataset.vue @@ -56,7 +56,7 @@ v-bind:records.sync="datasetTableRows" v-bind:loading=false v-bind:pagination="paginationController" - v-bind:default-sort="['observationUnits.germplasmName', 'asc']" + v-bind:default-sort="['data.germplasmName', 'asc']" v-bind:debounce-search="400" v-on:show-error-notification="$emit('show-error-notification', $event)" > @@ -181,8 +181,10 @@ sortable searchable :th-attrs="(column) => ({scope:'col'})" + :td-attrs="cellClassIfEmpty" + :meta="{'index': index}" > - {{ props.row.data.traitValues[index] }} + {{ props.row.data.traitValues[index] }}