2022-01-09 21:24:49 +01:00
|
|
|
<script lang="ts">
|
|
|
|
import Selector from "./Selector.svelte";
|
|
|
|
import { createEventDispatcher } from "svelte";
|
2022-02-07 16:32:49 +01:00
|
|
|
import type { IValue, VALUE_TYPE } from "upend/types";
|
2022-01-09 21:24:49 +01:00
|
|
|
import IconButton from "./IconButton.svelte";
|
2022-01-27 17:43:30 +01:00
|
|
|
import { isEqual } from "lodash";
|
2022-01-09 21:24:49 +01:00
|
|
|
const dispatch = createEventDispatcher();
|
|
|
|
|
|
|
|
export let editable: boolean;
|
2022-02-07 16:32:49 +01:00
|
|
|
export let attribute: string | undefined = undefined;
|
2022-01-09 21:24:49 +01:00
|
|
|
export let value: IValue;
|
|
|
|
let newValue: IValue = value;
|
2022-02-07 16:32:49 +01:00
|
|
|
|
|
|
|
// todo - grab from db
|
|
|
|
const TYPES_FOR_ATTR: { [key: string]: VALUE_TYPE[] } = {
|
|
|
|
LBL: ["String"],
|
|
|
|
FILE_SIZE: ["Number"],
|
|
|
|
FILE_MIME: ["String"],
|
|
|
|
ADDED: ["Number"],
|
|
|
|
LAST_VISITED: ["Number"]
|
|
|
|
};
|
2022-01-09 21:24:49 +01:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<div class="editable">
|
|
|
|
{#if editable}
|
|
|
|
<div class="inner">
|
|
|
|
<div class="selector">
|
2022-02-07 16:32:49 +01:00
|
|
|
<Selector
|
|
|
|
type="value"
|
|
|
|
valueTypes={TYPES_FOR_ATTR[attribute]}
|
|
|
|
bind:value={newValue}
|
|
|
|
/>
|
2022-01-09 21:24:49 +01:00
|
|
|
</div>
|
|
|
|
<IconButton
|
|
|
|
name="check-circle"
|
2022-01-27 17:43:30 +01:00
|
|
|
disabled={isEqual(value, newValue)}
|
2022-01-09 21:24:49 +01:00
|
|
|
on:click={() => dispatch("edit", newValue)}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
{:else}
|
|
|
|
<slot />
|
|
|
|
{/if}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.inner {
|
|
|
|
display: flex;
|
|
|
|
}
|
|
|
|
|
|
|
|
.selector {
|
|
|
|
flex-grow: 1;
|
2022-01-27 17:43:30 +01:00
|
|
|
min-width: 0;
|
2022-01-09 21:24:49 +01:00
|
|
|
}
|
|
|
|
</style>
|