<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[180451] trunk/Websites/perf.webkit.org</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/180451">180451</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2015-02-20 13:39:01 -0800 (Fri, 20 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Selecting revisions for A/B testing is hard
https://bugs.webkit.org/show_bug.cgi?id=141824

Reviewed by Andreas Kling.

Update the revisions used in A/B testing based on the selection in the overview chart. This allows users to
intuitively select revisions based on points shown in the chart. Removed the old select elements used to
select A/B testing points manually.

Also renamed 'testSets' to 'configurations', 'roots' to 'rootConfigurations', and 'revisions' in each root's
sets to 'options' for clarity.

* public/v2/app.css: Reorganized style rules. 

* public/v2/app.js:
(App.AnalysisTaskController):
(App.AnalysisTaskController._taskUpdated): Merged updateTestGroupPanes.
(App.AnalysisTaskController._chartDataChanged): Renamed from paneDomain. It's now an observer instead of
a property, which sets 'overviewDomain' property as well as other properties.
(App.AnalysisTaskController.updateRootConfigurations): Renamed from updateRoots.
(App.AnalysisTaskController._updateRootsBySelectedPoints): Added. Select roots based on the selected points
in the overview chart.

* public/v2/chart-pane.css: Added arrows next to the configuration names (e.g. 'A') to indicate whether
individual build requests / test results are shown or not.

