budibase/packages/builder/src/components/userInterface/ComponentPropertiesPanel.sv...

165 lines
4.5 KiB
Svelte
Raw Normal View History

2020-01-21 15:50:35 +01:00
<script>
2020-05-18 17:32:00 +02:00
import { setContext, onMount } from "svelte"
2020-06-03 17:19:04 +02:00
import {screen, page} from "./propertyCategories.js"
2020-02-03 10:50:30 +01:00
import PropsView from "./PropsView.svelte"
import { store } from "builderStore"
import IconButton from "components/common/IconButton.svelte"
2020-02-03 10:50:30 +01:00
import {
LayoutIcon,
PaintIcon,
TerminalIcon,
CircleIndicator,
EventsIcon,
} from "components/common/Icons/"
2020-02-03 10:50:30 +01:00
import CodeEditor from "./CodeEditor.svelte"
import LayoutEditor from "./LayoutEditor.svelte"
import EventsEditor from "./EventsEditor"
2020-05-04 17:07:04 +02:00
import panelStructure from "./temporaryPanelStructure.js"
import CategoryTab from "./CategoryTab.svelte"
import DesignView from "./DesignView.svelte"
2020-05-18 17:32:00 +02:00
import SettingsView from "./SettingsView.svelte"
2020-05-04 17:07:04 +02:00
let current_view = "design"
2020-02-03 10:50:30 +01:00
let codeEditor
2020-05-04 17:07:04 +02:00
let flattenedPanel = flattenComponents(panelStructure.categories)
let categories = [
2020-05-18 17:32:00 +02:00
{ value: "design", name: "Design" },
{ value: "settings", name: "Settings" },
{ value: "events", name: "Events" },
2020-05-04 17:07:04 +02:00
]
let selectedCategory = categories[0]
2020-02-03 10:50:30 +01:00
$: components = $store.components
$: componentInstance = $store.currentComponentInfo
2020-05-18 17:32:00 +02:00
$: componentDefinition = $store.components[componentInstance._component]
2020-05-20 12:55:25 +02:00
$: componentPropDefinition =
flattenedPanel.find(
//use for getting controls for each component property
c => c._component === componentInstance._component
) || {}
$: panelDefinition = componentPropDefinition.properties
? componentPropDefinition.properties[selectedCategory.value]
: {}
2020-06-03 17:19:04 +02:00
let panelDefNew = {}
$: {
if(componentPropDefinition.properties) {
if(selectedCategory.value === "design") {
panelDefNew = componentPropDefinition.properties["design"]
}else{
let panelDef = componentPropDefinition.properties["settings"]
if($store.currentFrontEndType === "page") {
panelDefNew = [...page,...panelDef]
}else if($store.currentFrontEndType === "screen" && $store.currentView !== "component") {
panelDefNew = [...screen, ...panelDef]
}else {
panelDefNew = panelDef
}
}
}
}
2020-05-04 17:07:04 +02:00
2020-06-03 17:19:04 +02:00
let componentInstanceNew = {}
$: {
if(($store.currentFrontEndType === "screen" || $store.currentFrontEndType === "page") && $store.currentView !== "component") {
componentInstanceNew = {...$store.currentPreviewItem, ...$store.currentComponentInfo}
}else {
componentInstanceNew = $store.currentComponentInfo
}
}
$: console.log("COMP INSTA NEW", componentInstanceNew)
2020-06-03 17:19:04 +02:00
2020-02-03 10:50:30 +01:00
const onStyleChanged = store.setComponentStyle
2020-06-03 17:19:04 +02:00
function onPropChanged(key, value) {
if($store.currentFrontEndType === "page") {
store.editPageOrScreen(key, value)
}else if($store.currentFrontEndType === "screen" && $store.currentView !== "component") {
store.editPageOrScreen(key, value)
}else {
store.setComponentProp(key, value)
}
}
2020-02-26 10:43:38 +01:00
2020-05-04 17:07:04 +02:00
function walkProps(component, action) {
action(component)
if (component.children) {
for (let child of component.children) {
walkProps(child, action)
}
}
}
function flattenComponents(props) {
const components = []
props.forEach(comp =>
walkProps(comp, c => {
if ("_component" in c) {
components.push(c)
}
})
)
return components
}
2020-02-26 10:43:38 +01:00
function getProps(obj, keys) {
return keys.map((key, i) => [key, obj[key], obj.props._id + i])
2020-02-26 10:43:38 +01:00
}
2020-01-21 15:50:35 +01:00
</script>
<div class="root">
2020-05-04 17:07:04 +02:00
<CategoryTab
onClick={category => (selectedCategory = category)}
{categories}
{selectedCategory} />
2020-05-04 17:07:04 +02:00
<div class="component-props-container">
2020-05-18 17:32:00 +02:00
{#if selectedCategory.value === 'design'}
2020-06-03 17:19:04 +02:00
<DesignView panelDefinition={panelDefNew} {componentInstance} {onStyleChanged} />
2020-05-18 17:32:00 +02:00
{:else if selectedCategory.value === 'settings'}
<SettingsView
2020-06-03 17:19:04 +02:00
panelDefinition={panelDefNew}
2020-05-18 17:32:00 +02:00
{componentInstance}
{componentDefinition}
2020-05-18 17:32:00 +02:00
onChange={onPropChanged} />
{:else if selectedCategory.value === 'events'}
<EventsEditor component={componentInstance} />
2020-05-04 17:07:04 +02:00
{/if}
</div>
</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-05-07 15:30:04 +02:00
overflow-x: hidden;
2020-06-02 12:40:33 +02:00
overflow-y: hidden;
padding: 20px;
2020-06-01 23:04:32 +02:00
box-sizing: border-box;
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(--ink);
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: 20px;
2020-01-21 15:50:35 +01:00
flex: 1 1 auto;
2020-06-01 23:04:32 +02:00
min-height: 0;
overflow-y: auto;
2020-02-03 10:50:30 +01:00
}
2020-01-21 15:50:35 +01:00
</style>