<script> import { ArrowDownIcon } from "../common/Icons/"; import { store } from "../builderStore"; import { isBinding, getBinding, setBinding } from "../common/binding"; export let value = ""; export let onChanged = () => {}; export let type = ""; let isOpen = false; let stateBindings = []; 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"; } } const clearBinding = () => { forceIsBound = false; onChanged(""); }; const bind = (path, fallback, source) => { if (!path) { clearBinding(""); return; } const binding = setBinding({ path, fallback, source }); onChanged(binding); }; const setBindingPath = value => { forceIsBound = canOnlyBind; bind(value, bindingFallbackValue, bindingSource); }; const setBindingFallback = value => bind(bindingPath, value, bindingSource); const setBindingSource = value => bind(bindingPath, bindingFallbackValue, value); $: { console.log({ bindingFallbackValue, bindingPath, value }); const currentScreen = $store.screens.find( ({ name }) => name === $store.currentFrontEndItem.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) }}/> <button on:click={() => (isOpen = !isOpen)}> <span class="icon" style={` transform: rotate(${isOpen ? 0 : 90}deg); color: ${bindingPath ? 'rgba(0, 85, 255, 0.8)' : 'inherit'} `}> <ArrowDownIcon size={36} /> </span> </button> </div> {#if isOpen} <ul class="options"> {#each Object.keys(stateBindings) as stateBinding} <li style={`font-weight: ${stateBinding === bindingPath ? 'bold' : 'initial'}`} 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); width: 30px; height: 30px; padding-bottom: 10px; display: flex; justify-content: center; align-items: center; 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; transition: 0.2s all; } li:hover { cursor: pointer; font-weight: 600; } input { margin-right: 5px; border: 1px solid #dbdbdb; border-radius: 2px; opacity: 0.5; height: 40px; /* display: block; font-size: 14px; font-family: sans-serif; font-weight: 500; color: #163057; line-height: 1.3; padding: 1em 2.6em 0.9em 1.4em; /* width: 100%; */ /* max-width: 100%; box-sizing: border-box; margin: 0; -moz-appearance: none; -webkit-appearance: none; appearance: none; background: #fff; border: 1px solid #ccc; height: 50px; */ } </style>