Files
archtika/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte

219 lines
6.0 KiB
Svelte
Raw Normal View History

2024-08-01 18:09:35 +02:00
<script lang="ts">
import { enhance } from "$app/forms";
import WebsiteEditor from "$lib/components/WebsiteEditor.svelte";
import { ALLOWED_MIME_TYPES, handleImagePaste } from "$lib/utils";
import SuccessOrError from "$lib/components/SuccessOrError.svelte";
2024-08-20 19:17:05 +02:00
import type { ActionData, LayoutServerData, PageServerData } from "./$types";
import Modal from "$lib/components/Modal.svelte";
import LoadingSpinner from "$lib/components/LoadingSpinner.svelte";
2024-07-31 07:23:32 +02:00
2024-08-20 19:17:05 +02:00
const { data, form }: { data: PageServerData & LayoutServerData; form: ActionData } = $props();
let previewContent = $state(data.home.main_content);
let mainContentTextarea: HTMLTextAreaElement;
let textareaScrollTop = $state(0);
const updateScrollPercentage = () => {
const { scrollTop, scrollHeight, clientHeight } = mainContentTextarea;
textareaScrollTop = (scrollTop / (scrollHeight - clientHeight)) * 100;
};
const handlePaste = async (event: ClipboardEvent) => {
const newContent = await handleImagePaste(event, data.API_BASE_PREFIX);
2024-08-20 19:17:05 +02:00
if (newContent) {
previewContent = newContent;
}
};
let sending = $state(false);
let loadingDelay: number;
2024-08-01 18:09:35 +02:00
</script>
2024-07-31 07:23:32 +02:00
<SuccessOrError success={form?.success} message={form?.message} />
2024-08-01 18:09:35 +02:00
{#if sending}
<LoadingSpinner />
{/if}
2024-08-01 18:09:35 +02:00
<WebsiteEditor
id={data.website.id}
2024-08-27 16:39:29 +02:00
contentType={data.website.content_type}
2024-08-01 18:09:35 +02:00
title={data.website.title}
2024-09-08 16:42:32 +02:00
previewContent={previewContent ||
"Put some markdown content in main content to see a live preview here"}
previewScrollTop={textareaScrollTop}
2024-08-01 18:09:35 +02:00
>
2024-08-24 21:43:15 +02:00
<section id="global">
<h2>
<a href="#global">Global</a>
</h2>
2024-08-02 15:33:18 +02:00
<form
action="?/updateGlobal"
method="POST"
enctype="multipart/form-data"
use:enhance={() => {
loadingDelay = window.setTimeout(() => (sending = true), 500);
2024-08-02 15:33:18 +02:00
return async ({ update }) => {
await update({ reset: false });
window.clearTimeout(loadingDelay);
sending = false;
2024-08-02 15:33:18 +02:00
};
}}
>
<label>
Light accent color:
<input
type="color"
name="accent-color-light"
value={data.globalSettings.accent_color_light_theme}
pattern="\S(.*\S)?"
required
2024-08-02 15:33:18 +02:00
/>
</label>
<label>
Dark accent color:
2024-08-02 15:33:18 +02:00
<input
type="color"
name="accent-color-dark"
value={data.globalSettings.accent_color_dark_theme}
pattern="\S(.*\S)?"
required
2024-08-02 15:33:18 +02:00
/>
</label>
<div class="file-field">
<label>
Favicon:
<input type="file" name="favicon" accept={ALLOWED_MIME_TYPES.join(", ")} />
</label>
{#if data.globalSettings.favicon_image}
<Modal id="preview-favicon-global-{data.globalSettings.website_id}" text="Preview">
<img
src={`${data.API_BASE_PREFIX}/rpc/retrieve_file?id=${data.globalSettings.favicon_image}`}
alt=""
/>
</Modal>
{/if}
</div>
2024-08-01 18:09:35 +02:00
2024-08-02 15:33:18 +02:00
<button type="submit">Submit</button>
</form>
</section>
2024-08-01 18:09:35 +02:00
2024-08-24 21:43:15 +02:00
<section id="header">
<h2>
<a href="#header">Header</a>
</h2>
2024-08-01 18:09:35 +02:00
2024-08-02 15:33:18 +02:00
<form
action="?/updateHeader"
method="POST"
enctype="multipart/form-data"
use:enhance={() => {
loadingDelay = window.setTimeout(() => (sending = true), 500);
2024-08-02 15:33:18 +02:00
return async ({ update }) => {
await update({ reset: false });
window.clearTimeout(loadingDelay);
sending = false;
2024-08-02 15:33:18 +02:00
};
}}
>
<label>
Logo type:
<select name="logo-type">
<option value="text" selected={"text" === data.header.logo_type}>Text</option>
<option value="image" selected={"image" === data.header.logo_type}>Image</option>
</select>
</label>
<label>
Logo text:
<input
type="text"
name="logo-text"
value={data.header.logo_text}
pattern="\S(.*\S)?"
required={data.header.logo_type === "text"}
/>
2024-08-02 15:33:18 +02:00
</label>
<div class="file-field">
<label>
Logo image:
<input type="file" name="logo-image" accept={ALLOWED_MIME_TYPES.join(", ")} />
</label>
{#if data.header.logo_image}
<Modal id="preview-logo-header-{data.header.website_id}" text="Preview">
<img
src={`${data.API_BASE_PREFIX}/rpc/retrieve_file?id=${data.header.logo_image}`}
alt=""
/>
</Modal>
{/if}
</div>
2024-08-01 18:09:35 +02:00
2024-08-02 15:33:18 +02:00
<button type="submit">Submit</button>
</form>
</section>
2024-08-01 18:09:35 +02:00
2024-08-24 21:43:15 +02:00
<section id="home">
<h2>
<a href="#home">Home</a>
</h2>
2024-08-01 18:09:35 +02:00
2024-08-02 15:33:18 +02:00
<form
action="?/updateHome"
method="POST"
use:enhance={() => {
loadingDelay = window.setTimeout(() => (sending = true), 500);
2024-08-02 15:33:18 +02:00
return async ({ update }) => {
await update({ reset: false });
window.clearTimeout(loadingDelay);
sending = false;
2024-08-02 15:33:18 +02:00
};
}}
>
<label>
Main content:
<textarea
name="main-content"
rows="20"
bind:value={previewContent}
bind:this={mainContentTextarea}
onscroll={updateScrollPercentage}
onpaste={handlePaste}
required>{data.home.main_content}</textarea
>
2024-08-02 15:33:18 +02:00
</label>
2024-08-01 18:09:35 +02:00
2024-08-02 15:33:18 +02:00
<button type="submit">Submit</button>
</form>
</section>
2024-08-24 21:43:15 +02:00
<section id="footer">
<h2>
<a href="#footer">Footer</a>
</h2>
2024-08-01 18:09:35 +02:00
2024-08-02 15:33:18 +02:00
<form
action="?/updateFooter"
method="POST"
use:enhance={() => {
loadingDelay = window.setTimeout(() => (sending = true), 500);
2024-08-02 15:33:18 +02:00
return async ({ update }) => {
await update({ reset: false });
window.clearTimeout(loadingDelay);
sending = false;
2024-08-02 15:33:18 +02:00
};
}}
>
<label>
Additional text:
<textarea name="additional-text" rows="5" maxlength="250" required
>{data.footer.additional_text}</textarea
>
2024-08-02 15:33:18 +02:00
</label>
2024-08-01 18:09:35 +02:00
2024-08-02 15:33:18 +02:00
<button type="submit">Submit</button>
</form>
2024-08-01 18:09:35 +02:00
</section>
</WebsiteEditor>