obsidian-book-tracker/src/ui/components/form/suggesters/FolderSuggest.svelte

50 lines
1.0 KiB
Svelte

<script lang="ts">
import { TFolder } from "obsidian";
import TextInputSuggest, { type Item } from "./TextInputSuggest.svelte";
import type { StringKeys } from "@utils/types";
import { getAppContext } from "@ui/stores/app";
import { isInAnyFolder } from "@utils/fs";
type Props = {
id: string;
property?: StringKeys<TFolder>;
folderFilter?: string[];
value?: string;
disabled?: boolean;
onSelected?: (propertyValue: string) => void;
};
let {
id,
property = "path",
folderFilter,
value = $bindable(),
disabled,
onSelected,
}: Props = $props();
const app = getAppContext();
let items: Item<TFolder | string>[] = $state([]);
function handleChange(query: string) {
items = app.vault
.getAllFolders()
.filter(
(f) =>
(folderFilter === undefined ||
isInAnyFolder(f, folderFilter)) &&
f[property].toLowerCase().includes(query.toLowerCase()),
)
.map((f) => f[property]);
}
</script>
<TextInputSuggest
{id}
{items}
bind:value
{disabled}
onChange={handleChange}
{onSelected}
/>