|
<script lang="ts"> |
|
import FileTree from "./FileTree.svelte"; |
|
import type { FileNode } from "./types"; |
|
|
|
export let interactive: boolean; |
|
export let file_count: "single" | "multiple" = "multiple"; |
|
export let value: string[][] = []; |
|
export let ls_fn: (path: string[]) => Promise<FileNode[]>; |
|
let selected_folders: string[][] = []; |
|
|
|
const paths_equal = (path: string[], path_2: string[]): boolean => { |
|
return path.join("/") === path_2.join("/"); |
|
}; |
|
|
|
const path_in_set = (path: string[], set: string[][]): boolean => { |
|
return set.some((x) => paths_equal(x, path)); |
|
}; |
|
|
|
const path_inside = (path: string[], path_2: string[]): boolean => { |
|
return path.join("/").startsWith(path_2.join("/")); |
|
}; |
|
</script> |
|
|
|
<div class="file-wrap"> |
|
<FileTree |
|
path={[]} |
|
selected_files={value} |
|
{selected_folders} |
|
{interactive} |
|
{ls_fn} |
|
{file_count} |
|
valid_for_selection={false} |
|
on:check={(e) => { |
|
const { path, checked, type } = e.detail; |
|
if (checked) { |
|
if (file_count === "single") { |
|
value = [path]; |
|
} else if (type === "folder") { |
|
if (!path_in_set(path, selected_folders)) { |
|
selected_folders = [...selected_folders, path]; |
|
} |
|
} else { |
|
if (!path_in_set(path, value)) { |
|
value = [...value, path]; |
|
} |
|
} |
|
} else { |
|
selected_folders = selected_folders.filter( |
|
(folder) => !path_inside(path, folder) |
|
); // deselect all parent folders |
|
if (type === "folder") { |
|
selected_folders = selected_folders.filter( |
|
(folder) => !path_inside(folder, path) |
|
); // deselect all children folders |
|
value = value.filter((file) => !path_inside(file, path)); // deselect all children files |
|
} else { |
|
value = value.filter((x) => !paths_equal(x, path)); |
|
} |
|
} |
|
}} |
|
/> |
|
</div> |
|
|
|
<style> |
|
.file-wrap { |
|
height: calc(100% - 25px); |
|
overflow-y: scroll; |
|
} |
|
</style> |
|
|