Skip to content

Commit 6c4afba

Browse files
jrobbinsjcscottiii
andauthored
Move availabity to separate columns (#999)
* code-complete * lint-fix * update-screenshots * resolve lit-analyzer error * lint-fix * resolve lit-analyzer error * Update frontend/src/static/js/components/webstatus-overview-table.ts Co-authored-by: James C Scott III <jcscottiii@users.noreply.github.com> * Update frontend/src/static/js/components/webstatus-overview-cells.ts Co-authored-by: James C Scott III <jcscottiii@users.noreply.github.com> * Update frontend/src/static/js/components/webstatus-overview-cells.ts Co-authored-by: James C Scott III <jcscottiii@users.noreply.github.com> * Update frontend/src/static/js/components/webstatus-overview-cells.ts Co-authored-by: James C Scott III <jcscottiii@users.noreply.github.com> * Update frontend/src/static/js/components/webstatus-overview-cells.ts Co-authored-by: James C Scott III <jcscottiii@users.noreply.github.com> --------- Co-authored-by: James C Scott III <jcscottiii@users.noreply.github.com>
1 parent 7c1883d commit 6c4afba

21 files changed

+150
-23
lines changed
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

frontend/src/static/js/components/test/webstatus-overview-cells.test.ts

+65-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
DEFAULT_COLUMN_OPTIONS,
2727
ColumnOptionKey,
2828
renderBaselineStatus,
29+
renderDesktopAvailablity,
2930
renderChromiumUsage,
3031
renderHeaderCell,
3132
CELL_DEFS,
@@ -429,6 +430,55 @@ describe('renderBaselineStatus', () => {
429430
});
430431
});
431432

