blob: a19eff0f02b835fe179099142b658ec05d1d14e4 [file] [log] [blame]
<script lang="ts">
import { createEventDispatcher } from "svelte";
import { Session, type IndexedWrapper } from "../wrappers/session.js";
import type { SelectionEvent, Selection } from "../types/events.js";
export let name: string;
export let datasetGroup: IndexedWrapper[];
// State
let dispatcher = createEventDispatcher<SelectionEvent>();
let selected: boolean = true;
let sources: Set<string>;
let sampledMetrics: Set<string>;
let metrics: Set<string>;
// Events
let selection = function (event: Event) {
event.stopPropagation();
const target = event.target as HTMLInputElement;
selected = target.checked;
const selection: Selection = {
name: name,
enabled: selected,
};
dispatcher("selections", [selection]);
};
$: {
sources = Session.sources(datasetGroup);
let labels = datasetGroup
.map((indexed) => indexed.value.metricLabels())
.flat();
let sampled = datasetGroup
.map((indexed) => indexed.value.sampledLabels())
.flat();
metrics = new Set<string>(labels);
sampledMetrics = new Set<string>(sampled);
}
</script>
<div class="dataset">
<hgroup>
<div class="section">
<span class="item">{name}</span>
<fieldset class="item">
<label for="switch">
<input
type="checkbox"
role="switch"
checked={selected}
on:change={selection}
/>
</label>
</fieldset>
</div>
<div class="details">
<div class="sources">
{#each sources as source (source)}
<div>📁 <small>{source}</small></div>
{/each}
</div>
{#if metrics.size > 0}
<div class="metrics">
{#each metrics as metric}
<div>📏 <small>{metric}</small></div>
{/each}
</div>
{/if}
{#if sampledMetrics.size > 0}
<div class="sampled">
{#each sampledMetrics as metric}
<div>📏 <small>{metric}</small></div>
{/each}
</div>
{/if}
</div>
</hgroup>
</div>
<style>
.dataset {
margin: 0.5rem;
padding-top: 1rem;
padding-left: 1rem;
border: 1px solid #b3cee5;
}
.details {
padding-left: 1rem;
}
.details > div {
margin-top: 0.25rem;
}
.section {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.section .item {
margin: 0px 10px;
}
</style>