budibase/packages/builder/src/userInterface/ComponentPanel.svelte

150 lines
3.3 KiB
Svelte
Raw Normal View History

2020-01-21 15:50:35 +01:00
<script>
2020-02-03 10:50:30 +01:00
import PropsView from "./PropsView.svelte"
import { store } from "../builderStore"
import IconButton from "../common/IconButton.svelte"
import {
LayoutIcon,
PaintIcon,
TerminalIcon,
CircleIndicator,
EventsIcon,
} from "../common/Icons/"
import CodeEditor from "./CodeEditor.svelte"
import LayoutEditor from "./LayoutEditor.svelte"
import EventsEditor from "./EventsEditor"
let current_view = "props"
let codeEditor
$: component = $store.currentComponentInfo
$: originalName = component.name
$: name = component.name
$: description = component.description
$: componentInfo = $store.currentComponentInfo
$: components = $store.components
const onPropChanged = store.setComponentProp
const onStyleChanged = store.setComponentStyle
2020-01-21 15:50:35 +01:00
</script>
<div class="root">
2020-02-03 10:50:30 +01:00
<ul>
<li>
<button
class:selected={current_view === 'props'}
on:click={() => (current_view = 'props')}>
<PaintIcon />
</button>
</li>
<li>
<button
class:selected={current_view === 'layout'}
on:click={() => (current_view = 'layout')}>
<LayoutIcon />
</button>
</li>
<li>
<button
class:selected={current_view === 'code'}
on:click={() => codeEditor && codeEditor.show()}>
{#if componentInfo._code && componentInfo._code.trim().length > 0}
<div class="button-indicator">
<CircleIndicator />
</div>
{/if}
2020-02-03 10:50:30 +01:00
<TerminalIcon />
</button>
</li>
<li>
<button
class:selected={current_view === 'events'}
on:click={() => (current_view = 'events')}>
<EventsIcon />
</button>
</li>
</ul>
{#if !componentInfo.component}
<div class="component-props-container">
{#if current_view === 'props'}
<PropsView {componentInfo} {components} {onPropChanged} />
{:else if current_view === 'layout'}
<LayoutEditor {onStyleChanged} {componentInfo} />
{:else if current_view === 'events'}
<EventsEditor {componentInfo} {components} {onPropChanged} />
{/if}
<CodeEditor
bind:this={codeEditor}
code={$store.currentComponentInfo._code}
onCodeChanged={store.setComponentCode} />
</div>
{:else}
<h1>This is a screen, this will be dealt with later</h1>
{/if}
2020-01-21 15:50:35 +01:00
</div>
2020-01-21 15:50:35 +01:00
<style>
2020-02-03 10:50:30 +01:00
.root {
2020-01-21 15:50:35 +01:00
height: 100%;
display: flex;
flex-direction: column;
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
.title > div:nth-child(1) {
2020-01-21 15:50:35 +01:00
grid-column-start: name;
color: var(--secondary100);
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
.title > div:nth-child(2) {
2020-01-21 15:50:35 +01:00
grid-column-start: actions;
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
.component-props-container {
margin-top: 10px;
2020-01-21 15:50:35 +01:00
flex: 1 1 auto;
overflow-y: auto;
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
ul {
2020-01-21 15:50:35 +01:00
list-style: none;
display: flex;
padding: 0;
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
li {
2020-01-21 15:50:35 +01:00
margin-right: 20px;
background: none;
border-radius: 5px;
2020-01-22 12:30:19 +01:00
width: 48px;
height: 48px;
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
li button {
2020-01-21 15:50:35 +01:00
width: 100%;
height: 100%;
background: none;
border: none;
border-radius: 5px;
padding: 12px;
outline: none;
cursor: pointer;
position: relative;
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
.selected {
2020-01-21 15:50:35 +01:00
color: var(--button-text);
2020-02-03 10:50:30 +01:00
background: var(--background-button) !important;
}
2020-01-21 15:50:35 +01:00
2020-02-03 10:50:30 +01:00
.button-indicator {
position: absolute;
top: 8px;
right: 10px;
color: var(--button-text);
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
</style>