Merge branch 'next' of github.com:Budibase/budibase into user-app-list
This commit is contained in:
commit
d62280ae83
|
@ -12,6 +12,7 @@
|
||||||
${weight ? `font-weight:${weight};` : ""}
|
${weight ? `font-weight:${weight};` : ""}
|
||||||
${textAlign ? `text-align:${textAlign};` : ""}
|
${textAlign ? `text-align:${textAlign};` : ""}
|
||||||
`}
|
`}
|
||||||
|
class:noPadding
|
||||||
class="spectrum-Body spectrum-Body--size{size}"
|
class="spectrum-Body spectrum-Body--size{size}"
|
||||||
class:spectrum-Body--serif={serif}
|
class:spectrum-Body--serif={serif}
|
||||||
>
|
>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Select, Label } from "@budibase/bbui"
|
import { Select } from "@budibase/bbui"
|
||||||
import { notifications } from "@budibase/bbui"
|
import { notifications } from "@budibase/bbui"
|
||||||
import { FIELDS } from "constants/backend"
|
import { FIELDS } from "constants/backend"
|
||||||
import api from "builderStore/api"
|
import api from "builderStore/api"
|
||||||
|
@ -99,15 +99,19 @@
|
||||||
const typeOptions = [
|
const typeOptions = [
|
||||||
{
|
{
|
||||||
label: "Text",
|
label: "Text",
|
||||||
value: "string",
|
value: FIELDS.STRING.type,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Number",
|
label: "Number",
|
||||||
value: "number",
|
value: FIELDS.NUMBER.type,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Date",
|
label: "Date",
|
||||||
value: "datetime",
|
value: FIELDS.DATETIME.type,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Options",
|
||||||
|
value: FIELDS.OPTIONS.type,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -3,7 +3,14 @@
|
||||||
import { store } from "builderStore"
|
import { store } from "builderStore"
|
||||||
import { tables } from "stores/backend"
|
import { tables } from "stores/backend"
|
||||||
import { notifications } from "@budibase/bbui"
|
import { notifications } from "@budibase/bbui"
|
||||||
import { Input, Label, ModalContent, Toggle, Divider } from "@budibase/bbui"
|
import {
|
||||||
|
Input,
|
||||||
|
Label,
|
||||||
|
ModalContent,
|
||||||
|
Toggle,
|
||||||
|
Divider,
|
||||||
|
Layout,
|
||||||
|
} from "@budibase/bbui"
|
||||||
import TableDataImport from "../TableDataImport.svelte"
|
import TableDataImport from "../TableDataImport.svelte"
|
||||||
import analytics from "analytics"
|
import analytics from "analytics"
|
||||||
import screenTemplates from "builderStore/store/screenTemplates"
|
import screenTemplates from "builderStore/store/screenTemplates"
|
||||||
|
@ -123,8 +130,10 @@
|
||||||
bind:value={createAutoscreens}
|
bind:value={createAutoscreens}
|
||||||
/>
|
/>
|
||||||
<div>
|
<div>
|
||||||
<Label grey extraSmall>Create Table from CSV (Optional)</Label>
|
<Layout gap="XS" noPadding>
|
||||||
<TableDataImport bind:dataImport />
|
<Label grey extraSmall>Create Table from CSV (Optional)</Label>
|
||||||
|
<TableDataImport bind:dataImport />
|
||||||
|
</Layout>
|
||||||
</div>
|
</div>
|
||||||
</ModalContent>
|
</ModalContent>
|
||||||
|
|
||||||
|
|
|
@ -214,7 +214,7 @@ exports.create = async function (ctx) {
|
||||||
exports.update = async function (ctx) {
|
exports.update = async function (ctx) {
|
||||||
const url = await getAppUrlIfNotInUse(ctx)
|
const url = await getAppUrlIfNotInUse(ctx)
|
||||||
const db = new CouchDB(ctx.params.appId)
|
const db = new CouchDB(ctx.params.appId)
|
||||||
const application = await db.get(ctx.params.appId)
|
const application = await db.get(DocumentTypes.APP_METADATA)
|
||||||
|
|
||||||
const data = ctx.request.body
|
const data = ctx.request.body
|
||||||
const newData = { ...application, ...data, url }
|
const newData = { ...application, ...data, url }
|
||||||
|
@ -235,7 +235,7 @@ exports.update = async function (ctx) {
|
||||||
|
|
||||||
exports.delete = async function (ctx) {
|
exports.delete = async function (ctx) {
|
||||||
const db = new CouchDB(ctx.params.appId)
|
const db = new CouchDB(ctx.params.appId)
|
||||||
const app = await db.get(ctx.params.appId)
|
const app = await db.get(DocumentTypes.APP_METADATA)
|
||||||
const result = await db.destroy()
|
const result = await db.destroy()
|
||||||
/* istanbul ignore next */
|
/* istanbul ignore next */
|
||||||
if (!env.isTest()) {
|
if (!env.isTest()) {
|
||||||
|
|
|
@ -6,7 +6,7 @@ const {
|
||||||
InternalTables,
|
InternalTables,
|
||||||
} = require("../../../db/utils")
|
} = require("../../../db/utils")
|
||||||
const { isEqual } = require("lodash/fp")
|
const { isEqual } = require("lodash/fp")
|
||||||
const { AutoFieldSubTypes } = require("../../../constants")
|
const { AutoFieldSubTypes, FieldTypes } = require("../../../constants")
|
||||||
const { inputProcessing } = require("../../../utilities/rowProcessor")
|
const { inputProcessing } = require("../../../utilities/rowProcessor")
|
||||||
const { USERS_TABLE_SCHEMA } = require("../../../constants")
|
const { USERS_TABLE_SCHEMA } = require("../../../constants")
|
||||||
|
|
||||||
|
@ -72,18 +72,21 @@ exports.handleDataImport = async (appId, user, table, dataImport) => {
|
||||||
row._id = generateRowID(table._id)
|
row._id = generateRowID(table._id)
|
||||||
row.tableId = table._id
|
row.tableId = table._id
|
||||||
const processed = inputProcessing(user, table, row)
|
const processed = inputProcessing(user, table, row)
|
||||||
|
table = processed.table
|
||||||
row = processed.row
|
row = processed.row
|
||||||
// these auto-fields will never actually link anywhere (always builder)
|
|
||||||
for (let [fieldName, schema] of Object.entries(table.schema)) {
|
for (let [fieldName, schema] of Object.entries(table.schema)) {
|
||||||
|
// check whether the options need to be updated for inclusion as part of the data import
|
||||||
if (
|
if (
|
||||||
schema.autocolumn &&
|
schema.type === FieldTypes.OPTIONS &&
|
||||||
(schema.subtype === AutoFieldSubTypes.CREATED_BY ||
|
(!schema.constraints.inclusion ||
|
||||||
schema.subtype === AutoFieldSubTypes.UPDATED_BY)
|
schema.constraints.inclusion.indexOf(row[fieldName]) === -1)
|
||||||
) {
|
) {
|
||||||
delete row[fieldName]
|
schema.constraints.inclusion = [
|
||||||
|
...schema.constraints.inclusion,
|
||||||
|
row[fieldName],
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
table = processed.table
|
|
||||||
data[i] = row
|
data[i] = row
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -304,24 +304,6 @@ describe("/rows", () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("search", () => {
|
|
||||||
it("should run a search on the table", async () => {
|
|
||||||
const res = await request
|
|
||||||
.post(`/api/${table._id}/rows/search`)
|
|
||||||
.send({
|
|
||||||
query: {
|
|
||||||
name: "Test",
|
|
||||||
},
|
|
||||||
pagination: { pageSize: 25 }
|
|
||||||
})
|
|
||||||
.set(config.defaultHeaders())
|
|
||||||
.expect('Content-Type', /json/)
|
|
||||||
.expect(200)
|
|
||||||
expect(res.body.rows.length).toEqual(1)
|
|
||||||
expect(res.body.bookmark).toBeDefined()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe("fetchView", () => {
|
describe("fetchView", () => {
|
||||||
it("should be able to fetch tables contents via 'view'", async () => {
|
it("should be able to fetch tables contents via 'view'", async () => {
|
||||||
const row = await config.createRow()
|
const row = await config.createRow()
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
const csv = require("csvtojson")
|
const csv = require("csvtojson")
|
||||||
|
const { FieldTypes } = require("../constants")
|
||||||
|
|
||||||
const VALIDATORS = {
|
const VALIDATORS = {
|
||||||
string: () => true,
|
[FieldTypes.STRING]: () => true,
|
||||||
number: attribute => !isNaN(Number(attribute)),
|
[FieldTypes.OPTIONS]: () => true,
|
||||||
datetime: attribute => !isNaN(new Date(attribute).getTime()),
|
[FieldTypes.NUMBER]: attribute => !isNaN(Number(attribute)),
|
||||||
|
[FieldTypes.DATETIME]: attribute => !isNaN(new Date(attribute).getTime()),
|
||||||
}
|
}
|
||||||
|
|
||||||
const PARSERS = {
|
const PARSERS = {
|
||||||
number: attribute => Number(attribute),
|
[FieldTypes.NUMBER]: attribute => Number(attribute),
|
||||||
datetime: attribute => new Date(attribute).toISOString(),
|
[FieldTypes.DATETIME]: attribute => new Date(attribute).toISOString(),
|
||||||
}
|
}
|
||||||
|
|
||||||
function parse(csvString, parsers) {
|
function parse(csvString, parsers) {
|
||||||
|
|
Loading…
Reference in New Issue