433+
describe('renderDesktopAvailablity', () => {
434+
let container: HTMLElement;
435+
beforeEach(() => {
436+
container = document.createElement('td');
437+
});
438+
it('renders a full-color icon for an available feature', async () => {
439+
const feature: components['schemas']['Feature'] = {
440+
feature_id: 'id',
441+
name: 'name',
442+
browser_implementations: {
443+
chrome: {status: 'available', version: '123'},
444+
},
445+
};
446+
const result = renderDesktopAvailablity(
447+
feature,
448+
{search: ''},
449+
{browser: 'chrome'},
450+
);
451+
render(result, container);
452+
const el = await fixture(container);
453+
const div = el.querySelector('div');
454+
expect(div).to.exist;
455+
expect(div!.getAttribute('class')).to.equal('browser-impl-available');
456+
expect(div!.innerHTML).to.not.include('disabled');
457+
expect(div!.innerHTML).to.include('chrome_24x24.png');
458+
});
459+
it('renders a grayscale icon for an available feature', async () => {
460+
const feature: components['schemas']['Feature'] = {
461+
feature_id: 'id',
462+
name: 'name',
463+
browser_implementations: {
464+
chrome: {status: 'unavailable'},
465+
},
466+
};
467+
const result = renderDesktopAvailablity(
468+
feature,
469+
{search: ''},
470+
{browser: 'chrome'},
471+
);
472+
render(result, container);
473+
const el = await fixture(container);
474+
const div = el.querySelector('div');
475+
expect(div).to.exist;
476+
expect(div!.getAttribute('class')).to.equal('browser-impl-unavailable');
477+
expect(div!.innerHTML).to.include('disabled');
478+
expect(div!.innerHTML).to.include('chrome_24x24.png');
479+
});
480+
});
481+
432482
describe('calcColGroupSpans', () => {
433483
const TEST_COLS = [
434484
ColumnKey.Name,
@@ -596,7 +646,7 @@ describe('renderHeaderCell', () => {
596646
const th = el.querySelector('th');
597647
expect(th).to.exist;
598648
expect(th!.getAttribute('title')).to.equal('Click to sort');
599-
expect(th!.getAttribute('class')).to.equal('sortable');
649+
expect('' + th!.getAttribute('class')).to.include('sortable');
600650
});
601651
it('renders an unsortable header cell', async () => {
602652
CELL_DEFS[ColumnKey.BaselineStatus].unsortable = true;
@@ -610,6 +660,19 @@ describe('renderHeaderCell', () => {
610660
const th = el.querySelector('th');
611661
expect(th).to.exist;
612662
expect(th!.getAttribute('title')).to.not.equal('Click to sort');
613-
expect(th!.getAttribute('class')).to.not.equal('sortable');
663+
expect('' + th!.getAttribute('class')).to.not.include('sortable');
664+
});
665+
it('renders a header cell with a cell class', async () => {
666+
CELL_DEFS[ColumnKey.BaselineStatus].cellClass = 'cell-class';
667+
const result = renderHeaderCell(
668+
{search: '/'},
669+
ColumnKey.BaselineStatus,
670+
'',
671+
);
672+
render(result, container);
673+
const el = await fixture(container);
674+
const th = el.querySelector('th');
675+
expect(th).to.exist;
676+
expect(th!.getAttribute('class')).to.include('cell-class');
614677
});
615678
});

frontend/src/static/js/components/webstatus-overview-cells.ts

+74-18
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
} from '../utils/urls.js';
2323
import {FeatureSortOrderType} from '../api/client.js';
2424

25-
const MISSING_VALUE = html`---`;
25+
const MISSING_VALUE = html``;
2626

2727
type CellRenderer = {
2828
(
@@ -40,6 +40,7 @@ type ColumnDefinition = {
4040
group?: string;
4141
headerHtml: TemplateResult;
4242
cellRenderer: CellRenderer;
43+
cellClass?: string;
4344
unsortable?: boolean;
4445
options: {
4546
browser?: components['parameters']['browserPathParam'];
@@ -56,6 +57,10 @@ const NEWLY_TO_WIDELY_MONTH_OFFSET = 30;
5657
export enum ColumnKey {
5758
Name = 'name',
5859
BaselineStatus = 'baseline_status',
60+
DesktopAvailabilityChrome = 'desktop_availability_chrome',
61+
DesktopAvailabilityEdge = 'desktop_availability_edge',
62+
DesktopAvailabilityFirefox = 'desktop_availability_firefox',
63+
DesktopAvailabilitySafari = 'desktop_availability_safari',
5964
StableChrome = 'stable_chrome',
6065
StableEdge = 'stable_edge',
6166
StableFirefox = 'stable_firefox',
@@ -97,6 +102,10 @@ const columnOptionKeyMapping = Object.entries(ColumnOptionKey).reduce(
97102
export const DEFAULT_COLUMNS = [
98103
ColumnKey.Name,
99104
ColumnKey.BaselineStatus,
105+
ColumnKey.DesktopAvailabilityChrome,
106+
ColumnKey.DesktopAvailabilityEdge,
107+
ColumnKey.DesktopAvailabilityFirefox,
108+
ColumnKey.DesktopAvailabilitySafari,
100109
ColumnKey.StableChrome,
101110
ColumnKey.StableEdge,
102111
ColumnKey.StableFirefox,
@@ -260,12 +269,24 @@ export const renderBaselineStatus: CellRenderer = (
260269
`;
261270
};
262271

263-
const BROWSER_IMPL_ICONS: Record<
264-
NonNullable<components['schemas']['BrowserImplementation']['status']>,
265-
string
266-
> = {
267-
unavailable: 'minus-circle',
268-
available: 'check-circle',
272+
export const renderDesktopAvailablity: CellRenderer = (
273+
feature,
274+
_routerLocation,
275+
{browser},
276+
) => {
277+
const browserImpl = feature.browser_implementations?.[browser!];
278+
const browserImplStatus = browserImpl?.status || 'unavailable';
279+
const browserImplVersion = browserImpl?.version;
280+
return html`
281+
<div class="browser-impl-${browserImplStatus}">
282+
<sl-tooltip
283+
?disabled=${browserImplVersion === undefined}
284+
content="Since version ${browserImplVersion}"
285+
>
286+
<img src="/public/img/${browser}_24x24.png" />
287+
</sl-tooltip>
288+
</div>
289+
`;
269290
};
270291

271292
function renderMissingPercentage(): TemplateResult {
@@ -292,7 +313,6 @@ export const renderBrowserQuality: CellRenderer = (
292313
let percentage = renderPercentage(score);
293314
const browserImpl = feature.browser_implementations?.[browser!];
294315
const browserImplStatus = browserImpl?.status || 'unavailable';
295-
const browserImplVersion = browserImpl?.version;
296316
if (browserImplStatus === 'unavailable') {
297317
percentage = renderMissingPercentage();
298318
}
@@ -305,15 +325,7 @@ export const renderBrowserQuality: CellRenderer = (
305325
if (didFeatureCrash(feature.wpt?.stable?.[browser!]?.metadata)) {
306326
percentage = renderFeatureCrash();
307327
}
308-
const iconName = BROWSER_IMPL_ICONS[browserImplStatus];
309328
return html`
310-
<div class="browser-impl-${browserImplStatus}">
311-
<sl-tooltip
312-
?disabled=${browserImplVersion === undefined}
313-
content="Since version ${browserImplVersion}"
314-
>
315-
<sl-icon name="${iconName}" library="custom"></sl-icon>
316-
</sl-tooltip>
317329
${percentage}
318330
</div>
319331
`;
@@ -370,59 +382,103 @@ export const CELL_DEFS: Record<ColumnKey, ColumnDefinition> = {
370382
],
371383
},
372384
},
385+
[ColumnKey.DesktopAvailabilityChrome]: {
386+
nameInDialog: 'Availibility in desktop Chrome',
387+
group: 'Availability',
388+
headerHtml: html``,
389+
unsortable: true,
390+
cellClass: 'centered',
391+
cellRenderer: renderDesktopAvailablity,
392+
options: {browser: 'chrome'},
393+
},
394+
[ColumnKey.DesktopAvailabilityEdge]: {
395+
nameInDialog: 'Availibility in desktop Edge',
396+
group: 'Availability',
397+
headerHtml: html``,
398+
unsortable: true,
399+
cellClass: 'centered',
400+
cellRenderer: renderDesktopAvailablity,
401+
options: {browser: 'edge'},
402+
},
403+
[ColumnKey.DesktopAvailabilityFirefox]: {
404+
nameInDialog: 'Availibility in desktop Firefox',
405+
group: 'Availability',
406+
headerHtml: html``,
407+
unsortable: true,
408+
cellClass: 'centered',
409+
cellRenderer: renderDesktopAvailablity,
410+
options: {browser: 'firefox'},
411+
},
412+
[ColumnKey.DesktopAvailabilitySafari]: {
413+
nameInDialog: 'Availibility in desktop Safari',
414+
group: 'Availability',
415+
headerHtml: html``,
416+
cellClass: 'centered',
417+
unsortable: true,
418+
cellRenderer: renderDesktopAvailablity,
419+
options: {browser: 'safari'},
420+
},
373421
[ColumnKey.StableChrome]: {
374422
nameInDialog: 'Browser Implementation in Chrome',
375423
group: 'WPT',
376424
headerHtml: html`<img src="/public/img/chrome_24x24.png" />`,
425+
cellClass: 'centered',
377426
cellRenderer: renderBrowserQuality,
378427
options: {browser: 'chrome', channel: 'stable'},
379428
},
380429
[ColumnKey.StableEdge]: {
381430
nameInDialog: 'Browser Implementation in Edge',
382431
group: 'WPT',
383432
headerHtml: html`<img src="/public/img/edge_24x24.png" />`,
433+
cellClass: 'centered',
384434
cellRenderer: renderBrowserQuality,
385435
options: {browser: 'edge', channel: 'stable'},
386436
},
387437
[ColumnKey.StableFirefox]: {
388438
nameInDialog: 'Browser Implementation in Firefox',
389439
group: 'WPT',
390440
headerHtml: html`<img src="/public/img/firefox_24x24.png" />`,
441+
cellClass: 'centered',
391442
cellRenderer: renderBrowserQuality,
392443
options: {browser: 'firefox', channel: 'stable'},
393444
},
394445
[ColumnKey.StableSafari]: {
395446
nameInDialog: 'Browser Implementation in Safari',
396447
group: 'WPT',
397448
headerHtml: html`<img src="/public/img/safari_24x24.png" />`,
449+
cellClass: 'centered',
398450
cellRenderer: renderBrowserQuality,
399451
options: {browser: 'safari', channel: 'stable'},
400452
},
401453
[ColumnKey.ExpChrome]: {
402454
nameInDialog: 'Browser Implementation in Chrome Experimental',
403455
group: 'WPT Experimental',
404456
headerHtml: html`<img src="/public/img/chrome-canary_24x24.png" />`,
457+
cellClass: 'centered',
405458
cellRenderer: renderBrowserQualityExp,
406459
options: {browser: 'chrome', channel: 'experimental'},
407460
},
408461
[ColumnKey.ExpEdge]: {
409462
nameInDialog: 'Browser Implementation in Edge Experimental',
410463
group: 'WPT Experimental',
411464
headerHtml: html`<img src="/public/img/edge-dev_24x24.png" />`,
465+
cellClass: 'centered',
412466
cellRenderer: renderBrowserQualityExp,
413467
options: {browser: 'edge', channel: 'experimental'},
414468
},
415469
[ColumnKey.ExpFirefox]: {
416470
nameInDialog: 'Browser Implementation in Firefox Experimental',
417471
group: 'WPT Experimental',
418472
headerHtml: html`<img src="/public/img/firefox-nightly_24x24.png" />`,
473+
cellClass: 'centered',
419474
cellRenderer: renderBrowserQualityExp,
420475
options: {browser: 'firefox', channel: 'experimental'},
421476
},
422477
[ColumnKey.ExpSafari]: {
423478
nameInDialog: 'Browser Implementation in Safari Experimental',
424479
group: 'WPT Experimental',
425480
headerHtml: html`<img src="/public/img/safari-preview_24x24.png" />`,
481+
cellClass: 'centered',
426482
cellRenderer: renderBrowserQualityExp,
427483
options: {browser: 'safari', channel: 'experimental'},
428484
},
@@ -495,10 +551,10 @@ export function renderHeaderCell(
495551

496552
const colDef = CELL_DEFS[column];
497553
if (colDef.unsortable) {
498-
return html`<th>${colDef?.headerHtml}</th>`;
554+
return html`<th class=${colDef.cellClass || ''}>${colDef?.headerHtml}</th>`;
499555
} else {
500556
return html`
501-
<th title="Click to sort" class="sortable">
557+
<th title="Click to sort" class="${colDef.cellClass || ''} sortable">
502558
<a href=${urlWithSort}> ${sortIndicator} ${colDef?.headerHtml} </a>
503559
</th>
504560
`;

frontend/src/static/js/components/webstatus-overview-table.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {getColumnsSpec, getSortSpec} from '../utils/urls.js';
2424
import {
2525
ColumnKey,
2626
DEFAULT_SORT_SPEC,
27+
CELL_DEFS,
2728
parseColumnsSpec,
2829
renderFeatureCell,
2930
renderColgroups,
@@ -61,6 +62,9 @@ export class WebstatusOverviewTable extends LitElement {
6162
.data-table {
6263
margin: var(--content-padding) 0;
6364
}
65+
.data-table th {
66+
padding: var(--content-padding-quarter) var(--content-padding);
67+
}
6468
.header-row th {
6569
border-left: var(--default-border);
6670
border-right: var(--default-border);
@@ -72,14 +76,16 @@ export class WebstatusOverviewTable extends LitElement {
7276
padding-top: var(--content-padding-quarter);
7377
}
7478
.browser-impl-unavailable {
75-
color: var(--icon-color-avail-unavailable);
79+
filter: grayscale(1);
80+
opacity: 50%;
7681
}
7782
.percent {
7883
display: inline-block;
7984
width: 6ex;
8085
text-align: right;
8186
}
82-
.missing.percent {
87+
.missing.percent,
88+
tr .centered {
8389
text-align: center;
8490
}
8591
@@ -290,7 +296,9 @@ export class WebstatusOverviewTable extends LitElement {
290296
<tr>
291297
${columns.map(
292298
col => html`
293-
<td>${renderFeatureCell(feature, this.location, col)}</td>
299+
<td class=${CELL_DEFS[col].cellClass ?? ''}>
300+
${renderFeatureCell(feature, this.location, col)}
301+
</td>
294302
`,
295303
)}
296304
</tr>

0 commit comments

Comments
 (0)