<script lang="ts"> import { artistList, characterList, circleList, comicTagList, worldList } from '$gql/Queries'; import { type OmitIdentifiers } from '$gql/Utils'; import type { FullComicFragment, UpdateComicInput } from '$gql/graphql'; import { categories, censorships, directions, languages, layouts, ratings } from '$lib/Enums'; import Labelled from '$lib/components/Labelled.svelte'; import LabelledBlock from '$lib/components/LabelledBlock.svelte'; import Select from '$lib/components/Select.svelte'; import { getContextClient } from '@urql/svelte'; import { createEventDispatcher } from 'svelte'; const client = getContextClient(); const dispatch = createEventDispatcher<{ submit: UpdateComicInput }>(); export let comic: OmitIdentifiers<FullComicFragment>; $: tagsQuery = comicTagList(client); $: artistsQuery = artistList(client); $: charactersQuery = characterList(client); $: circlesQuery = circleList(client); $: worldsQuery = worldList(client); $: tags = $tagsQuery.data?.comicTags.edges; $: artists = $artistsQuery.data?.artists.edges; $: characters = $charactersQuery.data?.characters.edges; $: circles = $circlesQuery.data?.circles.edges; $: worlds = $worldsQuery.data?.worlds.edges; function submit() { dispatch('submit', { direction: comic.direction, layout: comic.layout, rating: comic.rating, category: comic.category, censorship: comic.censorship, title: comic.title, originalTitle: comic.originalTitle, url: comic.url, date: comic.date === '' ? null : comic.date, language: comic.language, tags: { ids: comic.tags.map((t) => t.id) }, artists: { ids: comic.artists.map((a) => a.id) }, characters: { ids: comic.characters.map((c) => c.id) }, circles: { ids: comic.circles.map((c) => c.id) }, worlds: { ids: comic.worlds.map((w) => w.id) } }); } </script> <form on:submit|preventDefault={submit}> <div class="grid-labels"> <Labelled label="Title" let:id> <input required {id} bind:value={comic.title} title={comic.title} /> </Labelled> <Labelled label="Original Title" let:id> <input {id} bind:value={comic.originalTitle} title={comic.originalTitle} /> </Labelled> <Labelled label="URL" let:id> <input {id} bind:value={comic.url} /> </Labelled> <Labelled label="Date" let:id> <input {id} type="date" bind:value={comic.date} pattern={'d{4}-d{2}-d{2}'} /> </Labelled> <Labelled label="Category" let:id> <Select {id} options={categories} bind:value={comic.category} /> </Labelled> <Labelled label="Rating" let:id> <Select {id} options={ratings} bind:value={comic.rating} /> </Labelled> <Labelled label="Censorship" let:id> <Select {id} options={censorships} bind:value={comic.censorship} /> </Labelled> <Labelled label="Language" let:id> <Select {id} options={languages} bind:value={comic.language} /> </Labelled> <Labelled label="Direction" let:id> <Select {id} options={directions} bind:value={comic.direction} /> </Labelled> <Labelled label="Layout" let:id> <Select {id} options={layouts} bind:value={comic.layout} /> </Labelled> </div> <LabelledBlock label="Artists" let:id> <Select multi object {id} options={artists} bind:value={comic.artists} /> </LabelledBlock> <LabelledBlock label="Circles" let:id> <Select multi object {id} options={circles} bind:value={comic.circles} /> </LabelledBlock> <LabelledBlock label="Characters" let:id> <Select multi object {id} options={characters} bind:value={comic.characters} /> </LabelledBlock> <LabelledBlock label="Worlds" let:id> <Select multi object {id} options={worlds} bind:value={comic.worlds} /> </LabelledBlock> <LabelledBlock label="Tags" let:id> <Select multi object {id} options={tags} bind:value={comic.tags} /> </LabelledBlock> <slot /> </form>