Merge pull request #6409 from Budibase/useful-features
"On screen load" actions & query params binding
This commit is contained in:
commit
df839e7aa8
|
@ -390,11 +390,17 @@ const getUrlBindings = asset => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const safeURL = makePropSafe("url")
|
const safeURL = makePropSafe("url")
|
||||||
return params.map(param => ({
|
const urlParamBindings = params.map(param => ({
|
||||||
type: "context",
|
type: "context",
|
||||||
runtimeBinding: `${safeURL}.${makePropSafe(param)}`,
|
runtimeBinding: `${safeURL}.${makePropSafe(param)}`,
|
||||||
readableBinding: `URL.${param}`,
|
readableBinding: `URL.${param}`,
|
||||||
}))
|
}))
|
||||||
|
const queryParamsBinding = {
|
||||||
|
type: "context",
|
||||||
|
runtimeBinding: makePropSafe("query"),
|
||||||
|
readableBinding: "Query params",
|
||||||
|
}
|
||||||
|
return urlParamBindings.concat([queryParamsBinding])
|
||||||
}
|
}
|
||||||
|
|
||||||
const getRoleBindings = () => {
|
const getRoleBindings = () => {
|
||||||
|
@ -694,6 +700,13 @@ export const getAllStateVariables = () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Add on load settings from screens
|
||||||
|
get(store).screens.forEach(screen => {
|
||||||
|
if (screen.onLoad) {
|
||||||
|
eventSettings.push(screen.onLoad)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Extract all state keys from any "update state" actions in each setting
|
// Extract all state keys from any "update state" actions in each setting
|
||||||
let bindingSet = new Set()
|
let bindingSet = new Set()
|
||||||
eventSettings.forEach(setting => {
|
eventSettings.forEach(setting => {
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
import { selectedScreen, store } from "builderStore"
|
import { selectedScreen, store } from "builderStore"
|
||||||
import sanitizeUrl from "builderStore/store/screenTemplates/utils/sanitizeUrl"
|
import sanitizeUrl from "builderStore/store/screenTemplates/utils/sanitizeUrl"
|
||||||
import { goto } from "@roxi/routify"
|
import { goto } from "@roxi/routify"
|
||||||
|
import ButtonActionEditor from "components/design/settings/controls/ButtonActionEditor/ButtonActionEditor.svelte"
|
||||||
|
import { getBindableProperties } from "builderStore/dataBinding"
|
||||||
|
|
||||||
|
$: bindings = getBindableProperties($selectedScreen, null)
|
||||||
|
|
||||||
let errors = {}
|
let errors = {}
|
||||||
|
|
||||||
|
@ -147,6 +151,11 @@
|
||||||
disabled: !!$selectedScreen.layoutId,
|
disabled: !!$selectedScreen.layoutId,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: "onLoad",
|
||||||
|
label: "On screen load",
|
||||||
|
control: ButtonActionEditor,
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const removeCustomLayout = async () => {
|
const removeCustomLayout = async () => {
|
||||||
|
@ -178,6 +187,7 @@
|
||||||
value={deepGet($selectedScreen, setting.key)}
|
value={deepGet($selectedScreen, setting.key)}
|
||||||
onChange={val => setScreenSetting(setting, val)}
|
onChange={val => setScreenSetting(setting, val)}
|
||||||
props={{ ...setting.props, error: errors[setting.key] }}
|
props={{ ...setting.props, error: errors[setting.key] }}
|
||||||
|
{bindings}
|
||||||
/>
|
/>
|
||||||
{/each}
|
{/each}
|
||||||
<Button cta on:click={() => $goto("../components")}>View components</Button>
|
<Button cta on:click={() => $goto("../components")}>View components</Button>
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
import DeviceBindingsProvider from "components/context/DeviceBindingsProvider.svelte"
|
import DeviceBindingsProvider from "components/context/DeviceBindingsProvider.svelte"
|
||||||
import StateBindingsProvider from "components/context/StateBindingsProvider.svelte"
|
import StateBindingsProvider from "components/context/StateBindingsProvider.svelte"
|
||||||
import RowSelectionProvider from "components/context/RowSelectionProvider.svelte"
|
import RowSelectionProvider from "components/context/RowSelectionProvider.svelte"
|
||||||
|
import QueryParamsProvider from "components/context/QueryParamsProvider.svelte"
|
||||||
import SettingsBar from "components/preview/SettingsBar.svelte"
|
import SettingsBar from "components/preview/SettingsBar.svelte"
|
||||||
import SelectionIndicator from "components/preview/SelectionIndicator.svelte"
|
import SelectionIndicator from "components/preview/SelectionIndicator.svelte"
|
||||||
import HoverIndicator from "components/preview/HoverIndicator.svelte"
|
import HoverIndicator from "components/preview/HoverIndicator.svelte"
|
||||||
|
@ -94,6 +95,7 @@
|
||||||
<UserBindingsProvider>
|
<UserBindingsProvider>
|
||||||
<StateBindingsProvider>
|
<StateBindingsProvider>
|
||||||
<RowSelectionProvider>
|
<RowSelectionProvider>
|
||||||
|
<QueryParamsProvider>
|
||||||
<!-- Settings bar can be rendered outside of device preview -->
|
<!-- Settings bar can be rendered outside of device preview -->
|
||||||
<!-- Key block needs to be outside the if statement or it breaks -->
|
<!-- Key block needs to be outside the if statement or it breaks -->
|
||||||
{#key $builderStore.selectedComponentId}
|
{#key $builderStore.selectedComponentId}
|
||||||
|
@ -183,6 +185,7 @@
|
||||||
<DNDHandler />
|
<DNDHandler />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
</QueryParamsProvider>
|
||||||
</RowSelectionProvider>
|
</RowSelectionProvider>
|
||||||
</StateBindingsProvider>
|
</StateBindingsProvider>
|
||||||
</UserBindingsProvider>
|
</UserBindingsProvider>
|
||||||
|
|
|
@ -1,21 +1,36 @@
|
||||||
<script>
|
<script>
|
||||||
import { screenStore, routeStore } from "stores"
|
import { screenStore, routeStore, builderStore } from "stores"
|
||||||
import Component from "./Component.svelte"
|
import Component from "./Component.svelte"
|
||||||
import Provider from "./context/Provider.svelte"
|
import Provider from "./context/Provider.svelte"
|
||||||
import { onMount } from "svelte"
|
import { onMount, getContext } from "svelte"
|
||||||
|
import { enrichButtonActions } from "utils/buttonActions.js"
|
||||||
|
|
||||||
|
export let params = {}
|
||||||
|
|
||||||
|
const context = getContext("context")
|
||||||
|
|
||||||
// Keep route params up to date
|
// Keep route params up to date
|
||||||
export let params = {}
|
|
||||||
$: routeStore.actions.setRouteParams(params || {})
|
$: routeStore.actions.setRouteParams(params || {})
|
||||||
|
|
||||||
// Get the screen definition for the current route
|
// Get the screen definition for the current route
|
||||||
$: screenDefinition = $screenStore.activeScreen?.props
|
$: screenDefinition = $screenStore.activeScreen?.props
|
||||||
|
|
||||||
// Mark the router as loaded whenever the screen mounts
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
|
// Mark the router as loaded whenever the screen mounts
|
||||||
if (!$routeStore.routerLoaded) {
|
if (!$routeStore.routerLoaded) {
|
||||||
routeStore.actions.setRouterLoaded()
|
routeStore.actions.setRouterLoaded()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enrich and execute and on load actions.
|
||||||
|
// We manually construct the full context here as this component is the
|
||||||
|
// one that provides the url context, so it is not available in $context yet
|
||||||
|
if ($screenStore.activeScreen?.onLoad && !$builderStore.inBuilder) {
|
||||||
|
const actions = enrichButtonActions($screenStore.activeScreen.onLoad, {
|
||||||
|
...$context,
|
||||||
|
url: params,
|
||||||
|
})
|
||||||
|
actions()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
<script>
|
||||||
|
import Provider from "./Provider.svelte"
|
||||||
|
import { routeStore } from "stores"
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Provider key="query" data={$routeStore.queryParams}>
|
||||||
|
<slot />
|
||||||
|
</Provider>
|
Loading…
Reference in New Issue