* public/v2/index.html: Removed the select element per configuration column. Also moved the select element
for the number of runs as it doesn't belong in the same table as the one that lists repositories and roots.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2appcss">trunk/Websites/perf.webkit.org/public/v2/app.css</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2appjs">trunk/Websites/perf.webkit.org/public/v2/app.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2chartpanecss">trunk/Websites/perf.webkit.org/public/v2/chart-pane.css</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2indexhtml">trunk/Websites/perf.webkit.org/public/v2/index.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebsitesperfwebkitorgChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/ChangeLog (180450 => 180451)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2015-02-20 21:25:24 UTC (rev 180450)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2015-02-20 21:39:01 UTC (rev 180451)
</span><span class="lines">@@ -1,5 +1,36 @@
</span><span class="cx"> 2015-02-20  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Selecting revisions for A/B testing is hard
+        https://bugs.webkit.org/show_bug.cgi?id=141824
+
+        Reviewed by Andreas Kling.
+
+        Update the revisions used in A/B testing based on the selection in the overview chart. This allows users to
+        intuitively select revisions based on points shown in the chart. Removed the old select elements used to
+        select A/B testing points manually.
+
+        Also renamed 'testSets' to 'configurations', 'roots' to 'rootConfigurations', and 'revisions' in each root's
+        sets to 'options' for clarity.
+
+        * public/v2/app.css: Reorganized style rules. 
+
+        * public/v2/app.js:
+        (App.AnalysisTaskController):
+        (App.AnalysisTaskController._taskUpdated): Merged updateTestGroupPanes.
+        (App.AnalysisTaskController._chartDataChanged): Renamed from paneDomain. It's now an observer instead of
+        a property, which sets 'overviewDomain' property as well as other properties.
+        (App.AnalysisTaskController.updateRootConfigurations): Renamed from updateRoots.
+        (App.AnalysisTaskController._updateRootsBySelectedPoints): Added. Select roots based on the selected points
+        in the overview chart.
+
+        * public/v2/chart-pane.css: Added arrows next to the configuration names (e.g. 'A') to indicate whether
+        individual build requests / test results are shown or not.
+
+        * public/v2/index.html: Removed the select element per configuration column. Also moved the select element
+        for the number of runs as it doesn't belong in the same table as the one that lists repositories and roots.
+
+2015-02-20  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         Unreviewed test fixes after r179037, r179591, and r179763.
</span><span class="cx"> 
</span><span class="cx">         * tests/admin-regenerate-manifest.js:
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2appcss"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/app.css (180450 => 180451)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/app.css        2015-02-20 21:25:24 UTC (rev 180450)
+++ trunk/Websites/perf.webkit.org/public/v2/app.css        2015-02-20 21:39:01 UTC (rev 180451)
</span><span class="lines">@@ -421,6 +421,21 @@
</span><span class="cx">     vertical-align: middle;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+.chart-pane,
+.analysis-group {
+    border: 1px solid #bbb;
+    border-radius: 0.5rem;
+    box-shadow: rgba(0, 0, 0, 0.03) 1px 1px 0px 0px;
+    padding: 0;
+    margin-bottom: 1rem;
+    outline: none;
+    position: relative;
+}
+
+form .analysis-group &gt; * {
+    margin: 0.5rem;
+}
+
</ins><span class="cx"> #analysis-tasks,
</span><span class="cx"> .analysis-group &gt; table {
</span><span class="cx">     border: solid 0px #999;
</span><span class="lines">@@ -472,20 +487,15 @@
</span><span class="cx">     display: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.analysis-group {
-    display: block;
-    position: relative;
-    min-height: 6.5rem;
-}
-
</del><span class="cx"> .analysis-group .results {
</span><ins>+    margin: 0.5rem;
</ins><span class="cx">     margin-right: 20rem;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> .analysis-group .reference-chart {
</span><span class="cx">     position: absolute;
</span><del>-    top: 1.2rem;
-    right: -0.7rem;
</del><ins>+    top: 1.8rem;
+    right: 0rem;
</ins><span class="cx">     width: 19rem;
</span><span class="cx">     height: 5rem;
</span><span class="cx"> }
</span><span class="lines">@@ -532,17 +542,6 @@
</span><span class="cx">     color: #333;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.analysis-group {
-    border: 1px solid #bbb;
-    border-radius: 0.5rem;
-    box-shadow: rgba(0, 0, 0, 0.03) 1px 1px 0px 0px;
-    margin-bottom: 1.5rem;
-}
-
-.analysis-group &gt; * {
-    margin: 0.5rem;
-}
-
</del><span class="cx"> .analysis-group &gt; h1 {
</span><span class="cx">     font-size: 1.1rem;
</span><span class="cx">     font-weight: normal;
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2appjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/app.js (180450 => 180451)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/app.js        2015-02-20 21:25:24 UTC (rev 180450)
+++ trunk/Websites/perf.webkit.org/public/v2/app.js        2015-02-20 21:39:01 UTC (rev 180451)
</span><span class="lines">@@ -979,7 +979,6 @@
</span><span class="cx">     platform: Ember.computed.alias('model.platform'),
</span><span class="cx">     metric: Ember.computed.alias('model.metric'),
</span><span class="cx">     details: Ember.computed.alias('pane.details'),
</span><del>-    testSets: [],
</del><span class="cx">     roots: [],
</span><span class="cx">     bugTrackers: [],
</span><span class="cx">     possibleRepetitionCounts: [1, 2, 3, 4, 5, 6],
</span><span class="lines">@@ -995,7 +994,12 @@
</span><span class="cx">             platformId: model.get('platform').get('id'),
</span><span class="cx">             metricId: model.get('metric').get('id'),
</span><span class="cx">         }));
</span><del>-    }.observes('model').on('init'),
</del><ins>+
+        var self = this;
+        model.get('testGroups').then(function (groups) {
+            self.set('testGroupPanes', groups.map(function (group) { return App.TestGroupPane.create({content: group}); }));
+        });
+    }.observes('model', 'model.testGroups').on('init'),
</ins><span class="cx">     _fetchedManifest: function ()
</span><span class="cx">     {
</span><span class="cx">         var trackerIdToBugNumber = {};
</span><span class="lines">@@ -1012,7 +1016,7 @@
</span><span class="cx">             });
</span><span class="cx">         }));
</span><span class="cx">     },
</span><del>-    paneDomain: function ()
</del><ins>+    _chartDataChanged: function ()
</ins><span class="cx">     {
</span><span class="cx">         var pane = this.get('pane');
</span><span class="cx">         if (!pane)
</span><span class="lines">@@ -1046,56 +1050,24 @@
</span><span class="cx"> 
</span><span class="cx">         var margin = (end.time - start.time) * 0.1;
</span><span class="cx">         this.set('highlightedItems', highlightedItems);
</span><ins>+        this.set('overviewEndPoints', [start, end]);
</ins><span class="cx">         this.set('analysisPoints', formatedPoints);
</span><span class="cx"> 
</span><del>-        var paneDomain = [start.time - margin, +end.time + margin];
</del><ins>+        var overviewDomain = [start.time - margin, +end.time + margin];
</ins><span class="cx"> 
</span><span class="cx">         var testGroupPanes = this.get('testGroupPanes');
</span><span class="cx">         if (testGroupPanes) {
</span><span class="cx">             testGroupPanes.setEach('overviewPane', pane);
</span><del>-            testGroupPanes.setEach('overviewDomain', paneDomain);
</del><ins>+            testGroupPanes.setEach('overviewDomain', overviewDomain);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return paneDomain;
-    }.property('pane.chartData'),
-    testSets: function ()
</del><ins>+        this.set('overviewDomain', overviewDomain);
+    }.observes('pane.chartData'),
+    updateRootConfigurations: function ()
</ins><span class="cx">     {
</span><span class="cx">         var analysisPoints = this.get('analysisPoints');
</span><span class="cx">         if (!analysisPoints)
</span><span class="cx">             return;
</span><del>-        var pointOptions = [{value: ' ', label: 'None'}]
-            .concat(analysisPoints.map(function (point) { return {value: point.id, label: point.label}; }));
-        return [
-            Ember.Object.create({name: &quot;A&quot;, options: pointOptions, selection: pointOptions[1]}),
-            Ember.Object.create({name: &quot;B&quot;, options: pointOptions, selection: pointOptions[pointOptions.length - 1]}),
-        ];
-    }.property('analysisPoints'),
-    _rootChangedForTestSet: function ()
-    {
-        var sets = this.get('testSets');
-        var roots = this.get('roots');
-        if (!sets || !roots)
-            return;
-
-        sets.forEach(function (testSet, setIndex) {
-            var currentSelection = testSet.get('selection');
-            if (currentSelection == testSet.get('previousSelection'))
-                return;
-            testSet.set('previousSelection', currentSelection);
-            var pointIndex = testSet.get('options').indexOf(currentSelection);
-
-            roots.forEach(function (root) {
-                var set = root.sets[setIndex];
-                set.set('selection', set.revisions[pointIndex]);
-            });
-        });
-
-    }.observes('testSets.@each.selection'),
-    updateRoots: function ()
-    {
-        var analysisPoints = this.get('analysisPoints');
-        if (!analysisPoints)
-            return;
</del><span class="cx">         var repositoryToRevisions = {};
</span><span class="cx">         analysisPoints.forEach(function (point, pointIndex) {
</span><span class="cx">             var revisions = point.measurement.formattedRevisions();
</span><span class="lines">@@ -1115,33 +1087,25 @@
</span><span class="cx">             if (!triggerable)
</span><span class="cx">                 return;
</span><span class="cx"> 
</span><del>-            self.set('roots', triggerable.get('acceptedRepositories').map(function (repository) {
</del><ins>+            self.set('configurations', ['A', 'B']);
+            self.set('rootConfigurations', triggerable.get('acceptedRepositories').map(function (repository) {
</ins><span class="cx">                 var repositoryId = repository.get('id');
</span><del>-                var revisions = [{value: ' ', label: 'None'}].concat(repositoryToRevisions[repositoryId]);
</del><ins>+                var options = [{value: ' ', label: 'None'}].concat(repositoryToRevisions[repositoryId]);
</ins><span class="cx">                 return Ember.Object.create({
</span><ins>+                    repository: repository,
</ins><span class="cx">                     name: repository.get('name'),
</span><span class="cx">                     sets: [
</span><span class="cx">                         Ember.Object.create({name: 'A[' + repositoryId + ']',
</span><del>-                            revisions: revisions,
-                            selection: revisions[1]}),
</del><ins>+                            options: options,
+                            selection: options[1]}),
</ins><span class="cx">                         Ember.Object.create({name: 'B[' + repositoryId + ']',
</span><del>-                            revisions: revisions,
-                            selection: revisions[revisions.length - 1]}),
</del><ins>+                            options: options,
+                            selection: options[options.length - 1]}),
</ins><span class="cx">                     ],
</span><span class="cx">                 });
</span><span class="cx">             }));
</span><span class="cx">         });
</span><span class="cx">     }.observes('analysisPoints'),
</span><del>-    updateTestGroupPanes: function ()
-    {
-        var model = this.get('model');
-        if (!model)
-            return;
-        var self = this;
-        model.get('testGroups').then(function (groups) {
-            self.set('testGroupPanes', groups.map(function (group) { return App.TestGroupPane.create({content: group}); }));
-        });
-    }.observes('model'),
</del><span class="cx">     actions: {
</span><span class="cx">         associateBug: function (bugTracker, bugNumber)
</span><span class="cx">         {
</span><span class="lines">@@ -1156,11 +1120,12 @@
</span><span class="cx">         createTestGroup: function (name, repetitionCount)
</span><span class="cx">         {
</span><span class="cx">             var roots = {};
</span><del>-            this.get('roots').map(function (root) {
</del><ins>+            this.get('rootConfigurations').map(function (root) {
</ins><span class="cx">                 roots[root.get('name')] = root.get('sets').map(function (item) { return item.get('selection').value; });
</span><span class="cx">             });
</span><span class="cx">             App.TestGroup.create(this.get('model'), name, roots, repetitionCount).then(function () {
</span><del>-                
</del><ins>+            }, function (error) {
+                alert('Failed to create a new test group:' + error);
</ins><span class="cx">             });
</span><span class="cx">         },
</span><span class="cx">         toggleShowRequestList: function (configuration)
</span><span class="lines">@@ -1168,6 +1133,35 @@
</span><span class="cx">             configuration.toggleProperty('showRequestList');
</span><span class="cx">         }
</span><span class="cx">     },
</span><ins>+    _updateRootsBySelectedPoints: function ()
+    {
+        var rootConfigurations = this.get('rootConfigurations');
+        var pane = this.get('pane');
+        if (!rootConfigurations || !pane)
+            return;
+
+        var rootSetPoints;
+        var selectedPoints = pane.get('selectedPoints');
+        if (selectedPoints &amp;&amp; selectedPoints.length &gt;= 2)
+            rootSetPoints = [selectedPoints[0], selectedPoints[selectedPoints.length - 1]];
+        else
+            rootSetPoints = this.get('overviewEndPoints');
+        if (!rootSetPoints)
+            return;
+
+        rootConfigurations.forEach(function (root) {
+            root.get('sets').forEach(function (set, setIndex) {
+                if (setIndex &gt;= rootSetPoints.length)
+                    return;
+                var targetRevision = rootSetPoints[setIndex].measurement.revisionForRepository(root.get('repository').get('id'));
+                var selectedOption;
+                if (targetRevision)
+                    selectedOption = set.get('options').find(function (option) { return option.value == targetRevision; });
+                set.set('selection', selectedOption || sets[i].get('options')[0]);
+            });
+        });
+
+    }.observes('pane.selectedPoints'),
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> App.TestGroupPane = Ember.ObjectProxy.extend({
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2chartpanecss"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/chart-pane.css (180450 => 180451)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/chart-pane.css        2015-02-20 21:25:24 UTC (rev 180450)
+++ trunk/Websites/perf.webkit.org/public/v2/chart-pane.css        2015-02-20 21:39:01 UTC (rev 180451)
</span><span class="lines">@@ -1,12 +1,3 @@
</span><del>-.chart-pane {
-    border: 1px solid #bbb;
-    border-radius: 0.5rem;
-    box-shadow: rgba(0, 0, 0, 0.03) 1px 1px 0px 0px;
-    padding: 0;
-    margin-bottom: 1rem;
-    outline: none;
-    position: relative;
-}
</del><span class="cx"> .chart-pane header {
</span><span class="cx">     background: #fff;
</span><span class="cx">     margin: 0;
</span><span class="lines">@@ -294,13 +285,15 @@
</span><span class="cx">     cursor: pointer;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.chart-pane .commits-viewer caption:before {
</del><ins>+.chart-pane .commits-viewer caption:before,
+.analysis-group .results .summary .config-letter:before {
</ins><span class="cx">     display: inline-block;
</span><span class="cx">     width: 0.8rem;
</span><span class="cx">     content: &quot;\25BE&quot;; /* Down arrow */
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.chart-pane .commits-viewer.hidden caption:before {
</del><ins>+.chart-pane .commits-viewer.hidden caption:before,
+.analysis-group .results .hideRequests .summary .config-letter:before {
</ins><span class="cx">     display: inline-block;
</span><span class="cx">     width: 0.8rem;
</span><span class="cx">     content: &quot;\25B8&quot;; /* Right arrow */
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2indexhtml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/index.html (180450 => 180451)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/index.html        2015-02-20 21:25:24 UTC (rev 180450)
+++ trunk/Websites/perf.webkit.org/public/v2/index.html        2015-02-20 21:39:01 UTC (rev 180451)
</span><span class="lines">@@ -535,7 +535,7 @@
</span><span class="cx">                     {{interactive-chart
</span><span class="cx">                         chartData=pane.chartData
</span><span class="cx">                         ranges=pane.analyticRanges
</span><del>-                        domain=paneDomain
</del><ins>+                        domain=overviewDomain
</ins><span class="cx">                         interactive=true
</span><span class="cx">                         chartPointRadius=2
</span><span class="cx">                         currentItem=pane.hoveredOrSelectedItem
</span><span class="lines">@@ -621,52 +621,35 @@
</span><span class="cx">     &lt;/script&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;script type=&quot;text/x-handlebars&quot; data-template-name=&quot;testGroupForm&quot;&gt;
</span><del>-    {{#if roots}}
</del><span class="cx">         &lt;form method=&quot;POST&quot; {{action &quot;createTestGroup&quot; newTestGroupName repetitionCount on=&quot;submit&quot;}}&gt;
</span><span class="cx">             &lt;section class=&quot;analysis-group&quot;&gt;
</span><span class="cx">                 &lt;h1&gt;{{input name=&quot;name&quot; value=newTestGroupName placeholder=&quot;Test group name&quot; required=true type=&quot;text&quot;}}&lt;/h1&gt;
</span><span class="cx">                 &lt;table&gt;
</span><span class="cx">                     &lt;thead&gt;
</span><span class="cx">                         &lt;tr&gt;
</span><del>-                            &lt;th&gt;Root&lt;/th&gt;
-                            {{#each testSets}}
-                                &lt;th&gt;
-                                    {{name}}
-                                    {{view Ember.Select
-                                        content=options
-                                        optionValuePath=&quot;content.value&quot;
-                                        optionLabelPath=&quot;content.label&quot;
-                                        selection=selection}}
-                                &lt;/th&gt;
</del><ins>+                            &lt;th&gt;Configuration&lt;/th&gt;
+                            {{#each configurations}}
+                                &lt;th&gt;{{this}}&lt;/th&gt;
</ins><span class="cx">                             {{/each}}
</span><span class="cx">                         &lt;/tr&gt;
</span><span class="cx">                     &lt;/thead&gt;
</span><span class="cx">                     &lt;tbody&gt;
</span><del>-                        {{#each roots}}
</del><ins>+                        {{#each rootConfigurations}}
</ins><span class="cx">                             &lt;tr&gt;
</span><span class="cx">                                 &lt;th&gt;{{name}}&lt;/th&gt;
</span><span class="cx">                                 {{#each sets}}
</span><del>-                                    &lt;td&gt;{{view Ember.Select name=name content=revisions disabled=true
</del><ins>+                                    &lt;td&gt;{{view Ember.Select name=name content=options disabled=true
</ins><span class="cx">                                         optionValuePath=&quot;content.value&quot; optionLabelPath=&quot;content.label&quot;
</span><span class="cx">                                         selection=selection}}&lt;/td&gt;
</span><span class="cx">                                 {{/each}}
</span><span class="cx">                             &lt;/tr&gt;
</span><span class="cx">                         {{/each}}
</span><span class="cx">                     &lt;/tbody&gt;
</span><del>-                    &lt;tbody&gt;
-                        &lt;tr&gt;
-                            &lt;th&gt;Number of runs&lt;/th&gt;
-                            &lt;td colspan=2&gt;
-                                {{view Ember.Select content=possibleRepetitionCounts value=repetitionCount}}
-                            &lt;/td&gt;
-                        &lt;/tr&gt;
-                    &lt;/tbody&gt;
</del><span class="cx">                 &lt;/table&gt;
</span><del>-
</del><ins>+                &lt;label&gt;Number of runs {{view Ember.Select content=possibleRepetitionCounts value=repetitionCount}}&lt;/label&gt;
</ins><span class="cx">                 &lt;button type=&quot;submit&quot;&gt;Start A/B testing&lt;/button&gt;
</span><span class="cx">             &lt;/section&gt;
</span><span class="cx">         &lt;/form&gt;
</span><del>-    {{/if}}
</del><span class="cx">     &lt;/script&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;/head&gt;
</span></span></pre>
</div>
</div>

</body>
</html>