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

View File

@ -1,7 +1,10 @@
import { cloneDeep } from "lodash/fp"
import { get } from "svelte/store"
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 { makePropSafe } from "@budibase/string-templates"
import { TableNames } from "../constants"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,121 +1,121 @@
import { writable, get } from "svelte/store"
import { views } from './'
import { views } from "./"
import { cloneDeep } from "lodash/fp"
import api from "../../api"
function createTablesStore() {
const store = writable({
list: [],
selected: {},
draft: {},
list: [],
selected: {},
draft: {},
})
const { subscribe, update, set } = store
const { subscribe, update, set } = store
async function fetch() {
const tablesResponse = await api.get(`/api/tables`)
const tables = await tablesResponse.json()
update(state => ({...state, list: tables}))
async function fetch() {
const tablesResponse = await api.get(`/api/tables`)
const tables = await tablesResponse.json()
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) {
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())
}
const response = await api.post(`/api/tables`, updatedTable)
const savedTable = await response.json()
await fetch()
await select(savedTable)
return savedTable
}
const response = await api.post(`/api/tables`, updatedTable)
const savedTable = await response.json()
await fetch()
await select(savedTable)
return savedTable
}
return {
subscribe,
set,
fetch,
select,
save,
save,
delete: async table => {
await api.delete(`/api/tables/${table._id}/${table._rev}`)
update(state => ({
...state,
list: state.list.filter(existing => existing._id !== table._id),
selected: {}
}))
await api.delete(`/api/tables/${table._id}/${table._rev}`)
update(state => ({
...state,
list: state.list.filter(existing => existing._id !== table._id),
selected: {},
}))
},
saveField: ({ originalName, field, primaryDisplay = false, indexes }) => {
update(state => {
update(state => {
// delete the original if renaming
// need to handle if the column had no name, empty string
if (originalName || originalName === "") {
delete state.draft.schema[originalName]
state.draft._rename = {
delete state.draft.schema[originalName]
state.draft._rename = {
old: originalName,
updated: field.name,
}
}
}
// Optionally set display column
if (primaryDisplay) {
state.draft.primaryDisplay = field.name
state.draft.primaryDisplay = field.name
}
if (indexes) {
state.draft.indexes = indexes
state.draft.indexes = indexes
}
state.draft.schema[field.name] = cloneDeep(field)
save(state.draft)
return state
})
})
},
deleteField: field => {
update(state => {
delete state.draft.schema[field.name]
save(state.draft)
return state
})
update(state => {
delete state.draft.schema[field.name]
save(state.draft)
return state
})
},
}
}

View File

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

View File

@ -9,7 +9,13 @@ import {
selectedAccessRole,
} from "builderStore"
// 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 api from "../api"
@ -61,7 +67,12 @@ export const getFrontendStore = () => {
await hostingStore.actions.fetch()
// 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/integrations").then(r => r.json()),
api.get(`/api/queries`).then(r => r.json()),
@ -74,9 +85,8 @@ export const getFrontendStore = () => {
tables.set({
list: _tables,
selected: {},
draft: {}
draft: {},
})
},
routing: {
fetch: async () => {