2022-04-12 04:18:42 +08:00
|
|
|
<script lang="ts">
|
2022-08-31 04:56:59 +08:00
|
|
|
//@ts-ignore
|
|
|
|
import { csvParseRows, tsvParseRows } from "d3-dsv";
|
2023-01-18 04:47:40 +08:00
|
|
|
|
2022-08-31 04:56:59 +08:00
|
|
|
export let value: Array<Array<string | number>> | string;
|
|
|
|
export let samples_dir: string;
|
2023-01-18 04:47:40 +08:00
|
|
|
export let type: "gallery" | "table";
|
|
|
|
export let selected: boolean = false;
|
|
|
|
export let index: number;
|
|
|
|
|
2022-08-31 04:56:59 +08:00
|
|
|
let hovered = false;
|
2022-12-27 23:48:32 +08:00
|
|
|
let loaded_value: Array<Array<string | number>> | string = value;
|
|
|
|
let loaded = Array.isArray(loaded_value);
|
2022-08-31 04:56:59 +08:00
|
|
|
|
|
|
|
$: if (!loaded && typeof value === "string" && /\.[a-zA-Z]+$/.test(value)) {
|
|
|
|
fetch(samples_dir + value)
|
|
|
|
.then((v) => v.text())
|
|
|
|
.then((v) => {
|
|
|
|
try {
|
|
|
|
if ((value as string).endsWith("csv")) {
|
|
|
|
const small_df = v
|
|
|
|
.split("\n")
|
|
|
|
.slice(0, 4)
|
|
|
|
.map((v) => v.split(",").slice(0, 4).join(","))
|
|
|
|
.join("\n");
|
|
|
|
|
2022-12-27 23:48:32 +08:00
|
|
|
loaded_value = csvParseRows(small_df);
|
2022-08-31 04:56:59 +08:00
|
|
|
} else if ((value as string).endsWith("tsv")) {
|
|
|
|
const small_df = v
|
|
|
|
.split("\n")
|
|
|
|
.slice(0, 4)
|
|
|
|
.map((v) => v.split("\t").slice(0, 4).join("\t"))
|
|
|
|
.join("\n");
|
|
|
|
|
2022-12-27 23:48:32 +08:00
|
|
|
loaded_value = tsvParseRows(small_df);
|
2022-08-31 04:56:59 +08:00
|
|
|
} else {
|
|
|
|
throw new Error(
|
|
|
|
"Incorrect format, only CSV and TSV files are supported"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
loaded = true;
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2022-04-12 04:18:42 +08:00
|
|
|
</script>
|
|
|
|
|
2022-08-31 04:56:59 +08:00
|
|
|
{#if loaded}
|
|
|
|
<div
|
2023-01-18 04:47:40 +08:00
|
|
|
class:table={type === "table"}
|
|
|
|
class:gallery={type === "gallery"}
|
|
|
|
class:selected
|
2022-08-31 04:56:59 +08:00
|
|
|
on:mouseenter={() => (hovered = true)}
|
|
|
|
on:mouseleave={() => (hovered = false)}
|
|
|
|
>
|
2023-01-18 04:47:40 +08:00
|
|
|
<table class="">
|
2022-12-27 23:48:32 +08:00
|
|
|
{#each loaded_value.slice(0, 3) as row, i}
|
2022-08-31 04:56:59 +08:00
|
|
|
<tr>
|
|
|
|
{#each row.slice(0, 3) as cell, j}
|
2023-01-18 04:47:40 +08:00
|
|
|
<td>{cell}</td>
|
2022-08-31 04:56:59 +08:00
|
|
|
{/each}
|
|
|
|
{#if row.length > 3}
|
2023-01-18 04:47:40 +08:00
|
|
|
<td>…</td>
|
2022-08-31 04:56:59 +08:00
|
|
|
{/if}
|
|
|
|
</tr>
|
2022-04-12 04:18:42 +08:00
|
|
|
{/each}
|
2022-08-31 04:56:59 +08:00
|
|
|
{#if value.length > 3}
|
|
|
|
<div
|
2023-01-18 04:47:40 +08:00
|
|
|
class="overlay"
|
|
|
|
class:odd={index % 2 != 0}
|
|
|
|
class:even={index % 2 == 0}
|
|
|
|
class:button={type === "gallery"}
|
2022-08-31 04:56:59 +08:00
|
|
|
/>
|
2022-04-12 04:18:42 +08:00
|
|
|
{/if}
|
2022-08-31 04:56:59 +08:00
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
{/if}
|
2023-01-18 04:47:40 +08:00
|
|
|
|
|
|
|
<style>
|
|
|
|
.gallery {
|
|
|
|
align-items: center;
|
|
|
|
cursor: pointer;
|
|
|
|
border-collapse: collapse;
|
|
|
|
padding: var(--size-2);
|
|
|
|
overflow: hidden;
|
|
|
|
font-size: var(--scale-000);
|
|
|
|
line-height: var(--line-sm);
|
|
|
|
text-align: left;
|
|
|
|
}
|
|
|
|
|
|
|
|
table {
|
|
|
|
position: relative;
|
|
|
|
}
|
|
|
|
|
|
|
|
td {
|
|
|
|
border: 1px solid var(--dataset-dataframe-border-base);
|
|
|
|
padding: var(--size-2);
|
|
|
|
font-size: var(--scale-000);
|
|
|
|
font-family: var(--font-mono);
|
|
|
|
}
|
|
|
|
|
|
|
|
.table.selected td {
|
|
|
|
border-color: var(--dataset-dataframe-border-hover);
|
|
|
|
}
|
|
|
|
|
|
|
|
.gallery.selected td {
|
|
|
|
border-color: var(--dataset-dataframe-border-hover);
|
|
|
|
}
|
|
|
|
|
|
|
|
td:first-child {
|
|
|
|
border-left: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
tr:first-child td {
|
|
|
|
border-top: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
td:last-child {
|
|
|
|
border-right: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
tr:last-child td {
|
|
|
|
border-bottom: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
.overlay {
|
|
|
|
--gradient-to: transparent;
|
|
|
|
position: absolute;
|
|
|
|
bottom: 0;
|
|
|
|
background: linear-gradient(to bottom, transparent, var(--gradient-to));
|
|
|
|
width: var(--size-full);
|
|
|
|
height: 50%;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* i dont know what i've done here but it is what it is */
|
|
|
|
.odd {
|
|
|
|
--gradient-to: var(--table-even-background);
|
|
|
|
}
|
|
|
|
|
|
|
|
.even {
|
|
|
|
--gradient-to: var(--table-odd-background);
|
|
|
|
}
|
|
|
|
|
|
|
|
.button {
|
|
|
|
--gradient-to: var(--dataset-gallery-background-base);
|
|
|
|
}
|
|
|
|
|
|
|
|
.selected .even,
|
|
|
|
.selected .odd {
|
|
|
|
--gradient-to: var(--dataset-table-background-hover);
|
|
|
|
}
|
|
|
|
|
|
|
|
.selected .button {
|
|
|
|
--gradient-to: var(--dataset-gallery-background-hover);
|
|
|
|
}
|
|
|
|
</style>
|