allow passing of persistance storage opt
This commit is contained in:
parent
3ff2210dd5
commit
28116f135c
|
@ -1,7 +1,21 @@
|
||||||
import { writable, Writable, Readable } from "svelte/store"
|
import { writable, Writable, Readable } from "svelte/store"
|
||||||
|
import {
|
||||||
|
createLocalStorageStore,
|
||||||
|
createSessionStorageStore,
|
||||||
|
} from "@budibase/frontend-core"
|
||||||
|
|
||||||
|
export enum PersistenceType {
|
||||||
|
NONE = "none",
|
||||||
|
LOCAL = "local",
|
||||||
|
SESSION = "session",
|
||||||
|
}
|
||||||
|
|
||||||
interface BudiStoreOpts {
|
interface BudiStoreOpts {
|
||||||
debug?: boolean
|
debug?: boolean
|
||||||
|
persistence?: {
|
||||||
|
type: PersistenceType
|
||||||
|
key: string
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class BudiStore<T> {
|
export class BudiStore<T> {
|
||||||
|
@ -11,7 +25,21 @@ export class BudiStore<T> {
|
||||||
set: Writable<T>["set"]
|
set: Writable<T>["set"]
|
||||||
|
|
||||||
constructor(init: T, opts?: BudiStoreOpts) {
|
constructor(init: T, opts?: BudiStoreOpts) {
|
||||||
this.store = writable<T>(init)
|
if (opts?.persistence) {
|
||||||
|
switch (opts.persistence.type) {
|
||||||
|
case PersistenceType.LOCAL:
|
||||||
|
this.store = createLocalStorageStore(opts.persistence.key, init)
|
||||||
|
break
|
||||||
|
case PersistenceType.SESSION:
|
||||||
|
this.store = createSessionStorageStore(opts.persistence.key, init)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
this.store = writable<T>(init)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.store = writable<T>(init)
|
||||||
|
}
|
||||||
|
|
||||||
this.subscribe = this.store.subscribe
|
this.subscribe = this.store.subscribe
|
||||||
this.update = this.store.update
|
this.update = this.store.update
|
||||||
this.set = this.store.set
|
this.set = this.store.set
|
||||||
|
|
|
@ -1,27 +1,25 @@
|
||||||
import { get } from "svelte/store"
|
import { get } from "svelte/store"
|
||||||
import { createSessionStorageStore } from "@budibase/frontend-core"
|
|
||||||
import { selectedScreen as selectedScreenStore } from "./screens"
|
import { selectedScreen as selectedScreenStore } from "./screens"
|
||||||
import { findComponentPath } from "helpers/components"
|
import { findComponentPath } from "helpers/components"
|
||||||
import { Screen, Component } from "@budibase/types"
|
import { Screen, Component } from "@budibase/types"
|
||||||
import { BudiStore } from "stores/BudiStore"
|
import { BudiStore, PersistenceType } from "stores/BudiStore"
|
||||||
|
|
||||||
interface OpenNodesState {
|
interface OpenNodesState {
|
||||||
[key: string]: boolean
|
[key: string]: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ComponentTreeNodesStore extends BudiStore<OpenNodesState> {
|
export class ComponentTreeNodesStore extends BudiStore<OpenNodesState> {
|
||||||
private baseStore = createSessionStorageStore(
|
|
||||||
"openNodes",
|
|
||||||
{} as OpenNodesState
|
|
||||||
)
|
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super({})
|
super({} as OpenNodesState, {
|
||||||
this.subscribe = this.baseStore.subscribe
|
persistence: {
|
||||||
|
type: PersistenceType.SESSION,
|
||||||
|
key: "openNodes",
|
||||||
|
},
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleNode(componentId: string) {
|
toggleNode(componentId: string) {
|
||||||
this.baseStore.update((openNodes: OpenNodesState) => {
|
this.update((openNodes: OpenNodesState) => {
|
||||||
openNodes[`nodeOpen-${componentId}`] =
|
openNodes[`nodeOpen-${componentId}`] =
|
||||||
!openNodes[`nodeOpen-${componentId}`]
|
!openNodes[`nodeOpen-${componentId}`]
|
||||||
|
|
||||||
|
@ -30,7 +28,7 @@ export class ComponentTreeNodesStore extends BudiStore<OpenNodesState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
expandNodes(componentIds: string[]) {
|
expandNodes(componentIds: string[]) {
|
||||||
this.baseStore.update((openNodes: OpenNodesState) => {
|
this.update((openNodes: OpenNodesState) => {
|
||||||
const newNodes = Object.fromEntries(
|
const newNodes = Object.fromEntries(
|
||||||
componentIds.map(id => [`nodeOpen-${id}`, true])
|
componentIds.map(id => [`nodeOpen-${id}`, true])
|
||||||
)
|
)
|
||||||
|
@ -40,7 +38,7 @@ export class ComponentTreeNodesStore extends BudiStore<OpenNodesState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
collapseNodes(componentIds: string[]) {
|
collapseNodes(componentIds: string[]) {
|
||||||
this.baseStore.update((openNodes: OpenNodesState) => {
|
this.update((openNodes: OpenNodesState) => {
|
||||||
const newNodes = Object.fromEntries(
|
const newNodes = Object.fromEntries(
|
||||||
componentIds.map(id => [`nodeOpen-${id}`, false])
|
componentIds.map(id => [`nodeOpen-${id}`, false])
|
||||||
)
|
)
|
||||||
|
@ -57,7 +55,7 @@ export class ComponentTreeNodesStore extends BudiStore<OpenNodesState> {
|
||||||
|
|
||||||
const componentIds = path.map((component: Component) => component._id)
|
const componentIds = path.map((component: Component) => component._id)
|
||||||
|
|
||||||
this.baseStore.update((openNodes: OpenNodesState) => {
|
this.update((openNodes: OpenNodesState) => {
|
||||||
const newNodes = Object.fromEntries(
|
const newNodes = Object.fromEntries(
|
||||||
componentIds.map((id: string) => [`nodeOpen-${id}`, true])
|
componentIds.map((id: string) => [`nodeOpen-${id}`, true])
|
||||||
)
|
)
|
||||||
|
@ -67,7 +65,7 @@ export class ComponentTreeNodesStore extends BudiStore<OpenNodesState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
isNodeExpanded(componentId: string): boolean {
|
isNodeExpanded(componentId: string): boolean {
|
||||||
const openNodes = get(this.baseStore)
|
const openNodes = get(this)
|
||||||
return !!openNodes[`nodeOpen-${componentId}`]
|
return !!openNodes[`nodeOpen-${componentId}`]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue