diff --git a/packages/builder/src/builderStore/index.js b/packages/builder/src/builderStore/index.js
index 2ca8057b48..eecccab7a6 100644
--- a/packages/builder/src/builderStore/index.js
+++ b/packages/builder/src/builderStore/index.js
@@ -4,7 +4,7 @@ import { getTemporalStore } from "./store/temporal"
import { getThemeStore } from "./store/theme"
import { getUserStore } from "./store/users"
import { getDeploymentStore } from "./store/deployments"
-import { derived } from "svelte/store"
+import { derived, writable } from "svelte/store"
import { findComponent, findComponentPath } from "./componentUtils"
import { RoleUtils } from "@budibase/frontend-core"
import { createHistoryStore } from "builderStore/store/history"
@@ -61,6 +61,12 @@ export const selectedLayout = derived(store, $store => {
export const selectedComponent = derived(
[store, selectedScreen],
([$store, $selectedScreen]) => {
+ if (
+ $selectedScreen &&
+ $store.selectedComponentId?.startsWith(`${$selectedScreen._id}-`)
+ ) {
+ return $selectedScreen?.props
+ }
if (!$selectedScreen || !$store.selectedComponentId) {
return null
}
@@ -141,3 +147,5 @@ export const userSelectedResourceMap = derived(userStore, $userStore => {
export const isOnlyUser = derived(userStore, $userStore => {
return $userStore.length < 2
})
+
+export const screensHeight = writable("210px")
diff --git a/packages/builder/src/builderStore/store/frontend.js b/packages/builder/src/builderStore/store/frontend.js
index f312a58e97..8f4f6cc2c4 100644
--- a/packages/builder/src/builderStore/store/frontend.js
+++ b/packages/builder/src/builderStore/store/frontend.js
@@ -225,7 +225,6 @@ export const getFrontendStore = () => {
// Select new screen
store.update(state => {
state.selectedScreenId = screen._id
- state.selectedComponentId = screen.props?._id
return state
})
},
@@ -769,9 +768,13 @@ export const getFrontendStore = () => {
else {
await store.actions.screens.patch(screen => {
// Find the selected component
+ let selectedComponentId = state.selectedComponentId
+ if (selectedComponentId.startsWith(`${screen._id}-`)) {
+ selectedComponentId = screen?.props._id
+ }
const currentComponent = findComponent(
screen.props,
- state.selectedComponentId
+ selectedComponentId
)
if (!currentComponent) {
return false
@@ -994,12 +997,20 @@ export const getFrontendStore = () => {
const componentId = state.selectedComponentId
const screen = get(selectedScreen)
const parent = findComponentParent(screen.props, componentId)
-
- // Check we aren't right at the top of the tree
const index = parent?._children.findIndex(x => x._id === componentId)
- if (!parent || componentId === screen.props._id) {
+
+ // Check for screen and navigation component edge cases
+ const screenComponentId = `${screen._id}-screen`
+ const navComponentId = `${screen._id}-navigation`
+ if (componentId === screenComponentId) {
return null
}
+ if (componentId === navComponentId) {
+ return screenComponentId
+ }
+ if (parent._id === screen.props._id && index === 0) {
+ return navComponentId
+ }
// If we have siblings above us, choose the sibling or a descendant
if (index > 0) {
@@ -1021,12 +1032,20 @@ export const getFrontendStore = () => {
return parent._id
},
getNext: () => {
+ const state = get(store)
const component = get(selectedComponent)
const componentId = component?._id
const screen = get(selectedScreen)
const parent = findComponentParent(screen.props, componentId)
const index = parent?._children.findIndex(x => x._id === componentId)
+ // Check for screen and navigation component edge cases
+ const screenComponentId = `${screen._id}-screen`
+ const navComponentId = `${screen._id}-navigation`
+ if (state.selectedComponentId === screenComponentId) {
+ return navComponentId
+ }
+
// If we have children, select first child
if (component._children?.length) {
return component._children[0]._id
diff --git a/packages/builder/src/components/commandPalette/CommandPalette.svelte b/packages/builder/src/components/commandPalette/CommandPalette.svelte
index 3c95dbbd0b..92fbe9445c 100644
--- a/packages/builder/src/components/commandPalette/CommandPalette.svelte
+++ b/packages/builder/src/components/commandPalette/CommandPalette.svelte
@@ -121,7 +121,9 @@
type: "Screen",
name: screen.routing.route,
icon: "WebPage",
- action: () => $goto(`./design/${screen._id}/components`),
+ action: () => {
+ $goto(`./design/${screen._id}/${screen._id}-screen`)
+ },
})),
...($automationStore?.automations?.map(automation => ({
type: "Automation",
diff --git a/packages/builder/src/components/common/NavItem.svelte b/packages/builder/src/components/common/NavItem.svelte
index 6590463408..a65da55c8f 100644
--- a/packages/builder/src/components/common/NavItem.svelte
+++ b/packages/builder/src/components/common/NavItem.svelte
@@ -21,6 +21,7 @@
export let id
export let showTooltip = false
export let selectedBy = null
+ export let compact = false
const scrollApi = getContext("scroll")
const dispatch = createEventDispatcher()
@@ -80,8 +81,9 @@
{#if withArrow}
0}
+ class:relative={indentLevel === 0 && !compact}
+ class:absolute={indentLevel > 0 && !compact}
+ class:compact
class="icon arrow"
on:click={onIconClick}
>
@@ -194,10 +196,21 @@
padding: 8px;
margin-left: -8px;
}
+
+ .compact {
+ position: absolute;
+ left: 6px;
+ padding: 8px;
+ margin-left: -8px;
+ }
.icon.arrow :global(svg) {
width: 12px;
height: 12px;
}
+ .icon.arrow.compact :global(svg) {
+ width: 9px;
+ height: 9px;
+ }
.icon.arrow.relative {
position: relative;
margin: 0 -6px 0 -4px;
diff --git a/packages/builder/src/components/design/Pane.svelte b/packages/builder/src/components/design/Pane.svelte
deleted file mode 100644
index 88b6ea1c05..0000000000
--- a/packages/builder/src/components/design/Pane.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-{#if $paneStore}
-
-
-
-{/if}
-
-
diff --git a/packages/builder/src/components/design/Panel.svelte b/packages/builder/src/components/design/Panel.svelte
index 3968292ba9..f649a9bd06 100644
--- a/packages/builder/src/components/design/Panel.svelte
+++ b/packages/builder/src/components/design/Panel.svelte
@@ -1,5 +1,5 @@
-
-
-
-
- {#each Object.entries(panes) as [id, pane]}
-
-
-
- {/each}
-
-
-
-
-
-
-
diff --git a/packages/builder/src/helpers/urlStateSync.js b/packages/builder/src/helpers/urlStateSync.js
index c4c48fb3fb..2408dde2f1 100644
--- a/packages/builder/src/helpers/urlStateSync.js
+++ b/packages/builder/src/helpers/urlStateSync.js
@@ -56,6 +56,11 @@ export const syncURLToState = options => {
// Navigate to a certain URL
const gotoUrl = (url, params) => {
+ // Clean URL
+ if (url?.endsWith("/index")) {
+ url = url.replace("/index", "")
+ }
+ // Allow custom URL handling
if (beforeNavigate) {
const res = beforeNavigate(url, params)
if (res?.url) {
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentInfoSection.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentInfoSection.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentInfoSection.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentInfoSection.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsPanel.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsSection.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsSection.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsSection.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsSection.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUIDrawer.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUIDrawer.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUIDrawer.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUIDrawer.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUISection.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUISection.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUISection.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUISection.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/CustomStylesSection.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/CustomStylesSection.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/CustomStylesSection.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/CustomStylesSection.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/DesignSection.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/DesignSection.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/DesignSection.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/DesignSection.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/StyleSection.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/StyleSection.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/StyleSection.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/StyleSection.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/componentStyles.js b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/componentStyles.js
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/componentStyles.js
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/componentStyles.js
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationLinksDrawer.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/LinksDrawer.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationLinksDrawer.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/LinksDrawer.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationLinksEditor.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/LinksEditor.svelte
similarity index 75%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationLinksEditor.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/LinksEditor.svelte
index 895c82495d..b081ea6d72 100644
--- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationLinksEditor.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/LinksEditor.svelte
@@ -1,6 +1,6 @@
-
-
+
+
Configure the links in your navigation bar.
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/index.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/index.svelte
new file mode 100644
index 0000000000..97622098cd
--- /dev/null
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Navigation/index.svelte
@@ -0,0 +1,235 @@
+
+
+
+
+
+ General
+
+
+
+ Show nav on this screen
+
+
+
+ {#if $selectedScreen.showNavigation}
+
+
+
+ Customize
+
+
+
+
+
+
+
+
+
+
+
+
+ update("navigation", "Top")}
+ />
+ update("navigation", "Left")}
+ />
+
+
+ {#if $store.navigation.navigation === "Top"}
+
+
+
+
update("sticky", e.detail)}
+ />
+
+
+
+
+
+ {/if}
+
+
+
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenSettingsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/SettingsPanel.svelte
similarity index 92%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenSettingsPanel.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/SettingsPanel.svelte
index 8982cd20de..e6200272be 100644
--- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenSettingsPanel.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/SettingsPanel.svelte
@@ -5,8 +5,6 @@
import {
Input,
Layout,
- Button,
- Toggle,
Checkbox,
Banner,
Select,
@@ -16,7 +14,6 @@
import RoleSelect from "components/design/settings/controls/RoleSelect.svelte"
import { selectedScreen, store } from "builderStore"
import sanitizeUrl from "builderStore/store/screenTemplates/utils/sanitizeUrl"
- import { goto } from "@roxi/routify"
import ButtonActionEditor from "components/design/settings/controls/ButtonActionEditor/ButtonActionEditor.svelte"
import { getBindableProperties } from "builderStore/dataBinding"
@@ -119,15 +116,6 @@
label: "On screen load",
control: ButtonActionEditor,
},
- {
- key: "showNavigation",
- label: "Navigation",
- control: Toggle,
- props: {
- text: "Show nav",
- disabled: !!$selectedScreen.layoutId,
- },
- },
{
key: "width",
label: "Width",
@@ -173,8 +161,5 @@
{bindings}
/>
{/each}
-
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_layout.svelte
new file mode 100644
index 0000000000..03a0aad9ba
--- /dev/null
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_layout.svelte
@@ -0,0 +1,52 @@
+
+
+{#if routeComponentId === `${$store.selectedScreenId}-screen`}
+
+{:else if routeComponentId === `${$store.selectedScreenId}-navigation`}
+
+{:else}
+
+{/if}
+
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/index.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/index.svelte
new file mode 100644
index 0000000000..0ff63d1ead
--- /dev/null
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/index.svelte
@@ -0,0 +1 @@
+
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/new/_components/NewComponentPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/NewComponentPanel.svelte
similarity index 98%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/new/_components/NewComponentPanel.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/NewComponentPanel.svelte
index 7dca5b792b..248bbc8141 100644
--- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/new/_components/NewComponentPanel.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/NewComponentPanel.svelte
@@ -31,6 +31,10 @@
$: orderMap = createComponentOrderMap(componentList)
const getAllowedComponents = (allComponents, screen, component) => {
+ // Default to using the root screen container if no component specified
+ if (!component) {
+ component = screen.props
+ }
const path = findComponentPath(screen?.props, component?._id)
if (!path?.length) {
return []
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/new/_components/componentStructure.json b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/new/_components/componentStructure.json
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/new/index.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/index.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/new/index.svelte
rename to packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/index.svelte
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte
index 785b221239..09f97302fd 100644
--- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte
@@ -1,32 +1,16 @@