pocketbase/ui/src/components/base/Field.svelte

51 lines
1.4 KiB
Svelte
Raw Normal View History

2022-07-07 05:19:05 +08:00
<script>
import { onMount } from "svelte";
2023-03-04 19:06:15 +08:00
import { slide } from "svelte/transition";
2022-07-07 05:19:05 +08:00
import { errors, removeError } from "@/stores/errors";
import CommonHelper from "@/utils/CommonHelper";
const uniqueId = "field_" + CommonHelper.randomString(7);
const defaultError = "Invalid value";
export let name = "";
let classes = undefined;
export { classes as class }; // export reserved keyword
let container;
let fieldErrors = [];
$: {
fieldErrors = CommonHelper.toArray(CommonHelper.getNestedVal($errors, name));
}
2023-02-24 22:33:57 +08:00
export function changed() {
2022-07-07 05:19:05 +08:00
removeError(name);
}
onMount(() => {
2023-02-24 22:33:57 +08:00
container.addEventListener("input", changed);
container.addEventListener("change", changed);
2022-07-07 05:19:05 +08:00
return () => {
2023-02-24 22:33:57 +08:00
container.removeEventListener("input", changed);
container.removeEventListener("change", changed);
2022-07-07 05:19:05 +08:00
};
});
</script>
<!-- svelte-ignore a11y-click-events-have-key-events -->
2022-07-07 05:19:05 +08:00
<div bind:this={container} class={classes} class:error={fieldErrors.length} on:click>
<slot {uniqueId} />
{#each fieldErrors as error}
2023-03-04 19:06:15 +08:00
<div class="help-block help-block-error" transition:slide|local={{ duration: 150 }}>
2022-07-07 05:19:05 +08:00
{#if typeof error === "object"}
2022-08-10 18:22:27 +08:00
<pre>{error?.message || error?.code || defaultError}</pre>
2022-07-07 05:19:05 +08:00
{:else}
{error || defaultError}
{/if}
</div>
{/each}
</div>