Files
fnx_web/svelte/src/filesystem/viewers/ZipItem.svelte

84 lines
1.7 KiB
Svelte
Raw Normal View History

<script lang="ts">
import type { ZipEntry } from "filesystem/viewers/Zip.svelte";
import { formatDataVolume } from "util/Formatting";
2023-01-17 16:13:26 +01:00
export let item: ZipEntry = {} as ZipEntry
2023-01-17 16:13:26 +01:00
</script>
<!-- First get directories and render them as details collapsibles -->
{#each Object.entries(item.children) as [name, child]}
{#if child.children}
<details bind:open={child.details_open}>
2023-01-17 16:13:26 +01:00
<summary>
<div class="filename">
{name}
(
{formatDataVolume(child.size, 3)}
{#if child.download_url}
<a href={child.download_url}>download</a>
{/if}
)
</div>
2023-01-17 16:13:26 +01:00
</summary>
<!-- Performance optimization, only render children if details is expanded -->
{#if child.details_open}
<svelte:self item={child}></svelte:self>
{/if}
2023-01-17 16:13:26 +01:00
</details>
{/if}
{/each}
<!-- Then get files and render them as list items -->
<ul>
{#each Object.entries(item.children) as [name, child]}
{#if !child.children}
<li>
<div class="filename">
2024-01-25 00:29:41 +01:00
{name}
(
{formatDataVolume(child.size, 3)}
{#if child.download_url}
<a href={child.download_url}>download</a>
{/if}
)
</div>
2023-01-17 16:13:26 +01:00
</li>
{/if}
{/each}
</ul>
<style>
details {
padding-left: 0.5em;
2023-01-17 16:13:26 +01:00
border: none;
border-left: 2px solid var(--separator);
}
details > summary {
list-style-type: none;
display: flex;
}
details > summary::before {
font-family: 'Material Icons';
content: 'folder';
}
details[open] > summary::before {
font-family: 'Material Icons';
content: 'folder_open';
}
li::before {
font-family: 'Material Icons';
content: 'description';
}
2023-01-17 16:13:26 +01:00
ul {
list-style-type: none;
padding-left: 0.5em;
2023-01-17 16:13:26 +01:00
margin: 0;
border-left: 2px solid var(--separator);
}
.filename {
display: inline;
margin-left: 0.5em;
}
2023-01-17 16:13:26 +01:00
</style>