Skip to content

Commit 8310717

Browse files
authored
feat(elements): add file picker (#3404)
1 parent 942f4a9 commit 8310717

File tree

65 files changed

+566
-10
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+566
-10
lines changed

packages/elements/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"start": "vite",
2727
"build": "vite build && cross-env IIFE_BUILD=true vite build",
2828
"test": "npm run test:unit && npm run test:integration",
29-
"test:unit": "vitest run",
29+
"test:unit": "vitest",
3030
"test:integration": "playwright test",
3131
"test:integration:update": "playwright test --update-snapshots",
3232
"test:integration:headless": "cross-env HEADLESS=true playwright test",

packages/elements/src/components/app/app.component.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import type { Theme } from '../../lib/theme.js';
2626
import { globals, tailwind } from '../../style/index.js';
2727
import { RealTimeElement } from '../real-time-element.js';
2828
import theme from './theme.scss?inline';
29+
import { type MutationTestReportFilePickerComponent } from '../file-picker/file-picker.component.js';
30+
import { createRef, ref } from 'lit/directives/ref.js';
2931

3032
interface BaseContext {
3133
path: string[];
@@ -86,6 +88,8 @@ export class MutationTestReportAppComponent extends RealTimeElement {
8688
return getComputedStyle(this).getPropertyValue('--mut-body-bg');
8789
}
8890

91+
#filePickerRef = createRef<MutationTestReportFilePickerComponent>();
92+
8993
@property()
9094
public get title(): string {
9195
if (this.context.result) {
@@ -343,13 +347,18 @@ export class MutationTestReportAppComponent extends RealTimeElement {
343347
public render() {
344348
if (this.context.result ?? this.errorMessage) {
345349
return html`
350+
<mte-file-picker ${ref(this.#filePickerRef)} .rootModel="${this.rootModel}"></mte-file-picker>
346351
<div class="container bg-white pb-4 font-sans text-gray-800 motion-safe:transition-max-width">
347352
<div class="space-y-4 transition-colors">
348353
${this.renderErrorMessage()}
349354
<mte-theme-switch @theme-switch="${this.themeSwitch}" class="sticky top-offset z-20 float-right pt-6" .theme="${this.theme}">
350355
</mte-theme-switch>
351356
${this.renderTitle()} ${this.renderTabs()}
352-
<mte-breadcrumb .view="${this.context.view}" .path="${this.context.path}"></mte-breadcrumb>
357+
<mte-breadcrumb
358+
@mte-file-picker-open="${() => this.#filePickerRef.value?.open()}"
359+
.view="${this.context.view}"
360+
.path="${this.context.path}"
361+
></mte-breadcrumb>
353362
<mte-result-status-bar
354363
.detected="${this.rootModel?.systemUnderTestMetrics.metrics.totalDetected}"
355364
.noCoverage="${this.rootModel?.systemUnderTestMetrics.metrics.noCoverage}"

packages/elements/src/components/breadcrumb.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import { LitElement, html } from 'lit';
22
import { customElement, property } from 'lit/decorators.js';
33
import { repeat } from 'lit/directives/repeat.js';
4+
45
import { toAbsoluteUrl } from '../lib/html-helpers.js';
56
import { View } from '../lib/router.js';
7+
import { searchIcon } from '../lib/svg-icons.js';
68
import { tailwind } from '../style/index.js';
9+
import { createCustomEvent } from '../lib/custom-events.js';
710

811
@customElement('mte-breadcrumb')
912
export class MutationTestReportBreadcrumbComponent extends LitElement {
10-
@property({ attribute: false })
13+
@property({ type: Array, attribute: false })
1114
public declare path: string[] | undefined;
1215

1316
@property()
@@ -27,37 +30,38 @@ export class MutationTestReportBreadcrumbComponent extends LitElement {
2730
public render() {
2831
return html`<nav class="my-4 flex rounded-md border border-primary-600 bg-primary-100 p-3 text-gray-700" aria-label="Breadcrumb">
2932
<ol class="inline-flex items-center">
30-
${this.path && this.path.length > 0 ? this.renderLink(this.rootName, []) : this.renderActiveItem(this.rootName)}
31-
${this.renderBreadcrumbItems()}
33+
${this.path && this.path.length > 0 ? this.#renderLink(this.rootName, []) : this.#renderActiveItem(this.rootName)}
34+
${this.#renderBreadcrumbItems()}
3235
</ol>
36+
${this.#renderSearchIcon()}
3337
</nav> `;
3438
}
3539

36-
private renderBreadcrumbItems() {
40+
#renderBreadcrumbItems() {
3741
if (this.path) {
3842
const path = this.path;
3943
return repeat(
4044
path,
4145
(item) => item,
4246
(item, index) => {
4347
if (index === path.length - 1) {
44-
return this.renderActiveItem(item);
48+
return this.#renderActiveItem(item);
4549
} else {
46-
return this.renderLink(item, path.slice(0, index + 1));
50+
return this.#renderLink(item, path.slice(0, index + 1));
4751
}
4852
},
4953
);
5054
}
5155
return undefined;
5256
}
5357

54-
private renderActiveItem(title: string) {
58+
#renderActiveItem(title: string) {
5559
return html`<li aria-current="page">
5660
<span class="ml-1 text-sm font-medium text-gray-800 md:ml-2">${title}</span>
5761
</li> `;
5862
}
5963

60-
private renderLink(title: string, path: string[]) {
64+
#renderLink(title: string, path: string[]) {
6165
return html`<li class="after:text-gray-800 after:content-['/'] md:after:pl-1">
6266
<a
6367
href="${toAbsoluteUrl(this.view, ...path)}"
@@ -66,4 +70,12 @@ export class MutationTestReportBreadcrumbComponent extends LitElement {
6670
>
6771
</li>`;
6872
}
73+
74+
#renderSearchIcon() {
75+
return html` <button @click="${() => this.#dispatchFilePickerOpenEvent()}" class="ml-auto" title="open file picker">${searchIcon}</button> `;
76+
}
77+
78+
#dispatchFilePickerOpenEvent() {
79+
this.dispatchEvent(createCustomEvent('mte-file-picker-open', undefined));
80+
}
6981
}

packages/elements/src/components/file-icon/file-icon.component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { customElement, property } from 'lit/decorators.js';
33
import { determineLanguage, ProgrammingLanguage } from '../../lib/code-helpers.js';
44
import style from './file-icon.css?inline';
55
import { classMap } from 'lit/directives/class-map.js';
6+
67
@customElement('mte-file-icon')
78
export class MutationTestReportFileIconComponent extends LitElement {
89
@property({ attribute: 'file-name' })

0 commit comments

Comments
 (0)