gradio / js /fileexplorer /shared /DirectoryExplorer.svelte
mindmime's picture
Upload folder using huggingface_hub
a03b3ba verified
<script lang="ts">
import { createEventDispatcher } from "svelte";
import { dequal } from "dequal";
import FileTree from "./FileTree.svelte";
import { make_fs_store } from "./utils";
import { File } from "@gradio/icons";
import { Empty } from "@gradio/atoms";
export let glob: string;
export let ignore_glob: string;
export let root_dir: string;
export let interactive: boolean;
export let server: any;
export let file_count: "single" | "multiple" = "multiple";
export let value: string[][] = [];
const dispatch = createEventDispatcher<{
change: typeof value;
}>();
const tree = make_fs_store();
const render_tree = (): void => {
server.ls().then((v: any) => {
tree.create_fs_graph(v);
});
};
$: glob, ignore_glob, root_dir, render_tree();
$: value.length && $tree && set_checked_from_paths();
function set_checked_from_paths(): void {
value = file_count === "single" ? [value[0] || []] : value;
value = tree.set_checked_from_paths(value);
if (!dequal(value, old_value)) {
old_value = value;
dispatch("change", value);
}
}
let old_value: typeof value = [];
function handle_select({
node_indices,
checked
}: {
node_indices: number[];
checked: boolean;
}): void {
value = tree.set_checked(node_indices, checked, value, file_count);
if (!dequal(value, old_value)) {
old_value = value;
dispatch("change", value);
}
}
</script>
{#if $tree && $tree.length}
<div class="file-wrap">
<FileTree
tree={$tree}
{interactive}
on:check={({ detail }) => handle_select(detail)}
{file_count}
/>
</div>
{:else}
<Empty size="large"><File /></Empty>
{/if}
<style>
.file-wrap {
height: calc(100% - 25px);
overflow-y: scroll;
}
</style>