mirror of https://github.com/Budibase/budibase.git
committed by
GitHub
9 changed files with 233 additions and 22 deletions
@ -0,0 +1,65 @@ |
|||
<script> |
|||
import { Select, Label, Combobox, Checkbox, Body } from "@budibase/bbui" |
|||
import { onMount } from "svelte" |
|||
import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte" |
|||
import { getAllStateVariables } from "builderStore/dataBinding" |
|||
|
|||
export let parameters |
|||
export let bindings = [] |
|||
|
|||
const keyOptions = getAllStateVariables() |
|||
const typeOptions = [ |
|||
{ |
|||
label: "Set value", |
|||
value: "set", |
|||
}, |
|||
{ |
|||
label: "Delete value", |
|||
value: "delete", |
|||
}, |
|||
] |
|||
|
|||
onMount(() => { |
|||
if (!parameters.type) { |
|||
parameters.type = "set" |
|||
} |
|||
}) |
|||
</script> |
|||
|
|||
<div class="root"> |
|||
<Label small>Type</Label> |
|||
<Select |
|||
placeholder={null} |
|||
bind:value={parameters.type} |
|||
options={typeOptions} |
|||
/> |
|||
<Label small>Key</Label> |
|||
<Combobox bind:value={parameters.key} options={keyOptions} /> |
|||
{#if parameters.type === "set"} |
|||
<Label small>Value</Label> |
|||
<DrawerBindableInput |
|||
{bindings} |
|||
value={parameters.value} |
|||
on:change={e => (parameters.value = e.detail)} |
|||
/> |
|||
<div /> |
|||
<Checkbox bind:value={parameters.persist} text="Persist this value" /> |
|||
<div /> |
|||
<Body size="XS"> |
|||
Persisted values will remain even after reloading the page or closing the |
|||
browser. |
|||
</Body> |
|||
{/if} |
|||
</div> |
|||
|
|||
<style> |
|||
.root { |
|||
display: grid; |
|||
column-gap: var(--spacing-l); |
|||
row-gap: var(--spacing-s); |
|||
grid-template-columns: 60px 1fr; |
|||
align-items: center; |
|||
max-width: 400px; |
|||
margin: 0 auto; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,8 @@ |
|||
<script> |
|||
import Provider from "./Provider.svelte" |
|||
import { stateStore } from "../store" |
|||
</script> |
|||
|
|||
<Provider key="state" data={$stateStore}> |
|||
<slot /> |
|||
</Provider> |
|||
@ -0,0 +1,54 @@ |
|||
import { writable, get, derived } from "svelte/store" |
|||
import { localStorageStore } from "../../../builder/src/builderStore/store/localStorage" |
|||
import { appStore } from "./app" |
|||
|
|||
const createStateStore = () => { |
|||
const localStorageKey = `${get(appStore).appId}.state` |
|||
const persistentStore = localStorageStore(localStorageKey, {}) |
|||
|
|||
// Initialise the temp store to mirror the persistent store
|
|||
const tempStore = writable(get(persistentStore)) |
|||
|
|||
// Sets a value to state, optionally persistent
|
|||
const setValue = (key, value, persist = false) => { |
|||
const storeToSave = persist ? persistentStore : tempStore |
|||
const storeToClear = persist ? tempStore : persistentStore |
|||
storeToSave.update(state => { |
|||
state[key] = value |
|||
return state |
|||
}) |
|||
storeToClear.update(state => { |
|||
delete state[key] |
|||
return state |
|||
}) |
|||
} |
|||
|
|||
// Delete a certain key from both stores
|
|||
const deleteValue = key => { |
|||
const stores = [tempStore, persistentStore] |
|||
stores.forEach(store => { |
|||
store.update(state => { |
|||
delete state[key] |
|||
return state |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
// Derive the combination of both persisted and non persisted stores
|
|||
const store = derived( |
|||
[tempStore, persistentStore], |
|||
([$tempStore, $persistentStore]) => { |
|||
return { |
|||
...$tempStore, |
|||
...$persistentStore, |
|||
} |
|||
} |
|||
) |
|||
|
|||
return { |
|||
subscribe: store.subscribe, |
|||
actions: { setValue, deleteValue }, |
|||
} |
|||
} |
|||
|
|||
export const stateStore = createStateStore() |
|||
Loading…
Reference in new issue