1
0
Fork 0
mirror of synced 2024-09-21 03:43:21 +12:00
budibase/packages/builder/src/userInterface/StateBindingControl.svelte

161 lines
3.7 KiB
Svelte
Raw Normal View History

2019-09-20 19:01:35 +12:00
<script>
2020-02-03 22:50:30 +13:00
import IconButton from "../common/IconButton.svelte"
import Input from "../common/Input.svelte"
import { isBinding, getBinding, setBinding } from "../common/binding"
export let value = ""
export let onChanged = () => {}
export let type = ""
export let options = []
let isBound = false
let bindingPath = ""
let bindingFallbackValue = ""
let bindingSource = "store"
let isExpanded = false
let forceIsBound = false
let canOnlyBind = false
$: {
canOnlyBind = type === "state"
if (!forceIsBound && canOnlyBind) forceIsBound = true
isBound = forceIsBound || isBinding(value)
if (isBound) {
const binding = getBinding(value)
bindingPath = binding.path
bindingFallbackValue = binding.fallback
bindingSource = binding.source || "store"
} else {
bindingPath = ""
bindingFallbackValue = ""
bindingSource = "store"
2019-09-20 19:01:35 +12:00
}
2020-02-03 22:50:30 +13:00
}
2019-09-20 19:01:35 +12:00
2020-02-03 22:50:30 +13:00
const clearBinding = () => {
forceIsBound = false
onChanged("")
}
2019-09-20 19:01:35 +12:00
2020-02-03 22:50:30 +13:00
const bind = (path, fallback, source) => {
if (!path) {
clearBinding("")
return
}
2020-02-03 22:50:30 +13:00
const binding = setBinding({ path, fallback, source })
onChanged(binding)
}
const setBindingPath = ev => {
forceIsBound = canOnlyBind
bind(ev.target.value, bindingFallbackValue, bindingSource)
}
const setBindingFallback = ev => {
bind(bindingPath, ev.target.value, bindingSource)
}
const setBindingSource = ev => {
bind(bindingPath, bindingFallbackValue, ev.target.value)
}
2019-09-20 19:01:35 +12:00
</script>
{#if isBound}
2020-02-03 22:50:30 +13:00
<div>
<div class="bound-header">
<div>{isExpanded ? '' : bindingPath}</div>
<IconButton
icon={isExpanded ? 'chevron-up' : 'chevron-down'}
size="12"
on:click={() => (isExpanded = !isExpanded)} />
{#if !canOnlyBind}
<IconButton icon="trash" size="12" on:click={clearBinding} />
{/if}
</div>
2020-02-03 22:50:30 +13:00
{#if isExpanded}
<div>
<div class="binding-prop-label">Binding Path</div>
<input
class="uk-input uk-form-small"
value={bindingPath}
on:change={setBindingPath} />
<div class="binding-prop-label">Fallback Value</div>
<input
class="uk-input uk-form-small"
value={bindingFallbackValue}
on:change={setBindingFallback} />
<div class="binding-prop-label">Binding Source</div>
<select
class="uk-select uk-form-small"
value={bindingSource}
on:change={setBindingSource}>
<option>store</option>
<option>context</option>
</select>
</div>
{/if}
</div>
2019-09-20 19:01:35 +12:00
{:else}
2020-02-03 22:50:30 +13:00
<div class="unbound-container">
{#if type === 'bool'}
<div>
<IconButton
icon={value == true ? 'check-square' : 'square'}
size="19"
on:click={() => onChanged(!value)} />
</div>
{:else if type === 'options'}
<select
class="uk-select uk-form-small"
{value}
on:change={ev => onChanged(ev.target.value)}>
{#each options as option}
<option value={option}>{option}</option>
{/each}
</select>
{:else}
<Input on:change={ev => onChanged(ev.target.value)} bind:value />
{/if}
</div>
2019-09-20 19:01:35 +12:00
{/if}
<style>
2020-02-03 22:50:30 +13:00
.unbound-container {
display: flex;
}
.bound-header {
display: flex;
}
.bound-header > div:nth-child(1) {
flex: 1 0 auto;
width: 30px;
color: var(--secondary50);
padding-left: 5px;
}
.binding-prop-label {
color: var(--secondary50);
}
input {
font-size: 12px;
font-weight: 700;
color: #163057;
opacity: 0.7;
padding: 5px 10px;
box-sizing: border-box;
border: 1px solid #dbdbdb;
border-radius: 2px;
outline: none;
}
</style>