diff --git a/packages/bbui/src/Layout/Page.svelte b/packages/bbui/src/Layout/Page.svelte
index 2169a12459..62dd9cc909 100644
--- a/packages/bbui/src/Layout/Page.svelte
+++ b/packages/bbui/src/Layout/Page.svelte
@@ -7,11 +7,11 @@
export let narrower = false
export let noPadding = false
- let sidePanelVisble = false
+ let sidePanelVisible = false
setContext("side-panel", {
- open: () => (sidePanelVisble = true),
- close: () => (sidePanelVisble = false),
+ open: () => (sidePanelVisible = true),
+ close: () => (sidePanelVisible = false),
})
@@ -24,9 +24,9 @@
{
- sidePanelVisble = false
+ sidePanelVisible = false
}}
>
diff --git a/packages/client/manifest.json b/packages/client/manifest.json
index 1f6a81236b..abd73aaddd 100644
--- a/packages/client/manifest.json
+++ b/packages/client/manifest.json
@@ -6717,7 +6717,20 @@
"illegalChildren": ["section", "sidepanel"],
"showEmptyState": false,
"draggable": false,
- "info": "Side panels are hidden by default. They will only be revealed when triggered by the 'Open Side Panel' action."
+ "info": "Side panels are hidden by default. They will only be revealed when triggered by the 'Open Side Panel' action.",
+ "settings": [
+ {
+ "type": "boolean",
+ "key": "ignoreClicksOutside",
+ "label": "Ignore clicks outside",
+ "defaultValue": false
+ },
+ {
+ "type": "event",
+ "key": "onClose",
+ "label": "On close"
+ }
+ ]
},
"rowexplorer": {
"block": true,
diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte
index 8508e943ff..eb1e0022cc 100644
--- a/packages/client/src/components/app/Layout.svelte
+++ b/packages/client/src/components/app/Layout.svelte
@@ -73,7 +73,10 @@
$context.device.width,
$context.device.height
)
- $: autoCloseSidePanel = !$builderStore.inBuilder && $sidePanelStore.open
+ $: autoCloseSidePanel =
+ !$builderStore.inBuilder &&
+ $sidePanelStore.open &&
+ !$sidePanelStore.ignoreClicksOutside
$: screenId = $builderStore.inBuilder
? `${$builderStore.screen?._id}-screen`
: "screen"
@@ -191,6 +194,11 @@
}
return url
}
+
+ const handleClickLink = () => {
+ mobileOpen = false
+ sidePanelStore.actions.close()
+ }
@@ -281,7 +289,7 @@
url={navItem.url}
subLinks={navItem.subLinks}
internalLink={navItem.internalLink}
- on:clickLink={() => (mobileOpen = false)}
+ on:clickLink={handleClickLink}
leftNav={navigation === "Left"}
{mobile}
{navStateStore}
diff --git a/packages/client/src/components/app/SidePanel.svelte b/packages/client/src/components/app/SidePanel.svelte
index 825b401bb8..bff5a78837 100644
--- a/packages/client/src/components/app/SidePanel.svelte
+++ b/packages/client/src/components/app/SidePanel.svelte
@@ -5,6 +5,9 @@
const { styleable, sidePanelStore, builderStore, dndIsDragging } =
getContext("sdk")
+ export let onClose
+ export let ignoreClicksOutside
+
// Automatically show and hide the side panel when inside the builder.
// For some unknown reason, svelte reactivity breaks if we reference the
// reactive variable "open" inside the following expression, or if we define
@@ -26,6 +29,10 @@
}
}
+ // $: {
+
+ // }
+
// Derive visibility
$: open = $sidePanelStore.contentId === $component.id
@@ -36,10 +43,17 @@
let renderKey = null
$: {
if (open) {
+ sidePanelStore.actions.setIgnoreClicksOutside(ignoreClicksOutside)
renderKey = Math.random()
}
}
+ const handleSidePanelClose = async () => {
+ if (onClose) {
+ await onClose()
+ }
+ }
+
const showInSidePanel = (el, visible) => {
const update = visible => {
const target = document.getElementById("side-panel-container")
@@ -51,6 +65,7 @@
} else {
if (target.contains(node)) {
target.removeChild(node)
+ handleSidePanelClose()
}
}
}
diff --git a/packages/client/src/stores/sidePanel.js b/packages/client/src/stores/sidePanel.js
index 3b3b9f5f4d..b25914c484 100644
--- a/packages/client/src/stores/sidePanel.js
+++ b/packages/client/src/stores/sidePanel.js
@@ -3,6 +3,7 @@ import { writable, derived } from "svelte/store"
export const createSidePanelStore = () => {
const initialState = {
contentId: null,
+ ignoreClicksOutside: true,
}
const store = writable(initialState)
const derivedStore = derived(store, $store => {
@@ -32,11 +33,18 @@ export const createSidePanelStore = () => {
}, 50)
}
+ const setIgnoreClicksOutside = bool => {
+ store.update(state => {
+ state.ignoreClicksOutside = bool
+ return state
+ })
+ }
return {
subscribe: derivedStore.subscribe,
actions: {
open,
close,
+ setIgnoreClicksOutside,
},
}
}
diff --git a/packages/client/src/utils/buttonActions.js b/packages/client/src/utils/buttonActions.js
index d883ee1b55..4ab7490ae7 100644
--- a/packages/client/src/utils/buttonActions.js
+++ b/packages/client/src/utils/buttonActions.js
@@ -240,6 +240,7 @@ const triggerAutomationHandler = async action => {
const navigationHandler = action => {
const { url, peek, externalNewTab } = action.parameters
routeStore.actions.navigate(url, peek, externalNewTab)
+ closeSidePanelHandler()
}
const queryExecutionHandler = async action => {