@@ -357,7 +457,7 @@ exports[`Results View The table should match snapshot and other elements should
@@ -452,18 +552,18 @@ exports[`Results View The table should match snapshot and other elements should
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -568,25 +604,25 @@ exports[`Results View The table should match snapshot and other elements should
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
(
- 2
+ 4
)
- 0 %
+ +1.85%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -917,7 +945,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
- 0 %
+ +1.08%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1116,7 +1136,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
- 0 %
+ -2.40%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1315,7 +1327,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
- 0 %
+ -2.40%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1514,7 +1518,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
@@ -974,6 +974,133 @@ exports[`Results Table Should match snapshot 1`] = `
+
+
+
+
+
+
+
+
+ How to read the results
+
+
+
+ Each row is one
+
+ platform
+
+ .
+
+ Base
+
+ is the old build;
+
+ New
+
+ is your change.
+
+
+
+ Base
+
+ and
+
+ New
+
+ show the average result for each build, in the test's unit.
+
+
+
+ Δ Median %
+
+ shows how much the middle result moved from Base to New. A plus sign means New is higher; a minus sign means New is lower.
+
+
+
+ Status
+
+ says whether the change is an
+
+
+ Improvement
+
+ , a
+
+ Regression
+
+ , or
+
+
+ No change
+
+ . If a result is likely just
+
+
+ Noise
+
+ (random run-to-run variation) rather than a real change, a “Noise” tag appears above the status — use the Status filter to hide or focus on the noisy rows.
+
+
+
+ Magnitude
+
+ says how big the difference is: negligible, small, medium, or large. Sort or filter by it to focus on the biggest changes.
+
+
+ Use
+
+ Advanced columns
+
+ to add the expert stats (Cliff's Delta, CLES, and Significance).
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
-
-
-
+ talos
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
- talos
-
-
-
-
-
-
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
- Mann-Whitney-U
-
-
-
-
-
-
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+ Advanced columns
+
+
-
-
-
+
- All revisions
+
-
-
-
-
-
-
-
-
- Download JSON
-
-
-
-
-
-
@@ -1330,7 +1557,7 @@ exports[`Results Table Should match snapshot 1`] = `
@@ -1411,10 +1638,10 @@ exports[`Results Table Should match snapshot 1`] = `
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -1425,18 +1652,18 @@ exports[`Results Table Should match snapshot 1`] = `
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -1541,25 +1704,25 @@ exports[`Results Table Should match snapshot 1`] = `
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
(
- 2
+ 4
)
- 0 %
+ +1.85%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1890,7 +2045,7 @@ exports[`Results Table Should match snapshot 1`] = `
data-testid="expand-revision-button"
>
- 0 %
+ +1.08%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -2089,7 +2236,7 @@ exports[`Results Table Should match snapshot 1`] = `
data-testid="expand-revision-button"
>
- 0 %
+ -2.40%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -2288,7 +2427,7 @@ exports[`Results Table Should match snapshot 1`] = `
data-testid="expand-revision-button"
>
- 0 %
+ -2.40%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -2574,7 +2705,7 @@ exports[`Results Table Should match snapshot 1`] = `
data-testid="expand-revision-button"
>
@@ -2639,7 +2770,7 @@ exports[`Results Table can load the sort parameters from the URL for a descendin
exports[`Results Table can load the sort parameters from the URL for an ascending sort 1`] = `
@@ -2664,7 +2795,7 @@ exports[`Results Table can load the sort parameters from the URL for an ascendin
exports[`Results Table can sort the table and persist the sort parameters to the URL 1`] = `
@@ -2689,7 +2820,7 @@ exports[`Results Table can sort the table and persist the sort parameters to the
exports[`Results Table can sort the table and persist the sort parameters to the URL 2`] = `
@@ -2734,7 +2865,7 @@ exports[`Results Table can sort the table and persist the sort parameters to the
exports[`Results Table can sort the table and persist the sort parameters to the URL 3`] = `
@@ -2787,7 +2918,7 @@ exports[`Results Table can sort the table and persist the sort parameters to the
exports[`Results Table can sort the table and persist the sort parameters to the URL 4`] = `
@@ -2840,7 +2971,7 @@ exports[`Results Table can sort the table and persist the sort parameters to the
exports[`Results Table can sort the table and persist the sort parameters to the URL 5`] = `
@@ -3224,7 +3355,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_qb_"
+ id="_r_r1_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -3551,7 +3682,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_qj_"
+ id="_r_r9_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -3777,7 +3908,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
class="MuiGrid-root MuiGrid-direction-xs-row MuiGrid-grid-xs-12 css-16nz7cf-MuiGrid-root"
>
@@ -3857,6 +3988,133 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
+
+
+
+
+
+
+
+
+ How to read the results
+
+
+
+ Each row is one
+
+ platform
+
+ .
+
+ Base
+
+ is the old build;
+
+ New
+
+ is your change.
+
+
+
+ Base
+
+ and
+
+ New
+
+ show the average result for each build, in the test's unit.
+
+
+
+ Δ Median %
+
+ shows how much the middle result moved from Base to New. A plus sign means New is higher; a minus sign means New is lower.
+
+
+
+ Status
+
+ says whether the change is an
+
+
+ Improvement
+
+ , a
+
+ Regression
+
+ , or
+
+
+ No change
+
+ . If a result is likely just
+
+
+ Noise
+
+ (random run-to-run variation) rather than a real change, a “Noise” tag appears above the status — use the Status filter to hide or focus on the noisy rows.
+
+
+
+ Magnitude
+
+ says how big the difference is: negligible, small, medium, or large. Sort or filter by it to focus on the biggest changes.
+
+
+ Use
+
+ Advanced columns
+
+ to add the expert stats (Cliff's Delta, CLES, and Significance).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
- talos
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
- Mann-Whitney-U
-
-
-
-
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+ All revisions
+
+
+
-
-
-
+
- All revisions
+
+
+
-
-
-
-
-
+
+
-
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
- Download JSON
-
-
-
-
-
+
+ Download JSON
+
+
+
+
@@ -4213,7 +4571,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
@@ -4294,10 +4652,10 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -4308,18 +4666,18 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
Status
(
- 3
+ 4
)
@@ -4376,8 +4734,8 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
data-mui-internal-clone-element="true"
>
@@ -4392,10 +4750,10 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by CLES (%)
+ Not sorted by CLES
- CLES (%)
+ CLES
@@ -4409,7 +4767,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
>
@@ -4431,7 +4789,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
- 1.849 %
+ +1.85%
-
-
-
- Regression
+ Noise
+
+
+
+
+
+ Regression
+
- -
+ Noise
- 1.078 %
+ +1.08%
-
-
-
- Improvement
+ Noise
+
+
+
+
+
+ Improvement
+
- -
+ Noise
- -2.401 %
+ -2.40%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
-
-
-
+ Real
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
-
-
-
+ Real
@@ -5570,7 +5928,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 2`] = `
@@ -5595,7 +5953,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 3`] = `
@@ -5640,7 +5998,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 4`] = `
@@ -5684,7 +6042,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 5`] = `
@@ -5735,8 +6093,8 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 6`] = `
@@ -5751,10 +6109,10 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
d="M11 6.83 9.41 8.41 8 7l4-4 4 4-1.41 1.41L13 6.83V21h-2z"
/>
- Sorted by CLES (%) in descending order
+ Sorted by CLES in descending order
- CLES (%)
+ CLES
@@ -5780,8 +6138,8 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 7`] = `
@@ -5796,10 +6154,10 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
d="M11 6.83 9.41 8.41 8 7l4-4 4 4-1.41 1.41L13 6.83V21h-2z"
/>
- Sorted by CLES (%) in ascending order
+ Sorted by CLES in ascending order
- CLES (%)
+ CLES
@@ -5835,33 +6193,33 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
[
"a11yr dhtml.html opt e10s fission stylo webrender",
" rev: spam",
- " - Linux 18.04, 1.849 %, Regression, -, -, 45.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 0.1, -, 25.00 %",
- " - Windows 10, -, , -, , 100.00 %",
- " - Windows 10, -2.401 %, , -, , 50.00 %",
+ " - Linux 18.04, +1.85%, Regression, -, Noise, 45.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 0.1, Noise, 25.00 %",
+ " - Windows 10, -, , -, Real, 100.00 %",
+ " - Windows 10, -2.40%, , -, Real, 50.00 %",
" rev: tictactoe",
- " - Linux 18.04, 1.849 %, Regression, 0.8, -, 44.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 0.9, -, 24.00 %",
- " - Windows 10, -, , 0.8, , 99.00 %",
- " - Windows 10, -2.401 %, , 0.8, , 49.00 %",
+ " - Linux 18.04, +1.85%, Regression, 0.8, Noise, 44.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 0.9, Noise, 24.00 %",
+ " - Windows 10, -, , 0.8, Real, 99.00 %",
+ " - Windows 10, -2.40%, , 0.8, Real, 49.00 %",
"a11yr aria.html opt e10s fission stylo webrender",
" rev: spam",
- " - Linux 18.04, 1.849 %, Regression, 1.2, -, 44.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 1.3, -, 24.00 %",
- " - Windows 10, -, , 1.2, , 99.00 %",
- " - Windows 10, -2.401 %, , 1.2, , 49.00 %",
+ " - Linux 18.04, +1.85%, Regression, 1.2, Noise, 44.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 1.3, Noise, 24.00 %",
+ " - Windows 10, -, , 1.2, Real, 99.00 %",
+ " - Windows 10, -2.40%, , 1.2, Real, 49.00 %",
" rev: tictactoe",
- " - Linux 18.04, 1.849 %, Regression, 2, -, 43.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 2.1, -, 23.00 %",
- " - Windows 10, -, , 2, , 98.00 %",
- " - Windows 10, -2.401 %, , 2, , 48.00 %",
+ " - Linux 18.04, +1.85%, Regression, 2, Noise, 43.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 2.1, Noise, 23.00 %",
+ " - Windows 10, -, , 2, Real, 98.00 %",
+ " - Windows 10, -2.40%, , 2, Real, 48.00 %",
]
`;
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 9`] = `
@@ -5876,10 +6234,10 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
d="M11 6.83 9.41 8.41 8 7l4-4 4 4-1.41 1.41L13 6.83V21h-2z"
/>
- Sorted by MD (%) in descending order
+ Sorted by Δ Median in descending order
- MD (%)
+ Δ Median
@@ -5907,33 +6265,33 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
[
"a11yr dhtml.html opt e10s fission stylo webrender",
" rev: spam",
- " - Windows 10, -2.401 %, , -, , 50.00 %",
- " - Windows 10, -, , -, , 100.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 0.1, -, 25.00 %",
- " - Linux 18.04, 1.849 %, Regression, -, -, 45.00 %",
+ " - Windows 10, -2.40%, , -, Real, 50.00 %",
+ " - Windows 10, -, , -, Real, 100.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 0.1, Noise, 25.00 %",
+ " - Linux 18.04, +1.85%, Regression, -, Noise, 45.00 %",
" rev: tictactoe",
- " - Windows 10, -2.401 %, , 0.8, , 49.00 %",
- " - Windows 10, -, , 0.8, , 99.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 0.9, -, 24.00 %",
- " - Linux 18.04, 1.849 %, Regression, 0.8, -, 44.00 %",
+ " - Windows 10, -2.40%, , 0.8, Real, 49.00 %",
+ " - Windows 10, -, , 0.8, Real, 99.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 0.9, Noise, 24.00 %",
+ " - Linux 18.04, +1.85%, Regression, 0.8, Noise, 44.00 %",
"a11yr aria.html opt e10s fission stylo webrender",
" rev: spam",
- " - Windows 10, -2.401 %, , 1.2, , 49.00 %",
- " - Windows 10, -, , 1.2, , 99.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 1.3, -, 24.00 %",
- " - Linux 18.04, 1.849 %, Regression, 1.2, -, 44.00 %",
+ " - Windows 10, -2.40%, , 1.2, Real, 49.00 %",
+ " - Windows 10, -, , 1.2, Real, 99.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 1.3, Noise, 24.00 %",
+ " - Linux 18.04, +1.85%, Regression, 1.2, Noise, 44.00 %",
" rev: tictactoe",
- " - Windows 10, -2.401 %, , 2, , 48.00 %",
- " - Windows 10, -, , 2, , 98.00 %",
- " - macOS 10.15, 1.078 %, Improvement, 2.1, -, 23.00 %",
- " - Linux 18.04, 1.849 %, Regression, 2, -, 43.00 %",
+ " - Windows 10, -2.40%, , 2, Real, 48.00 %",
+ " - Windows 10, -, , 2, Real, 98.00 %",
+ " - macOS 10.15, +1.08%, Improvement, 2.1, Noise, 23.00 %",
+ " - Linux 18.04, +1.85%, Regression, 2, Noise, 43.00 %",
]
`;
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion can sort params from the URL on mann-whitney-u test_version 11`] = `
@@ -5948,10 +6306,10 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
d="M11 6.83 9.41 8.41 8 7l4-4 4 4-1.41 1.41L13 6.83V21h-2z"
/>
- Sorted by MD (%) in ascending order
+ Sorted by Δ Median in ascending order
- MD (%)
+ Δ Median
@@ -5988,7 +6346,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
aria-controls="significance"
aria-haspopup="true"
aria-label="Sig (Click to filter values)"
- class="MuiButtonBase-root MuiButtonGroup-grouped MuiButtonGroup-groupedHorizontal MuiButtonGroup-groupedContained MuiButtonGroup-groupedContainedHorizontal MuiButtonGroup-groupedContainedTableHeaderButton MuiButton-root MuiButton-contained MuiButton-containedTableHeaderButton MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorTableHeaderButton MuiButton-disableElevation MuiButtonGroup-lastButton css-l81dbu-MuiButtonBase-root-MuiButton-root"
+ class="MuiButtonBase-root MuiButtonGroup-grouped MuiButtonGroup-groupedHorizontal MuiButtonGroup-groupedContained MuiButtonGroup-groupedContainedHorizontal MuiButtonGroup-groupedContainedTableHeaderButton MuiButton-root MuiButton-contained MuiButton-containedTableHeaderButton MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorTableHeaderButton MuiButton-disableElevation MuiButtonGroup-lastButton css-kne8o5-MuiButtonBase-root-MuiButton-root"
data-mui-internal-clone-element="true"
tabindex="0"
type="button"
@@ -6038,7 +6396,7 @@ exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion
exports[`Results Table for MannWhitneyResultsItem for mann-whitney-u testVersion should render different blocks when rendering several revisions 1`] = `
- 1.078 %
+ +1.08%
-
-
-
- Improvement
+ Noise
+
+
+
+
+
+ Improvement
+
- -
+ Noise
- 1.078 %
+ +1.08%
-
-
-
- Improvement
+ Noise
+
+
+
+
+
+ Improvement
+
- -
+ Noise
-
-
+
+
+
+
+
+
+
+ How to read the results
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ build_metrics
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
- build_metrics
-
-
-
-
-
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
- Mann-Whitney-U
-
-
-
-
-
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
+
+ Advanced columns
+
+
-
-
-
+
- All revisions
+
+
+
-
-
-
-
-
+
+
-
-
+ Download JSON
+
+
-
-
-
- Download JSON
-
-
-
-
-
-
@@ -1472,7 +1570,7 @@ exports[`Results View The table should match snapshot and other elements should
@@ -1553,10 +1651,10 @@ exports[`Results View The table should match snapshot and other elements should
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -1567,18 +1665,18 @@ exports[`Results View The table should match snapshot and other elements should
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -1683,25 +1717,25 @@ exports[`Results View The table should match snapshot and other elements should
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
(
- 2
+ 4
)
- 0 %
+ +1.85%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -2032,7 +2058,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
- 0 %
+ +1.08%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -2231,7 +2249,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
- 0 %
+ -2.40%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -2430,7 +2440,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
- 0 %
+ -2.40%
-
-
- -
-
-
- -
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -2629,7 +2631,7 @@ exports[`Results View The table should match snapshot and other elements should
data-testid="expand-revision-button"
>
@@ -28,7 +28,7 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting can sort the table and persist the information to the URL of mann-whitney-u values 2`] = `
@@ -73,7 +73,7 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting can sort the table and persist the information to the URL of mann-whitney-u values 3`] = `
@@ -126,7 +126,7 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting can sort the table and persist the information to the URL of mann-whitney-u values 4`] = `
@@ -179,7 +179,7 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting can sort the table and persist the information to the URL of mann-whitney-u values 5`] = `
@@ -222,8 +222,8 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting can sort the table and persist the information to the URL of mann-whitney-u values 6`] = `
@@ -238,10 +238,10 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
d="M11 6.83 9.41 8.41 8 7l4-4 4 4-1.41 1.41L13 6.83V21h-2z"
/>
- Sorted by CLES (%) in descending order
+ Sorted by CLES in descending order
- CLES (%)
+ CLES
@@ -268,7 +268,7 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting initializes the sort from the URL at load time for a descending sort 1`] = `
@@ -293,7 +293,7 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting initializes the sort from the URL at load time for an ascending sort 1`] = `
@@ -318,7 +318,7 @@ exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion tabl
exports[`SubtestsResultsView Component Tests for mann-whitney-u testVersion table sorting initializes the sort from the URL at load time for an implicit descending sort 1`] = `
@@ -494,7 +494,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
class="MuiGrid-root MuiGrid-direction-xs-row MuiGrid-grid-xs-12 css-16nz7cf-MuiGrid-root"
>
@@ -744,7 +744,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
aria-invalid="false"
aria-label="Search by title"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd css-3v3un6-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_n_"
+ id="_r_j_"
placeholder="Filter results"
type="search"
value=""
@@ -832,6 +832,64 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
Retrigger test
+
+
+
+
+ Advanced columns
+
+
+
+
+
+
+
+
+
+
+
@@ -850,7 +908,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
>
@@ -904,13 +962,13 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
role="columnheader"
>
@@ -925,10 +983,10 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -939,18 +997,18 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -1055,25 +1049,25 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
(
- 2
+ 4
)
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1252,7 +1237,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
role="cell"
>
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1400,7 +1376,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
role="cell"
>
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1548,7 +1515,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
role="cell"
>
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1696,7 +1654,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
role="cell"
>
- 0 %
+ +0.98%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -1844,7 +1793,7 @@ exports[`SubtestsResultsView Component Tests should render the subtests results
role="cell"
>
@@ -1902,7 +1851,7 @@ exports[`SubtestsResultsView Component Tests table sorting can sort the table an
exports[`SubtestsResultsView Component Tests table sorting can sort the table and persist the information to the URL 2`] = `
@@ -1947,7 +1896,7 @@ exports[`SubtestsResultsView Component Tests table sorting can sort the table an
exports[`SubtestsResultsView Component Tests table sorting can sort the table and persist the information to the URL 3`] = `
@@ -2000,7 +1949,7 @@ exports[`SubtestsResultsView Component Tests table sorting can sort the table an
exports[`SubtestsResultsView Component Tests table sorting can sort the table and persist the information to the URL 4`] = `
@@ -2053,7 +2002,7 @@ exports[`SubtestsResultsView Component Tests table sorting can sort the table an
exports[`SubtestsResultsView Component Tests table sorting can sort the table and persist the information to the URL 5`] = `
@@ -2097,7 +2046,7 @@ exports[`SubtestsResultsView Component Tests table sorting can sort the table an
exports[`SubtestsResultsView Component Tests table sorting can sort the table and persist the information to the URL 6`] = `
@@ -2141,7 +2090,7 @@ exports[`SubtestsResultsView Component Tests table sorting can sort the table an
exports[`SubtestsResultsView Component Tests table sorting can sort the table and persist the information to the URL 7`] = `
@@ -2186,7 +2135,7 @@ exports[`SubtestsResultsView Component Tests table sorting can sort the table an
exports[`SubtestsResultsView Component Tests table sorting initializes the sort from the URL at load time for a descending sort 1`] = `
@@ -2211,7 +2160,7 @@ exports[`SubtestsResultsView Component Tests table sorting initializes the sort
exports[`SubtestsResultsView Component Tests table sorting initializes the sort from the URL at load time for an ascending sort 1`] = `
@@ -2236,7 +2185,7 @@ exports[`SubtestsResultsView Component Tests table sorting initializes the sort
exports[`SubtestsResultsView Component Tests table sorting initializes the sort from the URL at load time for an implicit descending sort 1`] = `
@@ -2413,7 +2362,7 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
class="MuiGrid-root MuiGrid-direction-xs-row MuiGrid-grid-xs-12 css-16nz7cf-MuiGrid-root"
>
@@ -2655,7 +2604,7 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
aria-invalid="false"
aria-label="Search by title"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd css-3v3un6-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_sl_"
+ id="_r_s5_"
placeholder="Filter results"
type="search"
value=""
@@ -2743,6 +2692,64 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
Retrigger test
+
+
+
+
+ Advanced columns
+
+
+
+
+
+
+
+
+
+
+
@@ -2761,7 +2768,7 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
>
@@ -2815,13 +2822,13 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
role="columnheader"
>
@@ -2836,10 +2843,10 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -2850,18 +2857,18 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -2966,25 +2909,25 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
(
- 2
+ 4
)
- 0.963 %
+ +1.14%
-
-
-
- -0.04
-
-
- 15.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+ Noise
+
+
+
- -
+ Negligible
- 1.135 %
+ +1.14%
-
-
-
- Regression
+
+
+
+ Regression
+
-
- 0.02
-
-
- 60.00%
-
-
-
-
-
-
+ Negligible
- 0.963 %
+ +1.14%
-
-
-
- -0.05
-
-
- 50.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
-
-
-
+ Negligible
- 1.135 %
+ +1.14%
-
-
-
- 0.12
-
-
- 25.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
-
-
-
+ Small
- 0.98 %
+ +0.98%
-
-
-
- Improvement
+
+
+
+ Improvement
+
-
- 0.01
-
-
- 45.00%
-
-
- -
+ Negligible
@@ -4257,7 +4121,7 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
aria-invalid="false"
aria-label="Search by title"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd css-3v3un6-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_ps_"
+ id="_r_pg_"
placeholder="Filter results"
type="search"
value=""
@@ -4345,6 +4209,64 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
Retrigger test
+
+
+
+
+ Advanced columns
+
+
+
+
+
+
+
+
+
+
+
@@ -4363,7 +4285,7 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
>
@@ -4417,13 +4339,13 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
role="columnheader"
>
@@ -4438,10 +4360,10 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -4452,18 +4374,18 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -4568,25 +4426,25 @@ exports[`SubtestsViewCompareOverTime Component Tests in mann-whitney-u testVersi
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
@@ -5965,7 +5802,7 @@ exports[`SubtestsViewCompareOverTime Component Tests renders over-time view when
>
@@ -6019,13 +5856,13 @@ exports[`SubtestsViewCompareOverTime Component Tests renders over-time view when
role="columnheader"
>
@@ -6040,10 +5877,10 @@ exports[`SubtestsViewCompareOverTime Component Tests renders over-time view when
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -6054,18 +5891,18 @@ exports[`SubtestsViewCompareOverTime Component Tests renders over-time view when
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -6170,25 +5943,25 @@ exports[`SubtestsViewCompareOverTime Component Tests renders over-time view when
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
(
- 2
+ 4
)
- 0.963 %
+ +1.14%
-
-
-
- -0.04
-
-
- 15.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+ Noise
+
+
+
- -
+ Negligible
- 1.135 %
+ +1.14%
-
-
-
- Regression
-
-
-
-
- 0.02
-
-
- 60.00%
+
+
+
+ Regression
+
+
-
-
-
-
+ Negligible
- 0.963 %
+ +1.14%
-
-
-
- -0.05
-
-
- 50.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
-
-
-
+ Negligible
- 1.135 %
+ +1.14%
-
-
-
- 0.12
-
-
- 25.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
-
-
-
+ Small
- 0.98 %
+ +0.98%
-
-
-
- Improvement
+
+
+
+ Improvement
+
-
- 0.01
-
-
- 45.00%
-
-
- -
+ Negligible
@@ -7461,7 +7155,7 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
aria-invalid="false"
aria-label="Search by title"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd css-3v3un6-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_dd_"
+ id="_r_d3_"
placeholder="Filter results"
type="search"
value=""
@@ -7549,6 +7243,64 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
Retrigger test
+
+
+
+
+ Advanced columns
+
+
+
+
+
+
+
+
+
+
+
@@ -7567,7 +7319,7 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
>
@@ -7621,13 +7373,13 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
role="columnheader"
>
@@ -7642,10 +7394,10 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by MD (%)
+ Not sorted by Δ Median
- MD (%)
+ Δ Median
@@ -7656,18 +7408,18 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
Status
(
- 3
+ 4
)
-
-
-
-
-
- Not sorted by CD
-
-
- CD
-
-
-
-
-
-
-
-
-
- Not sorted by CLES (%)
-
-
- CLES (%)
-
-
-
-
@@ -7772,25 +7460,25 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99zM9 3 5 6.99h3V14h2V6.99h3z"
/>
- Not sorted by Sig
+ Not sorted by Magnitude
- Sig
+ Magnitude
(
- 2
+ 4
)
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -7969,7 +7648,7 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
role="cell"
>
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -8117,7 +7787,7 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
role="cell"
>
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -8265,7 +7926,7 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
role="cell"
>
- 0 %
+ +1.14%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -8413,7 +8065,7 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
role="cell"
>
- 0 %
+ +0.98%
-
-
-
- -
-
-
- 0.00%
+ class="MuiBox-root css-izuqqr"
+ >
+
+
-
@@ -8561,7 +8204,7 @@ exports[`SubtestsViewCompareOverTime Component Tests should render the subtests
role="cell"
>
@@ -1221,7 +1221,7 @@ exports[`Compare Over Time should have an edit mode in Results View: After click
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_d1_"
+ id="_r_cu_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -2053,7 +2053,7 @@ exports[`Compare Over Time should remove the checked revision once X button is c
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-9wexq8-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_7q_"
+ id="_r_7p_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -2993,7 +2993,7 @@ exports[`Compare Over Time should update base repo, revisions and time-range aft
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_ea_"
+ id="_r_e6_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
diff --git a/src/__tests__/Search/__snapshots__/CompareWithBase.test.tsx.snap b/src/__tests__/Search/__snapshots__/CompareWithBase.test.tsx.snap
index fd6e35eea..afc98e436 100644
--- a/src/__tests__/Search/__snapshots__/CompareWithBase.test.tsx.snap
+++ b/src/__tests__/Search/__snapshots__/CompareWithBase.test.tsx.snap
@@ -742,7 +742,7 @@ exports[`Compare With Base selects and displays new framework when clicked 1`] =
@@ -1028,7 +1028,7 @@ exports[`Compare With Base should have an edit mode in Results View: After click
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4c_"
+ id="_r_4b_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -1375,7 +1375,7 @@ exports[`Compare With Base should have an edit mode in Results View: After click
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4l_"
+ id="_r_4k_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -1626,7 +1626,7 @@ exports[`Compare With Base should have an edit mode in Results View: After click
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4c_"
+ id="_r_4b_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -1973,7 +1973,7 @@ exports[`Compare With Base should have an edit mode in Results View: After click
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4l_"
+ id="_r_4k_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -2388,7 +2388,7 @@ exports[`Compare With Base should have an edit mode in Results View: Initial sta
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4c_"
+ id="_r_4b_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -2735,7 +2735,7 @@ exports[`Compare With Base should have an edit mode in Results View: Initial sta
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4l_"
+ id="_r_4k_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -3154,7 +3154,7 @@ exports[`Compare With Base should have an edit mode in Results View: after remov
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4c_"
+ id="_r_4b_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -3341,7 +3341,7 @@ exports[`Compare With Base should have an edit mode in Results View: after remov
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4l_"
+ id="_r_4k_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -3792,7 +3792,7 @@ exports[`Compare With Base should have an edit mode in Results View: after remov
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4c_"
+ id="_r_4b_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -4139,7 +4139,7 @@ exports[`Compare With Base should have an edit mode in Results View: after remov
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-16cokj7-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_4l_"
+ id="_r_4k_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -4585,7 +4585,7 @@ exports[`Compare With Base should remove the checked revision once X button is c
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-9wexq8-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_37_"
+ id="_r_36_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -4772,7 +4772,7 @@ exports[`Compare With Base should remove the checked revision once X button is c
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-9wexq8-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_3c_"
+ id="_r_3b_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
@@ -5238,7 +5238,7 @@ exports[`Compare With Base should remove the checked revision once X button is c
autocapitalize="none"
autocomplete="off"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputAdornedStart MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-9wexq8-MuiInputBase-input-MuiOutlinedInput-input"
- id="_r_3o_"
+ id="_r_3n_"
placeholder="Search by revision ID or author email"
role="combobox"
spellcheck="false"
diff --git a/src/__tests__/utils/test-utils.tsx b/src/__tests__/utils/test-utils.tsx
index c463034da..76bac0e87 100644
--- a/src/__tests__/utils/test-utils.tsx
+++ b/src/__tests__/utils/test-utils.tsx
@@ -14,8 +14,23 @@ import { VirtuosoMockContext } from 'react-virtuoso';
import { store } from './setupTests';
import SnackbarCloseButton from '../../components/Shared/SnackbarCloseButton';
+import {
+ updateShowCliffsDelta,
+ updateShowCles,
+ updateShowSignificance,
+} from '../../reducers/ColumnPrefsSlice';
import getProtocolTheme from '../../theme/protocolTheme';
+// Turn on all advanced results columns (Cliff's Delta, CLES, Significance) for
+// tests that exercise them. They're hidden by default (simplified view), so
+// call this before rendering in tests that assert on those columns. The store
+// is recreated in each test's beforeEach, so this only affects the current test.
+export function enableAdvancedColumns() {
+ store.dispatch(updateShowCliffsDelta(true));
+ store.dispatch(updateShowCles(true));
+ store.dispatch(updateShowSignificance(true));
+}
+
type ThemeConfig = Partial | null;
export function render(ui: React.ReactElement, themeConfig?: ThemeConfig) {
function Wrapper({ children }: { children: React.ReactNode }) {
diff --git a/src/common/constants.ts b/src/common/constants.ts
index cdafa0247..f783c5890 100644
--- a/src/common/constants.ts
+++ b/src/common/constants.ts
@@ -323,10 +323,20 @@ export const platformMap: Record = {
export const MANN_WHITNEY_U = 'mann-whitney-u' as TestVersion;
export const STUDENT_T = 'student-t' as TestVersion;
+// The results table locks to this width so the column headers never shrink
+// below their controls and collide. On narrower screens the page scrolls
+// horizontally instead (the sticky header and rows scroll together, since the
+// rows are virtualized in window-scroll mode).
+export const RESULTS_TABLE_MIN_WIDTH = '1200px';
+
+export const RESULTS_TABLE_MAX_WIDTH = '1450px';
+
export const tooltipSignificance =
'Significance of the comparison as determined by a Mann Whitney U test. A significant comparison has a p-value of less than 0.05.';
export const tooltipStatusMannWhitney =
- 'An improvement or regression being shown here means that the effect size is meaningful, and the difference has a significant p-value.';
+ 'Whether New is an Improvement, a Regression, or No change compared to Base. Results whose difference is likely just noise (not statistically significant) are tagged "Noise" above the status; filter the Status column by "Noise" to hide or focus on those rows.';
+export const tooltipMagnitude =
+ 'How big the difference between Base and New is, in plain words: negligible (barely any), small, medium, or large. It comes from how much the two sets of results overlap — the less they overlap, the bigger the difference. Sort or filter by it to focus on the biggest changes.';
export const tooltipTotalRuns =
'The total number of tasks/jobs that ran for this metric.';
export const tooltipBaseMean =
@@ -338,4 +348,4 @@ export const tooltipConfidence =
export const tooltipDelta =
'The percentage difference between the Base and New values';
export const tooltipMedianDiff =
- 'Median Diff %: The percentage change in median from Base to New: ((New − Base) / Base) × 100.';
+ 'Shows how much the middle result changed from Base to New. We line up all the runs from smallest to biggest and pick the middle one for each side, then show the change as a percent. A positive sign means New is higher; a negative sign means New is lower.';
diff --git a/src/common/store.ts b/src/common/store.ts
index 0e46ee60d..dc1a9ed09 100644
--- a/src/common/store.ts
+++ b/src/common/store.ts
@@ -1,5 +1,6 @@
import { configureStore } from '@reduxjs/toolkit';
+import columnPrefs from '../reducers/ColumnPrefsSlice';
import comparison from '../reducers/ComparisonSlice';
import selectedRevisions from '../reducers/SelectedRevisionsSlice';
import theme from '../reducers/ThemeSlice';
@@ -10,6 +11,7 @@ export const createStore = () =>
theme,
selectedRevisions,
comparison,
+ columnPrefs,
},
});
diff --git a/src/common/testVersions/index.ts b/src/common/testVersions/index.ts
index bf0e1ecb3..ff1077a0c 100644
--- a/src/common/testVersions/index.ts
+++ b/src/common/testVersions/index.ts
@@ -3,18 +3,25 @@ import type { ReactNode } from 'react';
import { mannWhitneyStrategy } from './mannWhitney';
import { studentTStrategy } from './studentT';
import { CombinedResultsItemType } from '../../types/state';
-import { TableConfig, TestVersion } from '../../types/types';
+import { AdvancedColumns, TableConfig, TestVersion } from '../../types/types';
export interface TestVersionStrategy {
- getColumns(isSubtestTable: boolean): TableConfig;
+ getColumns(
+ isSubtestTable: boolean,
+ advancedColumns: AdvancedColumns,
+ ): TableConfig;
getAvgValues(result: CombinedResultsItemType): {
baseAvg: number | null;
newAvg: number | null;
};
- renderColumns(result: CombinedResultsItemType): ReactNode;
+ renderColumns(
+ result: CombinedResultsItemType,
+ advancedColumns: AdvancedColumns,
+ ): ReactNode;
renderSubtestColumns(
result: CombinedResultsItemType,
expanded: boolean,
+ advancedColumns: AdvancedColumns,
): ReactNode;
renderExpandedLeft(result: CombinedResultsItemType): ReactNode;
getComparisonResult(result: CombinedResultsItemType): string;
@@ -54,6 +61,7 @@ export function getStrategy(testVersion: TestVersion): TestVersionStrategy {
export function getColumnsForVersion(
testVersion: TestVersion,
isSubtestTable: boolean,
+ advancedColumns: AdvancedColumns,
): TableConfig {
- return registry[testVersion].getColumns(isSubtestTable);
+ return registry[testVersion].getColumns(isSubtestTable, advancedColumns);
}
diff --git a/src/common/testVersions/mannWhitney.tsx b/src/common/testVersions/mannWhitney.tsx
index e7af9326c..649bf07a6 100644
--- a/src/common/testVersions/mannWhitney.tsx
+++ b/src/common/testVersions/mannWhitney.tsx
@@ -1,4 +1,3 @@
-import KeyboardDoubleArrowUpIcon from '@mui/icons-material/KeyboardDoubleArrowUp';
import ThumbDownIcon from '@mui/icons-material/ThumbDown';
import ThumbUpIcon from '@mui/icons-material/ThumbUp';
import WarningIcon from '@mui/icons-material/Warning';
@@ -13,7 +12,7 @@ import {
CombinedResultsItemType,
MannWhitneyResultsItem,
} from '../../types/state';
-import { TableConfig } from '../../types/types';
+import { AdvancedColumns, TableConfig } from '../../types/types';
import { bootstrapMedianDiffCI } from '../../utils/bootstrap-ci';
import { adaptUnit, formatNumber } from '../../utils/format';
import { capitalize } from '../../utils/helpers';
@@ -26,6 +25,7 @@ import { shapiroWilkTest } from '../../utils/shapiroWilk';
import { defaultSortFunction } from '../../utils/sortFunctions';
import {
tooltipBaseMean,
+ tooltipMagnitude,
tooltipMedianDiff,
tooltipNewMean,
tooltipSignificance,
@@ -79,26 +79,228 @@ const SW_NORMALITY_THRESHOLD = 0.2;
type NormalityResult = 'both' | 'one' | 'neither';
+// Shapiro-Wilk is run twice (base + new) per call and cell renderers invoke
+// this for every row on every render. Cache by the (stable) result object so
+// the test runs once per result rather than once per render.
+//
+// A WeakMap is a lookup table whose keys are objects (here, the result object).
+// "Weak" means it does not keep those objects alive: once a result is no longer
+// used anywhere else (e.g. the user loads new data), it gets garbage-collected
+// and its cache entry disappears on its own — so this cache never leaks memory
+// and needs no manual cleanup.
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
+const normalityCache = new WeakMap();
+
export function checkDistributionNormality(
result: MannWhitneyResultsItem,
): NormalityResult {
+ const cached = normalityCache.get(result);
+ if (cached !== undefined) return cached;
+
const baseResult = shapiroWilkTest(result.base_runs);
const newResult = shapiroWilkTest(result.new_runs);
const baseNormal =
baseResult !== null && baseResult.pvalue > SW_NORMALITY_THRESHOLD;
const newNormal =
newResult !== null && newResult.pvalue > SW_NORMALITY_THRESHOLD;
- if (baseNormal && newNormal) return 'both';
- if (baseNormal || newNormal) return 'one';
- return 'neither';
+ const value: NormalityResult =
+ baseNormal && newNormal
+ ? 'both'
+ : baseNormal || newNormal
+ ? 'one'
+ : 'neither';
+
+ normalityCache.set(result, value);
+ return value;
}
export function isDistributionNormal(result: MannWhitneyResultsItem): boolean {
return checkDistributionNormality(result) !== 'neither';
}
+function medianOf(values: number[]): number | null {
+ if (!values.length) return null;
+ const sorted = [...values].sort((a, b) => a - b);
+ const mid = Math.floor(sorted.length / 2);
+ return sorted.length % 2 === 0
+ ? (sorted[mid - 1] + sorted[mid]) / 2
+ : sorted[mid];
+}
+
+// Δ median as a signed percentage of the base median, computed from the raw
+// runs. This is the same basis as the expanded panel's "Δ median" blurb
+// (bootstrapMedianDiffCI's point estimate is median(new) - median(base) over
+// the same runs), so the column and the panel always agree.
+//
+// Cached by the (stable) result object (see the WeakMap note on normalityCache
+// above): this is called per row on every render and, in the Δ Median % sort
+// comparator, on every comparison — recomputing the median (which sorts both
+// run arrays) each time would be wasteful.
+const medianDiffPctCache = new WeakMap();
+
+export function medianDiffPct(result: MannWhitneyResultsItem): number | null {
+ const cached = medianDiffPctCache.get(result);
+ if (cached !== undefined) return cached;
+
+ const baseMedian = medianOf(result.base_runs ?? []);
+ const newMedian = medianOf(result.new_runs ?? []);
+ let value: number | null;
+ if (baseMedian === null || newMedian === null) {
+ // No data to compute from → "-".
+ value = null;
+ } else if (baseMedian === 0) {
+ // A zero base median yields 0% rather than an undefined division.
+ value = 0;
+ } else {
+ value = ((newMedian - baseMedian) / baseMedian) * 100;
+ }
+
+ medianDiffPctCache.set(result, value);
+ return value;
+}
+
+export function formatMedianDiffPct(pct: number): string {
+ return `${pct >= 0 ? '+' : ''}${pct.toFixed(2)}%`;
+}
+
+// Status cell: the direction of change (Improvement/Regression/No change),
+// with a "Noise" label above it when the result isn't statistically
+// significant. The Significance column is hidden by default (it's an advanced
+// column), so this keeps the noise signal visible in the simplified view.
+// Shared by the main and subtests rows so they render identically.
+function renderStatusCell(
+ directionOfChange: MannWhitneyResultsItem['direction_of_change'],
+ isNoise: boolean,
+) {
+ const isImprovement = directionOfChange === 'improvement';
+ const isRegression = directionOfChange === 'regression';
+ return (
+
+ );
+}
+
+// Single source of truth for the check, used by the Status cell /
+// filter and the Significance cell.
+function resultIsNoise(result: MannWhitneyResultsItem): boolean {
+ return result.mann_whitney_test?.interpretation === 'not significant';
+}
+
+// Magnitude cell — the plain-language Cliff's Delta interpretation
+// (negligible/small/medium/large). Shown only in the simplified view; the
+// numeric CD column covers it once advanced columns are on. Shared by the
+// main and subtests rows.
+function renderMagnitudeCell(interpretation: string) {
+ return (
+
+ );
+}
+
+// Significance cell — plain-language "Real" / "Noise" from the Mann-Whitney-U
+// interpretation. Only shown when the (advanced) Significance column is on.
+// Shared by the main and subtests rows.
+function renderSignificanceCell(interpretation: string | null | undefined) {
+ return (
+
+ );
+}
+
+// Δ Median % cell, shared by the main and subtests rows. Shows the run-based
+// median difference; a warning icon flags non-normal distributions, and "-"
+// when the value can't be computed.
+function renderMedianDiffCell(result: MannWhitneyResultsItem) {
+ const pct = medianDiffPct(result);
+ const normality = checkDistributionNormality(result);
+ return (
+
+ )}
+ {advancedColumns.significance &&
+ renderSignificanceCell(mann_whitney_test?.interpretation)}
>
);
},
diff --git a/src/common/testVersions/studentT.tsx b/src/common/testVersions/studentT.tsx
index 89c138cc9..b38abe4f4 100644
--- a/src/common/testVersions/studentT.tsx
+++ b/src/common/testVersions/studentT.tsx
@@ -9,7 +9,7 @@ import Distribution from '../../components/CompareResults/Distribution';
import { Strings } from '../../resources/Strings';
import { FontSize } from '../../styles';
import { CombinedResultsItemType, CompareResultsItem } from '../../types/state';
-import { TableConfig } from '../../types/types';
+import { AdvancedColumns, TableConfig } from '../../types/types';
import { formatNumber } from '../../utils/format';
import { getBrowserDisplay, getPlatformShortName } from '../../utils/platform';
import {
@@ -41,7 +41,10 @@ const confidenceIcons: Record<'Low' | 'Medium' | 'High', React.ReactNode> = {
};
export const studentTStrategy = {
- getColumns(isSubtestTable: boolean): TableConfig {
+ getColumns(
+ isSubtestTable: boolean,
+ _advancedColumns: AdvancedColumns,
+ ): TableConfig {
const platformConfig = isSubtestTable
? {
name: 'Subtests',
@@ -159,7 +162,11 @@ export const studentTStrategy = {
};
},
- renderSubtestColumns(result: CombinedResultsItemType, expanded: boolean) {
+ renderSubtestColumns(
+ result: CombinedResultsItemType,
+ expanded: boolean,
+ _advancedColumns: AdvancedColumns,
+ ) {
const {
test,
delta_percentage: deltaPercent,
@@ -308,7 +315,10 @@ export const studentTStrategy = {
return null;
},
- renderColumns(result: CombinedResultsItemType) {
+ renderColumns(
+ result: CombinedResultsItemType,
+ _advancedColumns: AdvancedColumns,
+ ) {
const {
is_improvement: improvement,
is_regression: regression,
diff --git a/src/components/CompareResults/AdvancedColumnsMenu.tsx b/src/components/CompareResults/AdvancedColumnsMenu.tsx
new file mode 100644
index 000000000..1f6515332
--- /dev/null
+++ b/src/components/CompareResults/AdvancedColumnsMenu.tsx
@@ -0,0 +1,123 @@
+import { useState } from 'react';
+
+import Checkbox from '@mui/material/Checkbox';
+import FormControl from '@mui/material/FormControl';
+import ListItemText from '@mui/material/ListItemText';
+import MenuItem from '@mui/material/MenuItem';
+import Select, { SelectChangeEvent } from '@mui/material/Select';
+import Tooltip from '@mui/material/Tooltip';
+
+import { useAppDispatch, useAppSelector } from '../../hooks/app';
+import useAdvancedColumns from '../../hooks/useAdvancedColumns';
+import useRawSearchParams from '../../hooks/useRawSearchParams';
+import {
+ updateShowCliffsDelta,
+ updateShowCles,
+ updateShowSignificance,
+} from '../../reducers/ColumnPrefsSlice';
+import type { AdvancedColumns } from '../../types/types';
+import {
+ ADVANCED_COLUMNS_PARAM,
+ CLIFFS_DELTA,
+ CLES,
+ SIGNIFICANCE,
+ serializeAdvancedColumns,
+} from '../../utils/advancedColumnsUrl';
+
+// The advanced statistics columns are toggled independently — any combination
+// can be shown. The option values reuse the URL keys so the dropdown, the URL
+// and the serializer share one source of truth. Shared by the main and
+// subtests controls.
+const COLUMN_OPTIONS = [
+ { key: CLIFFS_DELTA, label: "Cliff's Delta" },
+ { key: CLES, label: 'CLES' },
+ { key: SIGNIFICANCE, label: 'Significance' },
+] as const;
+
+function AdvancedColumnsMenu() {
+ const dispatch = useAppDispatch();
+ const mode = useAppSelector((state) => state.theme.mode);
+ const advancedColumns = useAdvancedColumns();
+ const [rawSearchParams, updateRawSearchParams] = useRawSearchParams();
+ // Track the Select's open state so the tooltip can be suppressed while the
+ // dropdown is open — otherwise it renders over (and hides) the checkboxes.
+ const [menuOpen, setMenuOpen] = useState(false);
+ const [tooltipOpen, setTooltipOpen] = useState(false);
+
+ // Derive the selected option values from the same serializer used for the
+ // URL, so the Select's value can't drift from the URL encoding.
+ const selectedKeys =
+ serializeAdvancedColumns(advancedColumns)?.split(',') ?? [];
+
+ const applyAdvancedColumns = (next: AdvancedColumns) => {
+ dispatch(updateShowCliffsDelta(next.cliffsDelta));
+ dispatch(updateShowCles(next.cles));
+ dispatch(updateShowSignificance(next.significance));
+
+ const params = new URLSearchParams(rawSearchParams);
+ const value = serializeAdvancedColumns(next);
+ if (value) {
+ params.set(ADVANCED_COLUMNS_PARAM, value);
+ } else {
+ params.delete(ADVANCED_COLUMNS_PARAM);
+ }
+ updateRawSearchParams(params);
+ };
+
+ const onChange = (event: SelectChangeEvent) => {
+ const { value } = event.target;
+ const keys = typeof value === 'string' ? value.split(',') : value;
+ applyAdvancedColumns({
+ cliffsDelta: keys.includes(CLIFFS_DELTA),
+ cles: keys.includes(CLES),
+ significance: keys.includes(SIGNIFICANCE),
+ });
+ };
+
+ return (
+ setTooltipOpen(true)}
+ onClose={() => setTooltipOpen(false)}
+ >
+
+
+
+
+ );
+}
+
+export default AdvancedColumnsMenu;
diff --git a/src/components/CompareResults/HowToReadResults.tsx b/src/components/CompareResults/HowToReadResults.tsx
new file mode 100644
index 000000000..ad1e29000
--- /dev/null
+++ b/src/components/CompareResults/HowToReadResults.tsx
@@ -0,0 +1,68 @@
+import Alert from '@mui/material/Alert';
+import AlertTitle from '@mui/material/AlertTitle';
+import Box from '@mui/material/Box';
+
+import { useAppDispatch, useAppSelector } from '../../hooks/app';
+import { updateShowHowToRead } from '../../reducers/ColumnPrefsSlice';
+
+// Beginner-friendly guide shown above the results table, explaining what each
+// column means in plain language.
+function HowToReadResults() {
+ const dispatch = useAppDispatch();
+ const showHowToRead = useAppSelector(
+ (state) => state.columnPrefs.showHowToRead,
+ );
+
+ if (!showHowToRead) {
+ return null;
+ }
+
+ const onClose = () => {
+ dispatch(updateShowHowToRead(false));
+ };
+
+ return (
+
+ How to read the results
+
+
+ Each row is one platform. Base is
+ the old build; New is your change.
+
+
+ Base and New show the average result
+ for each build, in the test's unit.
+
+
+ Δ Median % shows how much the middle result moved
+ from Base to New. A plus sign means New is higher; a minus sign means
+ New is lower.
+
+
+ Status says whether the change is an{' '}
+ Improvement, a Regression, or{' '}
+ No change. If a result is likely just{' '}
+ Noise (random run-to-run variation) rather than a
+ real change, a “Noise” tag appears above the status — use
+ the Status filter to hide or focus on the noisy rows.
+
+
+ Magnitude says how big the difference is: negligible,
+ small, medium, or large. Sort or filter by it to focus on the biggest
+ changes.
+
+
+ Use Advanced columns to add the expert stats
+ (Cliff's Delta, CLES, and Significance).
+
+
+
+ );
+}
+
+export default HowToReadResults;
diff --git a/src/components/CompareResults/ResultsControls.tsx b/src/components/CompareResults/ResultsControls.tsx
index 103ec22cf..35c3b8ea4 100644
--- a/src/components/CompareResults/ResultsControls.tsx
+++ b/src/components/CompareResults/ResultsControls.tsx
@@ -1,3 +1,4 @@
+import Box from '@mui/material/Box';
import Checkbox from '@mui/material/Checkbox';
import FormControl from '@mui/material/FormControl';
import FormControlLabel from '@mui/material/FormControlLabel';
@@ -5,10 +6,12 @@ import Grid from '@mui/material/Grid';
import Tooltip from '@mui/material/Tooltip';
import { style } from 'typestyle';
+import AdvancedColumnsMenu from './AdvancedColumnsMenu';
import { DownloadButton } from './DownloadButton';
import RevisionSelect from './RevisionSelect';
import SearchInput from './SearchInput';
-import { useAppSelector } from '../../hooks/app';
+import { useAppDispatch, useAppSelector } from '../../hooks/app';
+import { updateShowHowToRead } from '../../reducers/ColumnPrefsSlice';
import { Strings } from '../../resources/Strings';
import type { CombinedResultsItemType } from '../../types/state';
import type { Framework, TestVersion } from '../../types/types';
@@ -44,60 +47,46 @@ export default function ResultsControls({
onExpandAllChange,
}: Props) {
const mode = useAppSelector((state) => state.theme.mode);
+ const dispatch = useAppDispatch();
+ const showHowToRead = useAppSelector(
+ (state) => state.columnPrefs.showHowToRead,
+ );
+ const onShowHowToReadChange = (checked: boolean) => {
+ dispatch(updateShowHowToRead(checked));
+ };
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ {/* Row 1: the checkbox-style selections, on their own full-width row
+ above the input controls. */}
+
+
+
+ onShowHowToReadChange(e.target.checked)}
+ size='small'
+ />
+ }
+ label='How to read the results'
+ />
+
}
- label='Expand all'
+ label='Expand all rows'
/>
-
+
+
+
+ {/* Row 2: the input controls, full-width below the selections. */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
diff --git a/src/components/CompareResults/ResultsMain.tsx b/src/components/CompareResults/ResultsMain.tsx
index 85fbfb933..95a179b63 100644
--- a/src/components/CompareResults/ResultsMain.tsx
+++ b/src/components/CompareResults/ResultsMain.tsx
@@ -7,10 +7,15 @@ import { Container } from '@mui/system';
import { useLoaderData } from 'react-router';
import { style } from 'typestyle';
+import HowToReadResults from './HowToReadResults';
import type { LoaderReturnValue } from './loader';
import type { LoaderReturnValue as OverTimeLoaderReturnValue } from './overTimeLoader';
import ResultsTable from './ResultsTable';
-import { STUDENT_T, MANN_WHITNEY_U } from '../../common/constants';
+import {
+ STUDENT_T,
+ MANN_WHITNEY_U,
+ RESULTS_TABLE_MAX_WIDTH,
+} from '../../common/constants';
import { useAppSelector } from '../../hooks/app';
import useRawSearchParams from '../../hooks/useRawSearchParams';
import { Strings } from '../../resources/Strings';
@@ -146,7 +151,7 @@ function ResultsMain() {
return (
@@ -192,6 +197,7 @@ function ResultsMain() {
{testWarnings[testVersion] ?? testWarnings[MANN_WHITNEY_U]}
+
);
diff --git a/src/components/CompareResults/ResultsTable.tsx b/src/components/CompareResults/ResultsTable.tsx
index d2586273b..6e09acf78 100644
--- a/src/components/CompareResults/ResultsTable.tsx
+++ b/src/components/CompareResults/ResultsTable.tsx
@@ -1,4 +1,4 @@
-import { Suspense, useState } from 'react';
+import { Suspense, useMemo, useState } from 'react';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
@@ -10,7 +10,9 @@ import ResultsControls from './ResultsControls';
import TableContent from './TableContent';
import TableHeader from './TableHeader';
import { MANN_WHITNEY_U } from '../../common/constants';
+import useAdvancedColumns from '../../hooks/useAdvancedColumns';
import useRawSearchParams from '../../hooks/useRawSearchParams';
+import useSeedAdvancedColumnsFromUrl from '../../hooks/useSeedAdvancedColumnsFromUrl';
import useTableFilters from '../../hooks/useTableFilters';
import useTableSort from '../../hooks/useTableSort';
import { Framework, TestVersion } from '../../types/types';
@@ -35,9 +37,17 @@ export default function ResultsTable() {
// This is our custom hook that updates the search params without a rerender.
const [rawSearchParams, updateRawSearchParams] = useRawSearchParams();
- const columnsConfig = getColumnsConfiguration(
- false,
- testVersion ?? MANN_WHITNEY_U,
+ useSeedAdvancedColumnsFromUrl();
+ const advancedColumns = useAdvancedColumns();
+
+ const columnsConfig = useMemo(
+ () =>
+ getColumnsConfiguration(
+ false,
+ testVersion ?? MANN_WHITNEY_U,
+ advancedColumns,
+ ),
+ [testVersion, advancedColumns],
);
// This is our custom hook that manages table filters
diff --git a/src/components/CompareResults/RevisionRow.tsx b/src/components/CompareResults/RevisionRow.tsx
index 5a4a18f22..672f5d181 100644
--- a/src/components/CompareResults/RevisionRow.tsx
+++ b/src/components/CompareResults/RevisionRow.tsx
@@ -12,6 +12,7 @@ import { RetriggerButton } from './Retrigger/RetriggerButton';
import RevisionRowExpandable from './RevisionRowExpandable';
import { compareView, compareOverTimeView } from '../../common/constants';
import { getStrategy } from '../../common/testVersions';
+import useAdvancedColumns from '../../hooks/useAdvancedColumns';
import { useSubtestRegressionCount } from '../../hooks/useSubtestRegressionCount';
import { Strings } from '../../resources/Strings';
import { FontSize, Spacing } from '../../styles';
@@ -52,6 +53,8 @@ const browserName = style({
const revisionRow = style({
borderRadius: '4px 0px 0px 4px',
display: 'grid',
+ // Keep this gap in sync with the header grid in TableHeader.
+ columnGap: `${Spacing.Small}px`,
margin: `${Spacing.Small}px 0px 0px 0px`,
$nest: {
'.cell': {
@@ -246,6 +249,7 @@ function RevisionRow(props: RevisionRowProps) {
: baseRuns.length;
const newRunsCount = replicates ? newRunsReplicates.length : newRuns.length;
const strategy = getStrategy(testVersion);
+ const advancedColumns = useAdvancedColumns();
const { baseAvg: baseAvgValue, newAvg: newAvgValue } =
strategy.getAvgValues(result);
const [expanded, setExpanded] = useState(false);
@@ -312,7 +316,7 @@ function RevisionRow(props: RevisionRowProps) {
({newApp})
)}
+
+
+
>
);
@@ -119,7 +124,7 @@ function SubtestsResultsMain({ view }: SubtestsResultsMainProps) {
backgroundColor: themeColor100,
margin: '0 auto',
marginBottom: '80px',
- maxWidth: '1400px',
+ maxWidth: RESULTS_TABLE_MAX_WIDTH,
}),
title: style({
margin: 0,
diff --git a/src/components/CompareResults/SubtestsResults/SubtestsResultsTable.tsx b/src/components/CompareResults/SubtestsResults/SubtestsResultsTable.tsx
index 138c795d6..89c31337d 100644
--- a/src/components/CompareResults/SubtestsResults/SubtestsResultsTable.tsx
+++ b/src/components/CompareResults/SubtestsResults/SubtestsResultsTable.tsx
@@ -8,6 +8,8 @@ import SubtestsTableContent from './SubtestsTableContent';
import NoResultsFound from '.././NoResultsFound';
import TableHeader from '.././TableHeader';
import { STUDENT_T } from '../../../common/constants';
+import useAdvancedColumns from '../../../hooks/useAdvancedColumns';
+import useSeedAdvancedColumnsFromUrl from '../../../hooks/useSeedAdvancedColumnsFromUrl';
import useTableFilters, { filterResults } from '../../../hooks/useTableFilters';
import useTableSort, { sortResults } from '../../../hooks/useTableSort';
import type { CombinedResultsItemType } from '../../../types/state';
@@ -79,9 +81,12 @@ function SubtestsResultsTable({
replicates,
testVersion,
}: ResultsTableProps) {
- const columnsConfiguration = getColumnsConfiguration(
- true,
- testVersion ?? STUDENT_T,
+ useSeedAdvancedColumnsFromUrl();
+ const advancedColumns = useAdvancedColumns();
+ const columnsConfiguration = useMemo(
+ () =>
+ getColumnsConfiguration(true, testVersion ?? STUDENT_T, advancedColumns),
+ [testVersion, advancedColumns],
);
// This is our custom hook that manages table filters
// and provides methods for clearing and toggling them.
diff --git a/src/components/CompareResults/SubtestsResults/SubtestsRevisionRow.tsx b/src/components/CompareResults/SubtestsResults/SubtestsRevisionRow.tsx
index 0529f5495..b70e34eb8 100644
--- a/src/components/CompareResults/SubtestsResults/SubtestsRevisionRow.tsx
+++ b/src/components/CompareResults/SubtestsResults/SubtestsRevisionRow.tsx
@@ -7,8 +7,12 @@ import { IconButton, Box } from '@mui/material';
import { style } from 'typestyle';
import RevisionRowExpandable from '.././RevisionRowExpandable';
-import { MANN_WHITNEY_U } from '../../../common/constants';
+import {
+ MANN_WHITNEY_U,
+ RESULTS_TABLE_MIN_WIDTH,
+} from '../../../common/constants';
import { getStrategy } from '../../../common/testVersions';
+import useAdvancedColumns from '../../../hooks/useAdvancedColumns';
import { Strings } from '../../../resources/Strings';
import { Spacing } from '../../../styles';
import type { CombinedResultsItemType } from '../../../types/state';
@@ -17,6 +21,11 @@ import { TestVersion } from '../../../types/types';
const revisionRow = style({
borderRadius: '4px 0px 0px 4px',
display: 'grid',
+ // Keep this gap in sync with the header grid in TableHeader.
+ columnGap: `${Spacing.Small}px`,
+ // Floor the row width to match the header, so columns can't compress into
+ // each other; below this the page scrolls horizontally.
+ minWidth: RESULTS_TABLE_MIN_WIDTH,
margin: `${Spacing.Small}px 0px 0px 0px`,
alignItems: 'center',
$nest: {
@@ -119,6 +128,7 @@ function SubtestsRevisionRow(props: RevisionRowProps) {
};
const strategy = getStrategy(testVersion ?? MANN_WHITNEY_U);
+ const advancedColumns = useAdvancedColumns();
return (
<>
@@ -127,7 +137,7 @@ function SubtestsRevisionRow(props: RevisionRowProps) {
sx={{ gridTemplateColumns, backgroundColor: 'revisionRow.background' }}
role='row'
>
- {strategy.renderSubtestColumns(result, expanded)}
+ {strategy.renderSubtestColumns(result, expanded, advancedColumns)}
{name}
= displayLabel
+ ? {
+ padding: '6px 12px',
+ fontSize: '16px',
+ // Allow the icon + label to wrap on narrow screens rather than
+ // overflowing the cell and colliding with the next column.
+ whiteSpace: 'normal',
+ flexWrap: 'wrap',
+ lineHeight: 1.2,
+ }
+ : { padding: 0, minWidth: '24px !important', fontSize: '14px' };
// Have some margin between the icon and the text, and some less margin at the
// start, but only when there's some actual text.
const inlineIconStyle = displayLabel
@@ -299,12 +314,14 @@ function TableHeader({
const styles = {
tableHeader: style({
display: 'grid',
- // Should be kept in sync with the gridTemplateColumns from RevisionRow
+ // Should be kept in sync with the gridTemplateColumns and gap from RevisionRow
gridTemplateColumns: toGridTemplateColumns(columnsConfiguration),
+ columnGap: `${Spacing.Small}px`,
+ minWidth: RESULTS_TABLE_MIN_WIDTH,
background:
themeMode == 'light' ? Colors.Background100 : Colors.Background300Dark,
borderRadius: '4px',
- paddingBlock: Spacing.Small,
+ paddingBlock: Spacing.Medium,
marginTop: Spacing.Medium,
marginBottom: Spacing.Large,
$nest: {
@@ -422,7 +439,7 @@ function TableHeader({
return (
diff --git a/src/components/CompareResults/TableRevisionContent.tsx b/src/components/CompareResults/TableRevisionContent.tsx
index 3e972f573..77ef75595 100644
--- a/src/components/CompareResults/TableRevisionContent.tsx
+++ b/src/components/CompareResults/TableRevisionContent.tsx
@@ -3,7 +3,11 @@ import { style } from 'typestyle';
import LinkToRevision from './LinkToRevision';
import RevisionRow from './RevisionRow';
import TestHeader from './TestHeader';
-import type { compareView, compareOverTimeView } from '../../common/constants';
+import {
+ RESULTS_TABLE_MIN_WIDTH,
+ type compareView,
+ type compareOverTimeView,
+} from '../../common/constants';
import { Spacing } from '../../styles';
import type { CombinedResultsItemType } from '../../types/state';
import { TestVersion } from '../../types/types';
@@ -17,6 +21,9 @@ const styles = {
testBlock: style({
/* Note that this padding will be added to the padding below */
paddingTop: Spacing.Small,
+ // Floor the row width to match the header, so columns can't compress into
+ // each other; below this the page scrolls horizontally.
+ minWidth: RESULTS_TABLE_MIN_WIDTH,
}),
revisionBlock: style({ paddingBottom: Spacing.Large }),
};
diff --git a/src/hooks/useAdvancedColumns.ts b/src/hooks/useAdvancedColumns.ts
new file mode 100644
index 000000000..94c711545
--- /dev/null
+++ b/src/hooks/useAdvancedColumns.ts
@@ -0,0 +1,24 @@
+import { useMemo } from 'react';
+
+import { useAppSelector } from './app';
+import type { AdvancedColumns } from '../types/types';
+
+// Visibility of the advanced (power-user) statistics columns (Cliff's Delta,
+// CLES) from the columnPrefs slice. Returns a stable object memoized on the
+// two flags, so callers can use it directly in `useMemo` deps and pass it to
+// the strategy renderers without re-rendering on unrelated state changes.
+function useAdvancedColumns(): AdvancedColumns {
+ const cliffsDelta = useAppSelector(
+ (state) => state.columnPrefs.showCliffsDelta,
+ );
+ const cles = useAppSelector((state) => state.columnPrefs.showCles);
+ const significance = useAppSelector(
+ (state) => state.columnPrefs.showSignificance,
+ );
+ return useMemo(
+ () => ({ cliffsDelta, cles, significance }),
+ [cliffsDelta, cles, significance],
+ );
+}
+
+export default useAdvancedColumns;
diff --git a/src/hooks/useSeedAdvancedColumnsFromUrl.ts b/src/hooks/useSeedAdvancedColumnsFromUrl.ts
new file mode 100644
index 000000000..53d2b1634
--- /dev/null
+++ b/src/hooks/useSeedAdvancedColumnsFromUrl.ts
@@ -0,0 +1,34 @@
+import { useEffect } from 'react';
+
+import { useAppDispatch } from './app';
+import useRawSearchParams from './useRawSearchParams';
+import {
+ updateShowCliffsDelta,
+ updateShowCles,
+ updateShowSignificance,
+} from '../reducers/ColumnPrefsSlice';
+import {
+ ADVANCED_COLUMNS_PARAM,
+ parseAdvancedColumns,
+} from '../utils/advancedColumnsUrl';
+
+// On mount, seed the advanced-column visibility from the URL so a shared link
+// reproduces the selected columns. Toggling updates both the URL (for sharing)
+// and Redux (for reactive rendering); this only handles the initial
+// URL → Redux direction. Call once per results view.
+function useSeedAdvancedColumnsFromUrl() {
+ const [rawSearchParams] = useRawSearchParams();
+ const dispatch = useAppDispatch();
+ useEffect(() => {
+ const params = new URLSearchParams(rawSearchParams);
+ if (!params.has(ADVANCED_COLUMNS_PARAM)) {
+ return;
+ }
+ const { cliffsDelta, cles, significance } = parseAdvancedColumns(params);
+ dispatch(updateShowCliffsDelta(cliffsDelta));
+ dispatch(updateShowCles(cles));
+ dispatch(updateShowSignificance(significance));
+ }, []);
+}
+
+export default useSeedAdvancedColumnsFromUrl;
diff --git a/src/reducers/ColumnPrefsSlice.ts b/src/reducers/ColumnPrefsSlice.ts
new file mode 100644
index 000000000..0a3a379f9
--- /dev/null
+++ b/src/reducers/ColumnPrefsSlice.ts
@@ -0,0 +1,50 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit';
+
+export const HOW_TO_READ_STORAGE_KEY = 'showHowToRead';
+
+// Results-view display preferences:
+// - showCliffsDelta / showCles: the two advanced statistics columns, toggled
+// independently from the "Advanced columns" dropdown. Persisted in the URL
+// (see utils/advancedColumnsUrl) so shared links reproduce the selection;
+// seeded into this slice on mount. Default off (the simplified view).
+// - showHowToRead: when true the "How to read the results" helper panel is
+// shown above the table. Persisted to localStorage.
+const initialState: {
+ showCliffsDelta: boolean;
+ showCles: boolean;
+ showSignificance: boolean;
+ showHowToRead: boolean;
+} = {
+ showCliffsDelta: false,
+ showCles: false,
+ showSignificance: false,
+ showHowToRead: localStorage.getItem(HOW_TO_READ_STORAGE_KEY) !== 'false',
+};
+
+const columnPrefs = createSlice({
+ name: 'columnPrefs',
+ initialState,
+ reducers: {
+ updateShowCliffsDelta(state, action: PayloadAction) {
+ state.showCliffsDelta = action.payload;
+ },
+ updateShowCles(state, action: PayloadAction) {
+ state.showCles = action.payload;
+ },
+ updateShowSignificance(state, action: PayloadAction) {
+ state.showSignificance = action.payload;
+ },
+ updateShowHowToRead(state, action: PayloadAction) {
+ state.showHowToRead = action.payload;
+ localStorage.setItem(HOW_TO_READ_STORAGE_KEY, String(action.payload));
+ },
+ },
+});
+
+export const {
+ updateShowCliffsDelta,
+ updateShowCles,
+ updateShowSignificance,
+ updateShowHowToRead,
+} = columnPrefs.actions;
+export default columnPrefs.reducer;
diff --git a/src/types/types.ts b/src/types/types.ts
index 962134a0e..76e2a60d3 100644
--- a/src/types/types.ts
+++ b/src/types/types.ts
@@ -461,6 +461,15 @@ export type TokenBearer = {
export type TestVersion = 'student-t' | 'mann-whitney-u';
+// Per-column visibility for the advanced (power-user) statistics columns.
+// Each is toggled independently from the "Advanced columns" dropdown, so
+// either, both, or neither can be shown.
+export interface AdvancedColumns {
+ cliffsDelta: boolean;
+ cles: boolean;
+ significance: boolean;
+}
+
export type SortFunc = (
resultA: CombinedResultsItemType,
resultB: CombinedResultsItemType,
diff --git a/src/utils/advancedColumnsUrl.ts b/src/utils/advancedColumnsUrl.ts
new file mode 100644
index 000000000..f776acc25
--- /dev/null
+++ b/src/utils/advancedColumnsUrl.ts
@@ -0,0 +1,42 @@
+import type { AdvancedColumns } from '../types/types';
+
+// The advanced (power-user) columns are persisted in the URL so a shared link
+// reproduces the selected columns. Encoded as a comma-separated list of the
+// enabled column keys, e.g. `?advanced_columns=cliffs_delta,cles`. An absent
+// param means neither is shown (the simplified view).
+export const ADVANCED_COLUMNS_PARAM = 'advanced_columns';
+
+// The URL key for each advanced column. Exported so the dropdown's option
+// values reuse them and can't drift from the URL encoding.
+export const CLIFFS_DELTA = 'cliffs_delta';
+export const CLES = 'cles';
+export const SIGNIFICANCE = 'significance';
+
+// Parse advanced-column visibility from a URL search string or params.
+export function parseAdvancedColumns(
+ search: string | URLSearchParams,
+): AdvancedColumns {
+ const params =
+ typeof search === 'string' ? new URLSearchParams(search) : search;
+ const enabled = (params.get(ADVANCED_COLUMNS_PARAM) ?? '')
+ .split(',')
+ .filter(Boolean);
+ return {
+ cliffsDelta: enabled.includes(CLIFFS_DELTA),
+ cles: enabled.includes(CLES),
+ significance: enabled.includes(SIGNIFICANCE),
+ };
+}
+
+// Serialize to the comma-list value, or null when no advanced column is on so
+// the caller can delete the param and keep shared URLs clean.
+export function serializeAdvancedColumns(
+ advanced: AdvancedColumns,
+): string | null {
+ const enabled = [
+ advanced.cliffsDelta ? CLIFFS_DELTA : null,
+ advanced.cles ? CLES : null,
+ advanced.significance ? SIGNIFICANCE : null,
+ ].filter(Boolean);
+ return enabled.length ? enabled.join(',') : null;
+}
diff --git a/src/utils/rowTemplateColumns.ts b/src/utils/rowTemplateColumns.ts
index 1caa4d4a1..8830946ea 100644
--- a/src/utils/rowTemplateColumns.ts
+++ b/src/utils/rowTemplateColumns.ts
@@ -1,5 +1,5 @@
import { getColumnsForVersion } from '../common/testVersions';
-import { TableConfig, TestVersion } from '../types/types';
+import { AdvancedColumns, TableConfig, TestVersion } from '../types/types';
// Re-exported for consumers that import sort utilities from this module.
export {
@@ -11,6 +11,8 @@ export {
export const getColumnsConfiguration = (
isSubtestTable: boolean,
testVersion: TestVersion,
-): TableConfig => getColumnsForVersion(testVersion, isSubtestTable);
+ advancedColumns: AdvancedColumns,
+): TableConfig =>
+ getColumnsForVersion(testVersion, isSubtestTable, advancedColumns);
export { toGridTemplateColumns } from './gridTemplateColumns';