mirror of
https://github.com/garraflavatra/rolens.git
synced 2025-04-16 15:51:03 +00:00
96 lines
2.2 KiB
Svelte
96 lines
2.2 KiB
Svelte
<script>
|
|
import FormInput from '$components/forminput.svelte';
|
|
import Icon from '$components/icon.svelte';
|
|
import { inputTypes } from '$lib/mongo';
|
|
import { resolveKeypath, setValue } from '$lib/keypaths';
|
|
import Hint from '$components/hint.svelte';
|
|
|
|
export let item = {};
|
|
export let view = {};
|
|
export let valid = false;
|
|
export let emptyHint = '';
|
|
|
|
const validity = {};
|
|
$: valid = Object.values(validity).every(v => v !== false);
|
|
|
|
const iconMap = {
|
|
string: 'text',
|
|
objectid: 'anchor',
|
|
int: 'hash',
|
|
long: 'hash',
|
|
uint64: 'hash',
|
|
double: 'hash',
|
|
decimal: 'hash',
|
|
bool: 'toggle-l',
|
|
date: 'cal',
|
|
};
|
|
|
|
const keypathProxy = new Proxy(item, {
|
|
get: resolveKeypath,
|
|
set: (item, key, value) => {
|
|
setValue(item, key, value);
|
|
// eslint-disable-next-line no-self-assign
|
|
value = value;
|
|
return item;
|
|
},
|
|
});
|
|
</script>
|
|
|
|
{#if item && view}
|
|
{#each view?.columns?.filter(c => inputTypes.includes(c.inputType)) || [] as column, index}
|
|
<!-- svelte-ignore a11y-label-has-associated-control because FormInput contains one -->
|
|
<label class="column">
|
|
<div class="label">
|
|
<Icon name={iconMap[column.inputType]} />
|
|
<span>
|
|
{column.key}
|
|
{#if column.mandatory}
|
|
<span class="tag" class:invalid={!validity[column.key]}>mandatory</span>
|
|
{/if}
|
|
</span>
|
|
</div>
|
|
<div class="input">
|
|
<FormInput {column} bind:value={keypathProxy[column.key]} bind:valid={validity[column.key]} autofocus={index === 0} />
|
|
</div>
|
|
</label>
|
|
{:else}
|
|
{#if emptyHint}
|
|
<Hint>{emptyHint}</Hint>
|
|
{/if}
|
|
{/each}
|
|
{/if}
|
|
|
|
<style>
|
|
.column {
|
|
display: block;
|
|
}
|
|
.column + .column {
|
|
margin-top: 1rem;
|
|
}
|
|
.column .label {
|
|
margin-bottom: 0.5rem;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
}
|
|
.column .label :global(svg) {
|
|
width: 13px;
|
|
height: 13px;
|
|
}
|
|
|
|
.tag {
|
|
display: inline-block;
|
|
background-color: rgba(140, 140, 140, 0.1);
|
|
color: #777;
|
|
text-transform: uppercase;
|
|
font-size: 10px;
|
|
padding: 3px 5px;
|
|
font-weight: 600;
|
|
line-height: 1;
|
|
}
|
|
.tag.invalid {
|
|
background-color: rgba(255, 80, 80, 0.3);
|
|
color: #8d2c2c;
|
|
}
|
|
</style>
|