Budibase is an open-source low-code platform for creating internal apps in minutes. Supports PostgreSQL, MySQL, MSSQL, MongoDB, Rest API, Docker, K8s 🚀
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
2.9 KiB

<script>
import { ArrowDownIcon } from "../common/Icons/";
import { store } from "../builderStore";
import { isBinding, getBinding, setBinding } from "../common/binding";
export let onChanged = () => {};
export let value = "";
let isOpen = false;
let stateBindings = [];
let bindingPath = "";
let bindingFallbackValue = "";
let bindingSource = "store";
const clearBinding = () => onChanged("");
const bind = (path, fallback, source) => {
if (!path) {
clearBinding("");
return;
}
const binding = setBinding({ path, fallback, source });
onChanged(binding);
};
const setBindingPath = value =>
bind(value, bindingFallbackValue, bindingSource);
const setBindingFallback = value => bind(bindingPath, value, bindingSource);
const setBindingSource = value =>
bind(bindingPath, bindingFallbackValue, value);
$: {
const binding = getBinding(value);
bindingPath = binding.path;
bindingFallbackValue = binding.fallback
? binding.fallback
: typeof value === "object"
? ""
: value;
const currentScreen = $store.screens.find(
({ name }) => name === $store.currentPreviewItem.name
);
stateBindings = currentScreen ? currentScreen.stateOrigins : [];
}
</script>
<div class="cascader">
<div class="input-box">
<input
class="uk-input uk-form-small"
value={bindingFallbackValue}
on:change={e => {
setBindingFallback(e.target.value);
onChanged(e.target.value);
}} />
<button on:click={() => (isOpen = !isOpen)}>
<div
class="icon"
style={`
transform: rotate(${isOpen ? 0 : 90}deg);
color: ${bindingPath ? 'rgba(0, 85, 255, 0.8);' : 'inherit;'}
`}>
<ArrowDownIcon size={36} />
</div>
</button>
</div>
{#if isOpen}
<ul class="options">
{#each Object.keys(stateBindings) as stateBinding}
<li
style={stateBinding === bindingPath && 'font-weight: bold;'}
on:click={() => {
setBindingPath(stateBinding === bindingPath ? null : stateBinding);
}}>
{stateBinding}
</li>
{/each}
</ul>
{/if}
</div>
<style>
button {
cursor: pointer;
outline: none;
border: none;
border-radius: 5px;
background: rgba(249, 249, 249, 1);
font-size: 1.6rem;
font-weight: 700;
color: rgba(22, 48, 87, 1);
}
.cascader {
position: relative;
width: 100%;
}
.input-box {
display: flex;
align-items: center;
}
.options {
width: 172px;
margin: 0;
position: absolute;
top: 35px;
padding: 10px;
z-index: 1;
background: rgba(249, 249, 249, 1);
min-height: 50px;
border-radius: 2px;
}
li {
list-style-type: none;
}
li:hover {
cursor: pointer;
font-weight: bold;
}
input {
margin-right: 5px;
border: 1px solid #dbdbdb;
border-radius: 2px;
opacity: 0.5;
height: 40px;
}
</style>