<script lang="ts"> import IntegerInput from "./IntegerInput.svelte"; import TextInput from "./TextInput.svelte"; import NewListTextInput from "./ListTextInput/NewListTextInput.svelte"; import ListTextInputElement from "./ListTextInput/ListTextInputElement.svelte"; import {invoke} from "@tauri-apps/api/tauri"; import {AgeRating, LanguageISO, type Metadata} from "./metadata"; import Dropdown from "./Dropdown/Dropdown.svelte"; import PathInput from "./PathInput.svelte"; import {tempdir} from "@tauri-apps/api/os"; import {downloadDir} from "@tauri-apps/api/path"; let tauriInitDone = false; let downloadDirPath: string; let tempDirPath: string; let returnMessage = ""; let metadata: Metadata = { series_title: "", title: "", chapter_number: 0, total_chapter_count: -1, volume_number: -1, summary: "", release_date: { year: new Date().getFullYear(), month: -1, day: -1, }, writer: "", translator: "", letterer: "", editor: "", publisher: "", genre: "", tags: [], page_count: 1, language: LanguageISO.EN, characters: [], age_rating: AgeRating.Unknown }; let saveDirectory = ""; let bundleDirectory = ""; let doBundle = false; $: { if (metadata.release_date.year < 0) { metadata.release_date.month = -1; } if (metadata.release_date.month < 0) { metadata.release_date.day = -1; } } $: { if (tauriInitDone) { if (saveDirectory == "") { saveDirectory = downloadDirPath; } if (bundleDirectory == "") { bundleDirectory = downloadDirPath; } } } async function init() { downloadDirPath = await downloadDir(); tempDirPath = await tempdir(); tauriInitDone = true; } function deleteTag(event: any) { metadata.tags.splice(event.detail.tagId, 1); metadata.tags = metadata.tags; } async function saveMetadata() { while (!tauriInitDone) { await new Promise( resolve => setTimeout(resolve, 100) ); } console.log(metadata); if (bundleDirectory != "") { let savePath = saveDirectory; if (saveDirectory.endsWith("/")) { savePath += "test.cbz"; } else { savePath += "/test.cbz"; } let comicInfoPath = await invoke("save", { metadata: metadata, path: tempDirPath}); let bundlePath = await invoke("save_bundle", { bundleDir: bundleDirectory, metadataFilePath: comicInfoPath, savePath: savePath }) returnMessage = "Saved '" + metadata.title + "' bundled to '" + bundlePath + "'"; } else { let comicInfoPath = await invoke("save", { message: metadata, path: saveDirectory }) returnMessage = "Saved '" + metadata.title + "' to '" + comicInfoPath + "'"; } } init(); </script> <div class="metadataInputContainer"> <h1>Metadata</h1> <form class="metadataInput" on:submit|preventDefault={saveMetadata}> <label for="series">Series:</label> <TextInput id="series" bind:value={metadata.series_title} placeholder="Series Title" /><br> <label for="title">Title:</label> <TextInput id="title" bind:value={metadata.title} placeholder="Volume Title" /><br> <label for="volume">Volume:</label> <IntegerInput id="volume" bind:value={metadata.volume_number} defaultValue={-1}/> <label for="chapter">Chapter:</label> <IntegerInput id="chapter" bind:value={metadata.chapter_number} /> / <IntegerInput id="chapter_count" bind:value={metadata.total_chapter_count} negative={true}/><br> <label for="page_count">Page Count</label> <IntegerInput id="page_count" bind:value={metadata.page_count} /><br> <label for="summary">Summary:</label><br> <label for="summary"></label><textarea rows="3" cols="60" id="series" name="text" placeholder="Summary..." bind:value={metadata.summary}></textarea><br> <label for="release_date">Release Date:</label> <IntegerInput id="release_year" bind:value={metadata.release_date.year} /> {#if metadata.release_date.year > 0} <IntegerInput id="release_month" bind:value={metadata.release_date.month} /> {#if metadata.release_date.month > 0} <IntegerInput id="release_day" bind:value={metadata.release_date.day} /> {/if} {/if} <br> <!--TODO: if date element is 0 do not display finer element, also set finer element to -1--> <label for="author">Author:</label> <TextInput id="author" bind:value={metadata.writer} placeholder="Author" /><br> <label for="translator">Translator:</label> <TextInput id="translator" bind:value={metadata.translator} placeholder="Translator" /><br> <label for="typesetter">Letterer:</label> <TextInput id="typesetter" bind:value={metadata.letterer} placeholder="Letterer" /><br> <label for="editor">Editor:</label> <TextInput id="editor" bind:value={metadata.editor} placeholder="Editor" /><br> <label for="publisher">Publisher:</label> <TextInput id="publisher" bind:value={metadata.publisher} placeholder="Publisher" /><br> <label for="new-tag">Tags:</label> <!-- List of Tags, New Button --> {#each metadata.tags as tag, id} <ListTextInputElement {id} bind:value={tag} on:deleted={deleteTag}/> {/each} <NewListTextInput id="new-tag" bind:value={metadata.tags[metadata.tags.length]}/><br> <div class="row-left"> <label for="genre">Genre:</label> <TextInput id="genre" bind:value={metadata.genre} placeholder="Genre" /> <label for="language-select">Language:</label> <Dropdown id="language-select" bind:activeElement={metadata.language} list={Object.values(LanguageISO)} /> </div> <div class="row-left"> <label for="age-rating">Age Rating:</label> <Dropdown id="" bind:activeElement={metadata.age_rating} list={Object.values(AgeRating)} /> </div> <hr> <PathInput bind:path={saveDirectory}/> <div class="row-left"> <label for="bundle-check">Bundle:</label> <input id="bundle-check" type="checkbox" bind:checked={doBundle}> </div> {#if doBundle} <PathInput bind:path={bundleDirectory}/> {/if} <input type="submit" value="Save"/> <p>{returnMessage}</p> </form> </div> <style> .metadataInputContainer { height: 100%; max-height: 100%; overflow: auto; } .metadataInput { margin-left: 4rem; } .metadataInput label, input[type="submit"] { } .metadataInput h1 { position: sticky; top: 0; margin: 0; border-bottom: 2px solid black; background-color: var(--color-bg); padding: 1.3rem; } </style>