This commit is contained in:
Keviin Åberg Kultalahti 2021-03-23 13:31:18 +01:00
parent 8f0324bd53
commit 976d8b3b54
10 changed files with 134 additions and 125 deletions

View File

@ -1,7 +1,10 @@
import { cloneDeep } from "lodash/fp" import { cloneDeep } from "lodash/fp"
import { get } from "svelte/store" import { get } from "svelte/store"
import { store } from "builderStore" import { store } from "builderStore"
import { tables as tablesStore, queries as queriesStores } from 'builderStore/store/backend/' import {
tables as tablesStore,
queries as queriesStores,
} from "builderStore/store/backend/"
import { findComponentPath } from "./storeUtils" import { findComponentPath } from "./storeUtils"
import { makePropSafe } from "@budibase/string-templates" import { makePropSafe } from "@budibase/string-templates"
import { TableNames } from "../constants" import { TableNames } from "../constants"

View File

@ -1,7 +1,6 @@
import { writable } from "svelte/store" import { writable } from "svelte/store"
const INITIAL_BACKEND_UI_STATE = { const INITIAL_BACKEND_UI_STATE = {}
}
export const getBackendUiStore = () => { export const getBackendUiStore = () => {
const store = writable({ ...INITIAL_BACKEND_UI_STATE }) const store = writable({ ...INITIAL_BACKEND_UI_STATE })

View File

@ -1,3 +1,3 @@
import { writable } from "svelte/store" import { writable } from "svelte/store"
export const database = writable({}) export const database = writable({})

View File

@ -20,7 +20,7 @@ function createDatasourcesStore() {
}, },
select: async datasourceId => { select: async datasourceId => {
update(state => ({ ...state, selected: datasourceId })) update(state => ({ ...state, selected: datasourceId }))
queries.update(state => ({...state, selected: null})) queries.update(state => ({ ...state, selected: null }))
}, },
save: async datasource => { save: async datasource => {
const response = await api.post("/api/datasources", datasource) const response = await api.post("/api/datasources", datasource)

View File

@ -1,9 +1,9 @@
import { writable } from "svelte/store" import { writable, get } from "svelte/store"
import { datasources, integrations } from "./" import { datasources, integrations } from "./"
import api from "../../api" import api from "../../api"
function createQueriesStore() { function createQueriesStore() {
const { subscribe, set, update } = writable({list: [], selected: null}) const { subscribe, set, update } = writable({ list: [], selected: null })
return { return {
subscribe, subscribe,
@ -12,7 +12,7 @@ function createQueriesStore() {
fetch: async () => { fetch: async () => {
const response = await api.get(`/api/queries`) const response = await api.get(`/api/queries`)
const json = await response.json() const json = await response.json()
update(state => ({...state, list: json})) update(state => ({ ...state, list: json }))
return json return json
}, },
save: async (datasourceId, query) => { save: async (datasourceId, query) => {
@ -44,7 +44,7 @@ function createQueriesStore() {
} else { } else {
queries.push(json) queries.push(json)
} }
return { list: queries, selected: json._id} return { list: queries, selected: json._id }
}) })
return json return json
}, },
@ -55,9 +55,7 @@ function createQueriesStore() {
delete: async query => { delete: async query => {
await api.delete(`/api/queries/${query._id}/${query._rev}`) await api.delete(`/api/queries/${query._id}/${query._rev}`)
update(state => { update(state => {
state.list = state.list.filter( state.list = state.list.filter(existing => existing._id !== query._id)
existing => existing._id !== query._id
)
if (state.selected === query._id) { if (state.selected === query._id) {
state.selected = null state.selected = null
} }

View File

@ -23,8 +23,8 @@ function createRolesStore() {
} }
async function getRoles() { async function getRoles() {
const response = await api.get("/api/roles") const response = await api.get("/api/roles")
return await response.json() return await response.json()
} }
export const roles = createRolesStore() export const roles = createRolesStore()

View File

@ -1,5 +1,5 @@
import { writable,get } from "svelte/store" import { writable, get } from "svelte/store"
import { views } from './' import { views } from "./"
function createRowsStore() { function createRowsStore() {
const { subscribe } = writable([]) const { subscribe } = writable([])
@ -12,4 +12,3 @@ function createRowsStore() {
} }
export const rows = createRowsStore() export const rows = createRowsStore()

View File

@ -1,121 +1,121 @@
import { writable, get } from "svelte/store" import { writable, get } from "svelte/store"
import { views } from './' import { views } from "./"
import { cloneDeep } from "lodash/fp" import { cloneDeep } from "lodash/fp"
import api from "../../api" import api from "../../api"
function createTablesStore() { function createTablesStore() {
const store = writable({ const store = writable({
list: [], list: [],
selected: {}, selected: {},
draft: {}, draft: {},
}) })
const { subscribe, update, set } = store const { subscribe, update, set } = store
async function fetch() { async function fetch() {
const tablesResponse = await api.get(`/api/tables`) const tablesResponse = await api.get(`/api/tables`)
const tables = await tablesResponse.json() const tables = await tablesResponse.json()
update(state => ({...state, list: tables})) update(state => ({ ...state, list: tables }))
}
async function select(table) {
if (!table) {
console.log("Setting selected to null")
update(state => ({
...state,
selected: {},
}))
} else {
console.log("Setting selected to null")
update(state => ({
...state,
selected: table,
draft: cloneDeep(table),
}))
views.select({ name: `all_${table._id}` })
}
}
async function save(table) {
const updatedTable = cloneDeep(table)
const oldTable = get(store).list.filter(t => t._id === table._id)[0]
const fieldNames = []
// update any renamed schema keys to reflect their names
for (let key of Object.keys(updatedTable.schema)) {
// if field name has been seen before remove it
if (fieldNames.indexOf(key.toLowerCase()) !== -1) {
delete updatedTable.schema[key]
continue
}
const field = updatedTable.schema[key]
const oldField = oldTable?.schema[key]
// if the type has changed then revert back to the old field
if (oldField != null && oldField?.type !== field.type) {
updatedTable.schema[key] = oldField
}
// field has been renamed
if (field.name && field.name !== key) {
updatedTable.schema[field.name] = field
updatedTable._rename = { old: key, updated: field.name }
delete updatedTable.schema[key]
}
// finally record this field has been used
fieldNames.push(key.toLowerCase())
} }
async function select(table) { const response = await api.post(`/api/tables`, updatedTable)
if (!table) { const savedTable = await response.json()
console.log('Setting selected to null') await fetch()
update(state => ({ await select(savedTable)
...state, return savedTable
selected: {} }
}))
} else {
console.log('Setting selected to null')
update(state => ({
...state,
selected: table,
draft: cloneDeep(table),
}))
views.select({ name: `all_${table._id}` })
}
}
async function save(table) {
const updatedTable = cloneDeep(table)
const oldTable = get(store).list.filter(t => t._id === table._id)[0]
const fieldNames = []
// update any renamed schema keys to reflect their names
for (let key of Object.keys(updatedTable.schema)) {
// if field name has been seen before remove it
if (fieldNames.indexOf(key.toLowerCase()) !== -1) {
delete updatedTable.schema[key]
continue
}
const field = updatedTable.schema[key]
const oldField = oldTable?.schema[key]
// if the type has changed then revert back to the old field
if (oldField != null && oldField?.type !== field.type) {
updatedTable.schema[key] = oldField
}
// field has been renamed
if (field.name && field.name !== key) {
updatedTable.schema[field.name] = field
updatedTable._rename = { old: key, updated: field.name }
delete updatedTable.schema[key]
}
// finally record this field has been used
fieldNames.push(key.toLowerCase())
}
const response = await api.post(`/api/tables`, updatedTable)
const savedTable = await response.json()
await fetch()
await select(savedTable)
return savedTable
}
return { return {
subscribe, subscribe,
set, set,
fetch, fetch,
select, select,
save, save,
delete: async table => { delete: async table => {
await api.delete(`/api/tables/${table._id}/${table._rev}`) await api.delete(`/api/tables/${table._id}/${table._rev}`)
update(state => ({ update(state => ({
...state, ...state,
list: state.list.filter(existing => existing._id !== table._id), list: state.list.filter(existing => existing._id !== table._id),
selected: {} selected: {},
})) }))
}, },
saveField: ({ originalName, field, primaryDisplay = false, indexes }) => { saveField: ({ originalName, field, primaryDisplay = false, indexes }) => {
update(state => { update(state => {
// delete the original if renaming // delete the original if renaming
// need to handle if the column had no name, empty string // need to handle if the column had no name, empty string
if (originalName || originalName === "") { if (originalName || originalName === "") {
delete state.draft.schema[originalName] delete state.draft.schema[originalName]
state.draft._rename = { state.draft._rename = {
old: originalName, old: originalName,
updated: field.name, updated: field.name,
} }
} }
// Optionally set display column // Optionally set display column
if (primaryDisplay) { if (primaryDisplay) {
state.draft.primaryDisplay = field.name state.draft.primaryDisplay = field.name
} }
if (indexes) { if (indexes) {
state.draft.indexes = indexes state.draft.indexes = indexes
} }
state.draft.schema[field.name] = cloneDeep(field) state.draft.schema[field.name] = cloneDeep(field)
save(state.draft) save(state.draft)
return state return state
}) })
}, },
deleteField: field => { deleteField: field => {
update(state => { update(state => {
delete state.draft.schema[field.name] delete state.draft.schema[field.name]
save(state.draft) save(state.draft)
return state return state
}) })
}, },
} }
} }

View File

@ -4,43 +4,43 @@ import api from "../../api"
function createViewsStore() { function createViewsStore() {
const { subscribe, update } = writable({ const { subscribe, update } = writable({
list: [], list: [],
selected: null selected: null,
}) })
return { return {
subscribe, subscribe,
select: view => { select: view => {
update(state => ({ update(state => ({
...state, ...state,
selected: view, selected: view,
})) }))
}, },
delete: async view => { delete: async view => {
await api.delete(`/api/views/${view}`) await api.delete(`/api/views/${view}`)
await tables.fetch() await tables.fetch()
}, },
save: async view => { save: async view => {
const response = await api.post(`/api/views`, view) const response = await api.post(`/api/views`, view)
const json = await response.json() const json = await response.json()
const viewMeta = { const viewMeta = {
name: view.name, name: view.name,
...json, ...json,
} }
update(state => { update(state => {
const viewTable = get(tables).list.find( const viewTable = get(tables).list.find(
table => table._id === view.tableId table => table._id === view.tableId
) )
if (view.originalName) delete viewTable.views[view.originalName] if (view.originalName) delete viewTable.views[view.originalName]
viewTable.views[view.name] = viewMeta viewTable.views[view.name] = viewMeta
state.tables = state.tables state.tables = state.tables
state.selectedView = viewMeta state.selectedView = viewMeta
return state return state
}) })
}, },
} }
} }

View File

@ -9,7 +9,13 @@ import {
selectedAccessRole, selectedAccessRole,
} from "builderStore" } from "builderStore"
// Backendstores // Backendstores
import { datasources, integrations, queries, database, tables } from 'builderStore/store/backend/' import {
datasources,
integrations,
queries,
database,
tables,
} from "builderStore/store/backend/"
import { fetchComponentLibDefinitions } from "../loadComponentLibraries" import { fetchComponentLibDefinitions } from "../loadComponentLibraries"
import api from "../api" import api from "../api"
@ -61,7 +67,12 @@ export const getFrontendStore = () => {
await hostingStore.actions.fetch() await hostingStore.actions.fetch()
// Initialise backend stores // Initialise backend stores
const [_datasources, _integrations, _queries, _tables] = await Promise.all([ const [
_datasources,
_integrations,
_queries,
_tables,
] = await Promise.all([
api.get(`/api/datasources`).then(r => r.json()), api.get(`/api/datasources`).then(r => r.json()),
api.get("/api/integrations").then(r => r.json()), api.get("/api/integrations").then(r => r.json()),
api.get(`/api/queries`).then(r => r.json()), api.get(`/api/queries`).then(r => r.json()),
@ -74,9 +85,8 @@ export const getFrontendStore = () => {
tables.set({ tables.set({
list: _tables, list: _tables,
selected: {}, selected: {},
draft: {} draft: {},
}) })
}, },
routing: { routing: {
fetch: async () => { fetch: async () => {