64 lines
1.4 KiB
JavaScript
64 lines
1.4 KiB
JavaScript
import { writable, derived } from "svelte/store"
|
|
import { tables } from "./"
|
|
import { API } from "api"
|
|
|
|
export function createViewsStore() {
|
|
const store = writable({
|
|
selectedViewName: null,
|
|
})
|
|
const derivedStore = derived([store, tables], ([$store, $tables]) => {
|
|
let list = []
|
|
$tables.list?.forEach(table => {
|
|
list = list.concat(Object.values(table?.views || {}))
|
|
})
|
|
return {
|
|
...$store,
|
|
list,
|
|
selected: list.find(view => view.name === $store.selectedViewName),
|
|
}
|
|
})
|
|
|
|
const select = name => {
|
|
store.update(state => ({
|
|
...state,
|
|
selectedViewName: name,
|
|
}))
|
|
}
|
|
|
|
const deleteView = async view => {
|
|
await API.deleteView(view.name)
|
|
|
|
// Update tables
|
|
tables.update(state => {
|
|
const table = state.list.find(table => table._id === view.tableId)
|
|
delete table.views[view.name]
|
|
return { ...state }
|
|
})
|
|
}
|
|
|
|
const save = async view => {
|
|
const savedView = await API.saveView(view)
|
|
|
|
// Update tables
|
|
tables.update(state => {
|
|
const table = state.list.find(table => table._id === view.tableId)
|
|
if (table) {
|
|
if (view.originalName) {
|
|
delete table.views[view.originalName]
|
|
}
|
|
table.views[view.name] = savedView
|
|
}
|
|
return { ...state }
|
|
})
|
|
}
|
|
|
|
return {
|
|
subscribe: derivedStore.subscribe,
|
|
select,
|
|
delete: deleteView,
|
|
save,
|
|
}
|
|
}
|
|
|
|
export const views = createViewsStore()
|