forked from tsai/budibase
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