From 4732df56847bcb66e78facd0f45b2cbd43c473a0 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Fri, 19 Dec 2025 17:23:34 -0800 Subject: [PATCH 01/14] create guide sets with drag & drop for combined plots --- webapp/TargetedMS/js/QCPlotHelperBase.js | 20 +++++++++++++++++++- webapp/TargetedMS/js/QCPlotHelperWrapper.js | 13 +++++++------ webapp/TargetedMS/js/QCTrendPlotPanel.js | 8 ++++---- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/webapp/TargetedMS/js/QCPlotHelperBase.js b/webapp/TargetedMS/js/QCPlotHelperBase.js index 935e91b88..652739377 100644 --- a/webapp/TargetedMS/js/QCPlotHelperBase.js +++ b/webapp/TargetedMS/js/QCPlotHelperBase.js @@ -694,7 +694,7 @@ Ext4.define("LABKEY.targetedms.QCPlotHelperBase", { return precursor; }, - addEachCombinedPrecursorPlot: function(plotIndex, id, combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, plotType, isCUSUMMean) { + addEachCombinedPrecursorPlot: function(plotIndex, id, combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, plotType, isCUSUMMean, scope) { let plotLegendData = this.getCombinedPlotLegendData(metricProps, groupColors, yAxisCount, plotType, isCUSUMMean); if (plotType !== LABKEY.vis.TrendingLinePlotType.CUSUM) { @@ -794,6 +794,24 @@ Ext4.define("LABKEY.targetedms.QCPlotHelperBase", { visibility: this.isMultiSeries() ? undefined : 'hidden' } }, + brushing: !this.allowGuideSetBrushing() ? undefined : { + dimension: 'x', + fillOpacity: 0.4, + fillColor: 'rgba(20, 204, 201, 1)', + strokeColor: 'rgba(20, 204, 201, 1)', + brushstart: function(event, data, extent, plot, layerSelections) { + scope.plotBrushStartEvent(plot); + }, + brush: function(event, data, extent, plot, layerSelections) { + scope.plotBrushEvent(extent, plot, layerSelections); + }, + brushend: function(event, data, extent, plot, layerSelections) { + scope.plotBrushEndEvent(data[data.length - 1], extent, plot); + }, + brushclear: function(event, data, plot, layerSelections) { + scope.plotBrushClearEvent(data[data.length - 1], plot); + } + }, properties: trendLineProps }); diff --git a/webapp/TargetedMS/js/QCPlotHelperWrapper.js b/webapp/TargetedMS/js/QCPlotHelperWrapper.js index 0178168c7..4a954f7ca 100644 --- a/webapp/TargetedMS/js/QCPlotHelperWrapper.js +++ b/webapp/TargetedMS/js/QCPlotHelperWrapper.js @@ -128,6 +128,7 @@ Ext4.define("LABKEY.targetedms.QCPlotHelperWrapper", { }, addCombinedPeptideSinglePlot : function(metricProps) { + const me = this; // for plot brushing let yAxisCount = this.isMultiSeries() ? 2 : 1, //Will only have a right if there is already a left y-axis groupColors = this.getColorRange(), combinePlotData = this.getCombinedPlotInitData(), @@ -195,22 +196,22 @@ Ext4.define("LABKEY.targetedms.QCPlotHelperWrapper", { legendMargin = 300; if (this.showMetricValuePlot()) { - this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex++], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.LeveyJennings); + this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex++], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.LeveyJennings, false, me); } if (this.showMovingRangePlot()) { - this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex++], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.MovingRange); + this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex++], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.MovingRange, false, me); } if (this.showMeanCUSUMPlot()) { - this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex++], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.CUSUM, true); + this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex++], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.CUSUM, true, me); } if (this.showVariableCUSUMPlot()) { - this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.CUSUM, false); + this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.CUSUM, false, me); } if (this.showTrailingMeanPlot()) { - this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.TrailingMean, false); + this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.TrailingMean, false, me); } if (this.showTrailingCVPlot()) { - this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.TrailingCV, false); + this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.TrailingCV, false, me); } diff --git a/webapp/TargetedMS/js/QCTrendPlotPanel.js b/webapp/TargetedMS/js/QCTrendPlotPanel.js index f22fbb0b9..a28333edc 100644 --- a/webapp/TargetedMS/js/QCTrendPlotPanel.js +++ b/webapp/TargetedMS/js/QCTrendPlotPanel.js @@ -1169,7 +1169,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { if (!this.createGuideSetToggleButton) { this.createGuideSetToggleButton = Ext4.create('Ext.button.Button', { text: 'Create Guide Set', - tooltip: 'Enable/disable guide set creation mode. Supported for separate plots, not grouped by date, when ' + LABKEY.targetedms.QCPlotHelperBase.maxPointsPerSeries + ' or fewer samples are shown', + tooltip: 'Enable/disable guide set creation mode. Supported for plots not grouped by date, when ' + LABKEY.targetedms.QCPlotHelperBase.maxPointsPerSeries + ' or fewer samples are shown', disabled: !this.canCreateGuideSetFromPlot(), enableToggle: true, handler: function(btn) { @@ -1183,11 +1183,11 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { }, canCreateGuideSetFromPlot : function() { - return !(this.groupedX || this.singlePlot || this.isMultiSeries() || this.showExpRunRange || !this.showDataPoints); + return !(this.groupedX || this.isMultiSeries() || this.showExpRunRange || !this.showDataPoints); }, setBrushingEnabled : function(enabled) { - // we don't currently allow creation of guide sets in single plot mode, grouped x-axis mode, multi series mode or when showingExpRunRange + // we don't currently allow creation of guide sets in grouped x-axis mode, multi series mode or when showingExpRunRange this.getGuideSetCreateButton().setDisabled(!this.canCreateGuideSetFromPlot()); this.enableBrushing = enabled; @@ -1561,7 +1561,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { }, allowGuideSetBrushing : function() { - return this.canUserEdit() && !this.groupedX; + return this.canUserEdit() && !this.groupedX && !this.isMultiSeries(); }, createGuideSetSvgButton : function(plot, text, xLeftPos, width) { From c4b24dcd41629388ee0a810c7a43fb489bf8022d Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Tue, 23 Dec 2025 12:52:05 -0800 Subject: [PATCH 02/14] enable create guide sets for multi metrics plots --- webapp/TargetedMS/js/QCTrendPlotPanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/TargetedMS/js/QCTrendPlotPanel.js b/webapp/TargetedMS/js/QCTrendPlotPanel.js index e888b7751..dad2c7674 100644 --- a/webapp/TargetedMS/js/QCTrendPlotPanel.js +++ b/webapp/TargetedMS/js/QCTrendPlotPanel.js @@ -1183,7 +1183,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { }, canCreateGuideSetFromPlot : function() { - return !(this.groupedX || this.isMultiSeries() || this.showExpRunRange || !this.showDataPoints); + return !(this.groupedX || this.showExpRunRange || !this.showDataPoints); }, setBrushingEnabled : function(enabled) { @@ -1561,7 +1561,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { }, allowGuideSetBrushing : function() { - return this.canUserEdit() && !this.groupedX && !this.isMultiSeries(); + return this.canUserEdit() && !this.groupedX ; }, createGuideSetSvgButton : function(plot, text, xLeftPos, width) { From a1eaf62d62d93a22902f06bdd79465dc499a3ba2 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 24 Dec 2025 11:55:51 -0800 Subject: [PATCH 03/14] enable create guide sets for grouped by date plots --- webapp/TargetedMS/js/QCPlotHelperWrapper.js | 2 +- webapp/TargetedMS/js/QCTrendPlotPanel.js | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/webapp/TargetedMS/js/QCPlotHelperWrapper.js b/webapp/TargetedMS/js/QCPlotHelperWrapper.js index 4a954f7ca..686efef74 100644 --- a/webapp/TargetedMS/js/QCPlotHelperWrapper.js +++ b/webapp/TargetedMS/js/QCPlotHelperWrapper.js @@ -214,7 +214,7 @@ Ext4.define("LABKEY.targetedms.QCPlotHelperWrapper", { this.addEachCombinedPrecursorPlot(plotIndex, ids[plotIndex], combinePlotData, groupColors, yAxisCount, metricProps, showLogInvalid, legendMargin, LABKEY.vis.TrendingLinePlotType.TrailingCV, false, me); } - + this.setPlotBrushingDisplayStyle(); return true; }, diff --git a/webapp/TargetedMS/js/QCTrendPlotPanel.js b/webapp/TargetedMS/js/QCTrendPlotPanel.js index dad2c7674..5cb89ed5a 100644 --- a/webapp/TargetedMS/js/QCTrendPlotPanel.js +++ b/webapp/TargetedMS/js/QCTrendPlotPanel.js @@ -1183,11 +1183,11 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { }, canCreateGuideSetFromPlot : function() { - return !(this.groupedX || this.showExpRunRange || !this.showDataPoints); + return !(this.showExpRunRange || !this.showDataPoints); }, setBrushingEnabled : function(enabled) { - // we don't currently allow creation of guide sets in grouped x-axis mode, multi series mode or when showingExpRunRange + // we don't currently allow creation when showingExpRunRange this.getGuideSetCreateButton().setDisabled(!this.canCreateGuideSetFromPlot()); this.enableBrushing = enabled; @@ -1552,7 +1552,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { this.bringSvgElementToFront(plot, "g.guideset-svg-button"); }, - plotBrushClearEvent : function(data, plot) { + plotBrushClearEvent : function() { this.plotBrushSelection = undefined; }, @@ -1561,7 +1561,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { }, allowGuideSetBrushing : function() { - return this.canUserEdit() && !this.groupedX ; + return this.canUserEdit(); }, createGuideSetSvgButton : function(plot, text, xLeftPos, width) { @@ -1586,8 +1586,9 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { setPlotBrushingDisplayStyle : function() { // hide the brushing related components for all plots if not in "create guide set" mode var displayStyle = this.enableBrushing ? 'inline' : 'none'; - d3.selectAll('.brush').style({'display': displayStyle}); - d3.selectAll('.x-axis-handle').style({'display': displayStyle}); + // Scope the selection to only plots within the current plotDivId to avoid affecting other plot types + d3.select('#' + this.plotDivId).selectAll('.brush').style({'display': displayStyle}); + d3.select('#' + this.plotDivId).selectAll('.x-axis-handle').style({'display': displayStyle}); }, clearPlotBrush : function(plot) { From 675cd4f3be07072a8ebe4f19842fad7aaca07e0c Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 24 Dec 2025 12:05:10 -0800 Subject: [PATCH 04/14] update tooltip --- webapp/TargetedMS/js/QCTrendPlotPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/TargetedMS/js/QCTrendPlotPanel.js b/webapp/TargetedMS/js/QCTrendPlotPanel.js index 5cb89ed5a..89489a698 100644 --- a/webapp/TargetedMS/js/QCTrendPlotPanel.js +++ b/webapp/TargetedMS/js/QCTrendPlotPanel.js @@ -1169,7 +1169,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { if (!this.createGuideSetToggleButton) { this.createGuideSetToggleButton = Ext4.create('Ext.button.Button', { text: 'Create Guide Set', - tooltip: 'Enable/disable guide set creation mode. Supported for plots not grouped by date, when ' + LABKEY.targetedms.QCPlotHelperBase.maxPointsPerSeries + ' or fewer samples are shown', + tooltip: 'Enable/disable guide set creation mode. Supported for plots, when ' + LABKEY.targetedms.QCPlotHelperBase.maxPointsPerSeries + ' or fewer samples are shown', disabled: !this.canCreateGuideSetFromPlot(), enableToggle: true, handler: function(btn) { From 4a11cf8bfa5f7a2aa4e129d35fb4fa1e639f6bb4 Mon Sep 17 00:00:00 2001 From: Ankur Juneja Date: Mon, 29 Dec 2025 09:59:43 -0800 Subject: [PATCH 05/14] Update webapp/TargetedMS/js/QCTrendPlotPanel.js Co-authored-by: Josh Eckels --- webapp/TargetedMS/js/QCTrendPlotPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/TargetedMS/js/QCTrendPlotPanel.js b/webapp/TargetedMS/js/QCTrendPlotPanel.js index 89489a698..f13723daf 100644 --- a/webapp/TargetedMS/js/QCTrendPlotPanel.js +++ b/webapp/TargetedMS/js/QCTrendPlotPanel.js @@ -1169,7 +1169,7 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { if (!this.createGuideSetToggleButton) { this.createGuideSetToggleButton = Ext4.create('Ext.button.Button', { text: 'Create Guide Set', - tooltip: 'Enable/disable guide set creation mode. Supported for plots, when ' + LABKEY.targetedms.QCPlotHelperBase.maxPointsPerSeries + ' or fewer samples are shown', + tooltip: 'Enable/disable guide set creation mode. Supported for plots when ' + LABKEY.targetedms.QCPlotHelperBase.maxPointsPerSeries + ' or fewer samples are shown', disabled: !this.canCreateGuideSetFromPlot(), enableToggle: true, handler: function(btn) { From 9dcf3076a8f94aec2a454e3c1740ec03a3114373 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Mon, 29 Dec 2025 15:22:15 -0800 Subject: [PATCH 06/14] support for automation testing --- .../targetedms/TargetedMSQCGuideSetTest.java | 50 +++++++++++++------ webapp/TargetedMS/js/QCPlotHelperBase.js | 1 + 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java index 89af0cb8f..ec24b15b5 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java @@ -113,6 +113,7 @@ public void runTestsInOrder() throws IOException, CommandException { testGuideSetStats(); testGuideSetCreateValidation(); + testCombinedPlotsGuideSetCreation(); testGuideSetPlotDisplay(); testParetoPlot(); testEmptyParetoPlot(); @@ -140,7 +141,7 @@ private void createQueries() "LEFT JOIN QCMetric_" + metricName + " as p\n" + " ON p.SampleFileId.AcquiredTime >= gs.TrainingStart AND p.SampleFileId.AcquiredTime <= gs.TrainingEnd\n" + "LEFT JOIN PrecursorChromInfo pci ON p.precursorchrominfoid = pci.Id\n" + - "GROUP BY gs.RowId, gs.TrainingStart, gs.TrainingEnd, gs.ReferenceEnd, \n"+ + "GROUP BY gs.RowId, gs.TrainingStart, gs.TrainingEnd, gs.ReferenceEnd, \n" + " pci.PrecursorId.PeptideId.Sequence, pci.PrecursorId.Charge, \n" + "pci.PrecursorId.ModifiedSequence, pci.MoleculePrecursorId.CustomIonName, \n" + "pci.MoleculePrecursorId.IonFormula, pci.MoleculePrecursorId.massMonoisotopic, pci.MoleculePrecursorId.massAverage, \n" + @@ -182,6 +183,23 @@ public void testGuideSetCreateValidation() createGuideSet(new GuideSet("", "", null, 47), overlapErrorMsg); } + + private void testCombinedPlotsGuideSetCreation() + { + preTest(); + PanoramaDashboard qcDashboard = new PanoramaDashboard(this); + QCPlotsWebPart qcPlotsWebPart = qcDashboard.getQcPlotsWebPart(); + qcPlotsWebPart.resetInitialQCPlotFields(); + qcPlotsWebPart.setShowAllPeptidesInSinglePlot(true, 1); + + GuideSet gsCombined = new GuideSet("2013/08/17 16:01:37", "2013/08/20 13:35:16", "guide set created from combined plots"); + createGuideSet(gsCombined); + + clickTab("Guide Sets"); + DataRegionTable table = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); + assertEquals("Guide set was not created from combined plots", 6, table.getDataRowCount()); + } + public void testGuideSetPlotDisplay() { preTest(); @@ -249,7 +267,7 @@ public void testParetoPlot() QCPlotsWebPart.MetricType.FWB, QCPlotsWebPart.MetricType.TIC_AREA, QCPlotsWebPart.MetricType.ISOTOPE_DOTP - ); + ); verifyNavigationToPanoramaDashboard(guideSetId, 0, QCPlotsWebPart.MetricType.TOTAL_PEAK, true); clickAndWait(Locator.linkWithText("Pareto Plot")); //go to Pareto Plot tab @@ -339,7 +357,7 @@ public void testEmptyParetoPlot() ParetoPlotsWebPart paretoPlotsWebPart = paretoPage.getParetoPlotsWebPart(); paretoPlotsWebPart.verifyEmpty(); - } + } public void testSmallMoleculePareto() throws IOException, CommandException { @@ -362,10 +380,10 @@ public void testSmallMoleculePareto() throws IOException, CommandException ParetoPlotsWebPart paretoPlotsWebPart = paretoPage.getParetoPlotsWebPart(); verifyTicksOnPlots(paretoPlotsWebPart, 1, QCPlotsWebPart.QCPlotType.MetricValue, - QCPlotsWebPart.MetricType.FWB, - QCPlotsWebPart.MetricType.FWHM, - QCPlotsWebPart.MetricType.RETENTION, - QCPlotsWebPart.MetricType.TRANSITION_AREA); + QCPlotsWebPart.MetricType.FWB, + QCPlotsWebPart.MetricType.FWHM, + QCPlotsWebPart.MetricType.RETENTION, + QCPlotsWebPart.MetricType.TRANSITION_AREA); clickExportPDFIcon("chart-render-div", 0); clickExportPNGIcon("chart-render-div", 0); @@ -382,17 +400,17 @@ public void testReplicateAnnotations() throws IOException, CommandException selectQuery("targetedms", "Replicate"); //confirm table columns are present and of correct type representing replicate annotations: GetQueryDetailsCommand queryDetailsCommand = new GetQueryDetailsCommand("targetedms", "Replicate"); - GetQueryDetailsResponse queryDetailsResponse = queryDetailsCommand.execute(createDefaultConnection(),getProjectName() + "/" + folderName); + GetQueryDetailsResponse queryDetailsResponse = queryDetailsCommand.execute(createDefaultConnection(), getProjectName() + "/" + folderName); List columns = queryDetailsResponse.getColumns(); int groupingIndex = 11; - assertEquals("","Day", columns.get(groupingIndex).getName()); - assertEquals("","Day", columns.get(groupingIndex).getCaption()); + assertEquals("", "Day", columns.get(groupingIndex).getName()); + assertEquals("", "Day", columns.get(groupingIndex).getCaption()); assertEquals("", "Text (String)", columns.get(groupingIndex).getType()); int ignoreIndex = 12; - assertEquals("","SampleIdentifier", columns.get(ignoreIndex).getName()); - assertEquals("","SampleIdentifier", columns.get(ignoreIndex).getCaption()); + assertEquals("", "SampleIdentifier", columns.get(ignoreIndex).getName()); + assertEquals("", "SampleIdentifier", columns.get(ignoreIndex).getCaption()); assertEquals("", "Text (String)", columns.get(ignoreIndex).getType()); //confirm data in grid view @@ -450,7 +468,7 @@ private void validateGuideSetStats(GuideSet gs) throws IOException, CommandExcep Rowset rowset = response.getRowset(); assertEquals("Unexpected number of filtered rows", 1, rowset.getSize()); Row row = rowset.iterator().next(); - assertEquals("Unexpected guide set stats record count", stats.getNumRecords(), ((Number)row.getValue("NumRecords")).intValue()); + assertEquals("Unexpected guide set stats record count", stats.getNumRecords(), ((Number) row.getValue("NumRecords")).intValue()); if (stats.getMean() != null) { @@ -462,7 +480,7 @@ private void validateGuideSetStats(GuideSet gs) throws IOException, CommandExcep if (stats.getStdDev() != null) { double delta = Math.abs(stats.getStdDev() * 0.001); - double actual = ((Number)row.getValue("StandardDev")).doubleValue(); + double actual = ((Number) row.getValue("StandardDev")).doubleValue(); assertEquals("Unexpected guide set stats std dev for " + stats.getMetricName(), stats.getStdDev(), actual, delta); } } @@ -602,7 +620,7 @@ private void addRowIdForCreatedGuideSet(GuideSet guideSet, String subfolder) guideSet.setRowId(guideSetWebPart.getRowId(guideSet)); } - private void verifyTicksOnPlots(ParetoPlotsWebPart paretoPlotsWebPart, int guideSetNum, QCPlotsWebPart.QCPlotType plotType, QCPlotsWebPart.MetricType ... metrics) + private void verifyTicksOnPlots(ParetoPlotsWebPart paretoPlotsWebPart, int guideSetNum, QCPlotsWebPart.QCPlotType plotType, QCPlotsWebPart.MetricType... metrics) { paretoPlotsWebPart.waitForTickLoad(guideSetNum, plotType); @@ -646,7 +664,7 @@ private void verifyNavigationToPanoramaDashboard(int guideSetNum, QCPlotsWebPart assertEquals("startDate in the URL does not equal 'Start Date' on the page", parseUrlDate(getUrlParam("startDate", true)), parseFormDate(qcPlotsWebPart.getCurrentStartDate())); //compare url End Date with input form End Date - if(checkEndDate) + if (checkEndDate) assertEquals("endDate in the URL does not equal 'End Date' on the page", parseUrlDate(getUrlParam("endDate", true)), parseFormDate(qcPlotsWebPart.getCurrentEndDate())); } diff --git a/webapp/TargetedMS/js/QCPlotHelperBase.js b/webapp/TargetedMS/js/QCPlotHelperBase.js index 652739377..53e6dbf16 100644 --- a/webapp/TargetedMS/js/QCPlotHelperBase.js +++ b/webapp/TargetedMS/js/QCPlotHelperBase.js @@ -735,6 +735,7 @@ Ext4.define("LABKEY.targetedms.QCPlotHelperBase", { color: 'fragment', defaultGuideSetLabel: 'fragment', pointSize: 2, + pointIdAttr: function(row) { return row['fullDate'] + row['fragment']; }, shapeRange: [LABKEY.vis.Scale.Shape()[0] /* circle */, LABKEY.vis.Scale.DataspaceShape()[0] /* open circle */, LABKEY.vis.Scale.Shape()[1], LABKEY.vis.Scale.Shape()[2]], shapeDomain: shapeDomain, showTrendLine: true, From 3ec4e1a2d7bc56474b53fd96ab214b87b4f75856 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Tue, 30 Dec 2025 17:22:13 -0800 Subject: [PATCH 07/14] change visible guide sets numbers in test --- .../test/tests/targetedms/TargetedMSQCGuideSetTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java index ec24b15b5..954416030 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java @@ -212,13 +212,13 @@ public void testGuideSetPlotDisplay() List> shapeCounts = new ArrayList<>(); shapeCounts.add(Pair.of(SvgShapes.CIRCLE.getPathPrefix(), 289)); shapeCounts.add(Pair.of(SvgShapes.TRIANGLE.getPathPrefix(), 40)); - verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 4, shapeCounts, 47); + verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 5, shapeCounts, 47); // check box for group x-axis values by date and verify qcPlotsWebPart.setGroupXAxisValuesByDate(true); - verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 4, shapeCounts, 20); + verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 5, shapeCounts, 20); qcPlotsWebPart.setShowAllPeptidesInSinglePlot(true, 1); - assertEquals("Unexpected number of training range rects visible", 4, qcPlotsWebPart.getGuideSetTrainingRectCount()); + assertEquals("Unexpected number of training range rects visible", 5, qcPlotsWebPart.getGuideSetTrainingRectCount()); qcPlotsWebPart.setShowAllPeptidesInSinglePlot(false); qcPlotsWebPart.setGroupXAxisValuesByDate(false); From cbfba6aff6515113dee0771ae88c2735a910a0c6 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 31 Dec 2025 10:51:21 -0800 Subject: [PATCH 08/14] delete combined guide set after creation --- .../targetedms/TargetedMSQCGuideSetTest.java | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java index 954416030..b2503d5b7 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java @@ -82,16 +82,16 @@ protected String getProjectName() @BeforeClass public static void initProject() { - TargetedMSQCGuideSetTest init = getCurrentTest(); - - init.setupFolder(FolderType.QC); - init.importData(SProCoP_FILE); - - init.createGuideSet(gs1); - init.createGuideSet(gs2); - init.createGuideSet(gs3); - init.createGuideSet(gs4); - init.createGuideSet(gs5); +// TargetedMSQCGuideSetTest init = getCurrentTest(); +// +// init.setupFolder(FolderType.QC); +// init.importData(SProCoP_FILE); +// +// init.createGuideSet(gs1); +// init.createGuideSet(gs2); +// init.createGuideSet(gs3); +// init.createGuideSet(gs4); +// init.createGuideSet(gs5); } @Before @@ -105,7 +105,7 @@ protected void doCleanup(boolean afterTest) throws TestTimeoutException { // Use the API-based approach for deletion so that we don't trigger AJAX requests navigating to the delete page // that may run in the background and cause SQL Server deadlock exceptions - new APIContainerHelper(this).deleteProject(getProjectName(), afterTest); +// new APIContainerHelper(this).deleteProject(getProjectName(), afterTest); } @Test @@ -198,6 +198,14 @@ private void testCombinedPlotsGuideSetCreation() clickTab("Guide Sets"); DataRegionTable table = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); assertEquals("Guide set was not created from combined plots", 6, table.getDataRowCount()); + + table.checkCheckbox(5); + table.clickHeaderButton("Delete"); + clickButton("Confirm Delete"); + + table = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); + assertEquals("Guide set was not deleted", 5, table.getDataRowCount()); + } public void testGuideSetPlotDisplay() @@ -212,13 +220,13 @@ public void testGuideSetPlotDisplay() List> shapeCounts = new ArrayList<>(); shapeCounts.add(Pair.of(SvgShapes.CIRCLE.getPathPrefix(), 289)); shapeCounts.add(Pair.of(SvgShapes.TRIANGLE.getPathPrefix(), 40)); - verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 5, shapeCounts, 47); + verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 4, shapeCounts, 47); // check box for group x-axis values by date and verify qcPlotsWebPart.setGroupXAxisValuesByDate(true); - verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 5, shapeCounts, 20); + verifyGuideSetRelatedElementsForPlots(qcPlotsWebPart, 4, shapeCounts, 20); qcPlotsWebPart.setShowAllPeptidesInSinglePlot(true, 1); - assertEquals("Unexpected number of training range rects visible", 5, qcPlotsWebPart.getGuideSetTrainingRectCount()); + assertEquals("Unexpected number of training range rects visible", 4, qcPlotsWebPart.getGuideSetTrainingRectCount()); qcPlotsWebPart.setShowAllPeptidesInSinglePlot(false); qcPlotsWebPart.setGroupXAxisValuesByDate(false); @@ -266,8 +274,7 @@ public void testParetoPlot() QCPlotsWebPart.MetricType.FWHM, QCPlotsWebPart.MetricType.FWB, QCPlotsWebPart.MetricType.TIC_AREA, - QCPlotsWebPart.MetricType.ISOTOPE_DOTP - ); + QCPlotsWebPart.MetricType.ISOTOPE_DOTP); verifyNavigationToPanoramaDashboard(guideSetId, 0, QCPlotsWebPart.MetricType.TOTAL_PEAK, true); clickAndWait(Locator.linkWithText("Pareto Plot")); //go to Pareto Plot tab @@ -357,7 +364,7 @@ public void testEmptyParetoPlot() ParetoPlotsWebPart paretoPlotsWebPart = paretoPage.getParetoPlotsWebPart(); paretoPlotsWebPart.verifyEmpty(); - } + } public void testSmallMoleculePareto() throws IOException, CommandException { @@ -380,10 +387,10 @@ public void testSmallMoleculePareto() throws IOException, CommandException ParetoPlotsWebPart paretoPlotsWebPart = paretoPage.getParetoPlotsWebPart(); verifyTicksOnPlots(paretoPlotsWebPart, 1, QCPlotsWebPart.QCPlotType.MetricValue, - QCPlotsWebPart.MetricType.FWB, - QCPlotsWebPart.MetricType.FWHM, - QCPlotsWebPart.MetricType.RETENTION, - QCPlotsWebPart.MetricType.TRANSITION_AREA); + QCPlotsWebPart.MetricType.FWB, + QCPlotsWebPart.MetricType.FWHM, + QCPlotsWebPart.MetricType.RETENTION, + QCPlotsWebPart.MetricType.TRANSITION_AREA); clickExportPDFIcon("chart-render-div", 0); clickExportPNGIcon("chart-render-div", 0); @@ -400,17 +407,17 @@ public void testReplicateAnnotations() throws IOException, CommandException selectQuery("targetedms", "Replicate"); //confirm table columns are present and of correct type representing replicate annotations: GetQueryDetailsCommand queryDetailsCommand = new GetQueryDetailsCommand("targetedms", "Replicate"); - GetQueryDetailsResponse queryDetailsResponse = queryDetailsCommand.execute(createDefaultConnection(), getProjectName() + "/" + folderName); + GetQueryDetailsResponse queryDetailsResponse = queryDetailsCommand.execute(createDefaultConnection(),getProjectName() + "/" + folderName); List columns = queryDetailsResponse.getColumns(); int groupingIndex = 11; - assertEquals("", "Day", columns.get(groupingIndex).getName()); - assertEquals("", "Day", columns.get(groupingIndex).getCaption()); + assertEquals("","Day", columns.get(groupingIndex).getName()); + assertEquals("","Day", columns.get(groupingIndex).getCaption()); assertEquals("", "Text (String)", columns.get(groupingIndex).getType()); int ignoreIndex = 12; - assertEquals("", "SampleIdentifier", columns.get(ignoreIndex).getName()); - assertEquals("", "SampleIdentifier", columns.get(ignoreIndex).getCaption()); + assertEquals("","SampleIdentifier", columns.get(ignoreIndex).getName()); + assertEquals("","SampleIdentifier", columns.get(ignoreIndex).getCaption()); assertEquals("", "Text (String)", columns.get(ignoreIndex).getType()); //confirm data in grid view @@ -468,7 +475,7 @@ private void validateGuideSetStats(GuideSet gs) throws IOException, CommandExcep Rowset rowset = response.getRowset(); assertEquals("Unexpected number of filtered rows", 1, rowset.getSize()); Row row = rowset.iterator().next(); - assertEquals("Unexpected guide set stats record count", stats.getNumRecords(), ((Number) row.getValue("NumRecords")).intValue()); + assertEquals("Unexpected guide set stats record count", stats.getNumRecords(), ((Number)row.getValue("NumRecords")).intValue()); if (stats.getMean() != null) { @@ -480,7 +487,7 @@ private void validateGuideSetStats(GuideSet gs) throws IOException, CommandExcep if (stats.getStdDev() != null) { double delta = Math.abs(stats.getStdDev() * 0.001); - double actual = ((Number) row.getValue("StandardDev")).doubleValue(); + double actual = ((Number)row.getValue("StandardDev")).doubleValue(); assertEquals("Unexpected guide set stats std dev for " + stats.getMetricName(), stats.getStdDev(), actual, delta); } } @@ -620,7 +627,7 @@ private void addRowIdForCreatedGuideSet(GuideSet guideSet, String subfolder) guideSet.setRowId(guideSetWebPart.getRowId(guideSet)); } - private void verifyTicksOnPlots(ParetoPlotsWebPart paretoPlotsWebPart, int guideSetNum, QCPlotsWebPart.QCPlotType plotType, QCPlotsWebPart.MetricType... metrics) + private void verifyTicksOnPlots(ParetoPlotsWebPart paretoPlotsWebPart, int guideSetNum, QCPlotsWebPart.QCPlotType plotType, QCPlotsWebPart.MetricType ... metrics) { paretoPlotsWebPart.waitForTickLoad(guideSetNum, plotType); @@ -664,7 +671,7 @@ private void verifyNavigationToPanoramaDashboard(int guideSetNum, QCPlotsWebPart assertEquals("startDate in the URL does not equal 'Start Date' on the page", parseUrlDate(getUrlParam("startDate", true)), parseFormDate(qcPlotsWebPart.getCurrentStartDate())); //compare url End Date with input form End Date - if (checkEndDate) + if(checkEndDate) assertEquals("endDate in the URL does not equal 'End Date' on the page", parseUrlDate(getUrlParam("endDate", true)), parseFormDate(qcPlotsWebPart.getCurrentEndDate())); } From aed6303b932d85f5d64a8652fe9d4f13f8e9e9fa Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 31 Dec 2025 11:06:47 -0800 Subject: [PATCH 09/14] put back setup code --- .../targetedms/TargetedMSQCGuideSetTest.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java index b2503d5b7..94ad451be 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java @@ -82,16 +82,16 @@ protected String getProjectName() @BeforeClass public static void initProject() { -// TargetedMSQCGuideSetTest init = getCurrentTest(); -// -// init.setupFolder(FolderType.QC); -// init.importData(SProCoP_FILE); -// -// init.createGuideSet(gs1); -// init.createGuideSet(gs2); -// init.createGuideSet(gs3); -// init.createGuideSet(gs4); -// init.createGuideSet(gs5); + TargetedMSQCGuideSetTest init = getCurrentTest(); + + init.setupFolder(FolderType.QC); + init.importData(SProCoP_FILE); + + init.createGuideSet(gs1); + init.createGuideSet(gs2); + init.createGuideSet(gs3); + init.createGuideSet(gs4); + init.createGuideSet(gs5); } @Before @@ -105,7 +105,7 @@ protected void doCleanup(boolean afterTest) throws TestTimeoutException { // Use the API-based approach for deletion so that we don't trigger AJAX requests navigating to the delete page // that may run in the background and cause SQL Server deadlock exceptions -// new APIContainerHelper(this).deleteProject(getProjectName(), afterTest); + new APIContainerHelper(this).deleteProject(getProjectName(), afterTest); } @Test From a2d3c3143ce7f297b6c000191828928e5b5342fe Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 31 Dec 2025 11:09:19 -0800 Subject: [PATCH 10/14] put back code --- .../tests/targetedms/TargetedMSQCGuideSetTest.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java index 94ad451be..6423d91c4 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java @@ -141,7 +141,7 @@ private void createQueries() "LEFT JOIN QCMetric_" + metricName + " as p\n" + " ON p.SampleFileId.AcquiredTime >= gs.TrainingStart AND p.SampleFileId.AcquiredTime <= gs.TrainingEnd\n" + "LEFT JOIN PrecursorChromInfo pci ON p.precursorchrominfoid = pci.Id\n" + - "GROUP BY gs.RowId, gs.TrainingStart, gs.TrainingEnd, gs.ReferenceEnd, \n" + + "GROUP BY gs.RowId, gs.TrainingStart, gs.TrainingEnd, gs.ReferenceEnd, \n"+ " pci.PrecursorId.PeptideId.Sequence, pci.PrecursorId.Charge, \n" + "pci.PrecursorId.ModifiedSequence, pci.MoleculePrecursorId.CustomIonName, \n" + "pci.MoleculePrecursorId.IonFormula, pci.MoleculePrecursorId.massMonoisotopic, pci.MoleculePrecursorId.massAverage, \n" + @@ -274,7 +274,8 @@ public void testParetoPlot() QCPlotsWebPart.MetricType.FWHM, QCPlotsWebPart.MetricType.FWB, QCPlotsWebPart.MetricType.TIC_AREA, - QCPlotsWebPart.MetricType.ISOTOPE_DOTP); + QCPlotsWebPart.MetricType.ISOTOPE_DOTP + ); verifyNavigationToPanoramaDashboard(guideSetId, 0, QCPlotsWebPart.MetricType.TOTAL_PEAK, true); clickAndWait(Locator.linkWithText("Pareto Plot")); //go to Pareto Plot tab @@ -387,10 +388,10 @@ public void testSmallMoleculePareto() throws IOException, CommandException ParetoPlotsWebPart paretoPlotsWebPart = paretoPage.getParetoPlotsWebPart(); verifyTicksOnPlots(paretoPlotsWebPart, 1, QCPlotsWebPart.QCPlotType.MetricValue, - QCPlotsWebPart.MetricType.FWB, - QCPlotsWebPart.MetricType.FWHM, - QCPlotsWebPart.MetricType.RETENTION, - QCPlotsWebPart.MetricType.TRANSITION_AREA); + QCPlotsWebPart.MetricType.FWB, + QCPlotsWebPart.MetricType.FWHM, + QCPlotsWebPart.MetricType.RETENTION, + QCPlotsWebPart.MetricType.TRANSITION_AREA); clickExportPDFIcon("chart-render-div", 0); clickExportPNGIcon("chart-render-div", 0); From da461feacb9ed2ce141fa8f9e51cf23a3a974dec Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 31 Dec 2025 11:18:24 -0800 Subject: [PATCH 11/14] update guide set creation warning from data points count to replicates count --- webapp/TargetedMS/js/QCTrendPlotPanel.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/webapp/TargetedMS/js/QCTrendPlotPanel.js b/webapp/TargetedMS/js/QCTrendPlotPanel.js index f13723daf..51e41b383 100644 --- a/webapp/TargetedMS/js/QCTrendPlotPanel.js +++ b/webapp/TargetedMS/js/QCTrendPlotPanel.js @@ -2329,17 +2329,26 @@ Ext4.define('LABKEY.targetedms.QCTrendPlotPanel', { }, createGuideSetBtnClick: function() { - var minGuideSetPointCount = 5; // to warn user if less than this many points are selected for the new guide set + let minGuideSetReplicateCount = 5; // to warn user if less than this many replicates are selected for the new guide set if (this.plotBrushSelection && this.plotBrushSelection.points.length > 0) { - var startDate = this.plotBrushSelection.points[0]['fullDate']; - var endDate = this.plotBrushSelection.points[this.plotBrushSelection.points.length - 1]['fullDate']; + let startDate = this.plotBrushSelection.points[0]['fullDate']; + let endDate = this.plotBrushSelection.points[this.plotBrushSelection.points.length - 1]['fullDate']; + + let distinctSampleFileIds = {}; + for (let i = 0; i < this.plotBrushSelection.points.length; i++) { + let sampleFileId = this.plotBrushSelection.points[i].SampleFileId; + if (sampleFileId !== undefined && sampleFileId !== null) { + distinctSampleFileIds[sampleFileId] = true; + } + } + let distinctCount = Object.keys(distinctSampleFileIds).length; - if (this.plotBrushSelection.points.length < minGuideSetPointCount) { + if (distinctCount < minGuideSetReplicateCount) { Ext4.Msg.show({ - title:'Create Guide Set Warning', + title: 'Create Guide Set Warning', icon: Ext4.MessageBox.WARNING, - msg: 'Fewer than ' + minGuideSetPointCount + ' data points were selected for the new guide set, which may not be statistically significant. Would you like to proceed anyway?', + msg: 'Fewer than ' + minGuideSetReplicateCount + ' replicates were selected for the new guide set, which may not be statistically significant. Would you like to proceed anyway?', buttons: Ext4.Msg.YESNO, scope: this, fn: function(btnId, text, opt){ From 0bc508a9c654177020f55619cee90a54dbdc4b50 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 31 Dec 2025 11:48:14 -0800 Subject: [PATCH 12/14] delete combined guide set --- .../tests/targetedms/TargetedMSQCGuideSetTest.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java index 6423d91c4..105d93ffe 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java @@ -200,12 +200,11 @@ private void testCombinedPlotsGuideSetCreation() assertEquals("Guide set was not created from combined plots", 6, table.getDataRowCount()); table.checkCheckbox(5); - table.clickHeaderButton("Delete"); - clickButton("Confirm Delete"); - - table = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); - assertEquals("Guide set was not deleted", 5, table.getDataRowCount()); - + doAndWaitForPageToLoad(() -> + { + table.clickHeaderButton("Delete"); + assertAlert("Are you sure you want to delete the selected row?"); + }); } public void testGuideSetPlotDisplay() From 04af0e305385dd2ee89e495ecde26d0324968a54 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Thu, 1 Jan 2026 11:11:59 -0800 Subject: [PATCH 13/14] delete correct combined guide set --- .../labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java index 105d93ffe..f911a0c2f 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCGuideSetTest.java @@ -199,7 +199,8 @@ private void testCombinedPlotsGuideSetCreation() DataRegionTable table = new DataRegionTable.DataRegionFinder(getDriver()).waitFor(); assertEquals("Guide set was not created from combined plots", 6, table.getDataRowCount()); - table.checkCheckbox(5); + int rowIndex = table.getRowIndex("Comment", "guide set created from combined plots"); + table.checkCheckbox(rowIndex); doAndWaitForPageToLoad(() -> { table.clickHeaderButton("Delete"); From 4c18ed04f64ee006bfd899e1d5bf2e36f93b763c Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Fri, 2 Jan 2026 08:44:48 -0800 Subject: [PATCH 14/14] add log statement before saving --- test/src/org/labkey/test/tests/targetedms/TargetedMSQCTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCTest.java index c16f76235..6960810ee 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSQCTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSQCTest.java @@ -1081,6 +1081,7 @@ private void verifyAddAnnotationsFromQCPlots() String testComment = "Test annotation from QC plot"; setFormElement(Locator.name("description"), testComment); + log("Clicking Save button in add annotation dialog"); // Click the save button addAnnotationDialog.clickButton("Save", true); _ext4Helper.waitForMaskToDisappear();