Merge branch 'develop' into labday/status-banner

This commit is contained in:
Rory Powell 2022-03-09 21:39:30 +00:00
commit b77234b8ce
32 changed files with 2380 additions and 2289 deletions

View File

@ -1,5 +1,5 @@
{ {
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"npmClient": "yarn", "npmClient": "yarn",
"packages": [ "packages": [
"packages/*" "packages/*"

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/backend-core", "name": "@budibase/backend-core",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"description": "Budibase backend core libraries used in server and worker", "description": "Budibase backend core libraries used in server and worker",
"main": "src/index.js", "main": "src/index.js",
"author": "Budibase", "author": "Budibase",

View File

@ -1,7 +1,7 @@
{ {
"name": "@budibase/bbui", "name": "@budibase/bbui",
"description": "A UI solution used in the different Budibase projects.", "description": "A UI solution used in the different Budibase projects.",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"license": "MPL-2.0", "license": "MPL-2.0",
"svelte": "src/index.js", "svelte": "src/index.js",
"module": "dist/bbui.es.js", "module": "dist/bbui.es.js",
@ -38,7 +38,7 @@
], ],
"dependencies": { "dependencies": {
"@adobe/spectrum-css-workflow-icons": "^1.2.1", "@adobe/spectrum-css-workflow-icons": "^1.2.1",
"@budibase/string-templates": "^1.0.81-alpha.0", "@budibase/string-templates": "^1.0.81-alpha.5",
"@spectrum-css/actionbutton": "^1.0.1", "@spectrum-css/actionbutton": "^1.0.1",
"@spectrum-css/actiongroup": "^1.0.1", "@spectrum-css/actiongroup": "^1.0.1",
"@spectrum-css/avatar": "^3.0.2", "@spectrum-css/avatar": "^3.0.2",

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/builder", "name": "@budibase/builder",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"license": "GPL-3.0", "license": "GPL-3.0",
"private": true, "private": true,
"scripts": { "scripts": {
@ -65,10 +65,10 @@
} }
}, },
"dependencies": { "dependencies": {
"@budibase/bbui": "^1.0.81-alpha.0", "@budibase/bbui": "^1.0.81-alpha.5",
"@budibase/client": "^1.0.81-alpha.0", "@budibase/client": "^1.0.81-alpha.5",
"@budibase/frontend-core": "^1.0.81-alpha.0", "@budibase/frontend-core": "^1.0.81-alpha.5",
"@budibase/string-templates": "^1.0.81-alpha.0", "@budibase/string-templates": "^1.0.81-alpha.5",
"@sentry/browser": "5.19.1", "@sentry/browser": "5.19.1",
"@spectrum-css/page": "^3.0.1", "@spectrum-css/page": "^3.0.1",
"@spectrum-css/vars": "^3.0.1", "@spectrum-css/vars": "^3.0.1",

View File

@ -1,10 +1,26 @@
<script> <script>
import { Label, Select, Body } from "@budibase/bbui" import { Label, Select, Body } from "@budibase/bbui"
import { tables } from "stores/backend" import { findAllMatchingComponents } from "builderStore/componentUtils"
import { currentAsset } from "builderStore"
import { onMount } from "svelte" import { onMount } from "svelte"
export let parameters export let parameters
$: tableOptions = $tables.list || []
$: tables = findAllMatchingComponents($currentAsset?.props, component =>
component._component.endsWith("table")
).map(table => ({
label: table._instanceName,
value: table._id,
}))
$: tableBlocks = findAllMatchingComponents($currentAsset?.props, component =>
component._component.endsWith("tableblock")
).map(block => ({
label: block._instanceName,
value: `${block._id}-table`,
}))
$: componentOptions = tables.concat(tableBlocks)
const FORMATS = [ const FORMATS = [
{ {
@ -26,21 +42,20 @@
<div class="root"> <div class="root">
<Body size="S"> <Body size="S">
Choose the table that you would like to export your row selection from. Choose the table component that you would like to export your row selection
from.
<br /> <br />
Please ensure you have enabled row selection in the table settings Please ensure you have enabled row selection in the table settings.
</Body> </Body>
<div class="params"> <div class="params">
<Label small>Table</Label> <Label small>Table</Label>
<Select <Select
bind:value={parameters.tableId} bind:value={parameters.tableComponentId}
options={tableOptions} options={componentOptions}
getOptionLabel={option => option.name}
getOptionValue={option => option._id}
/> />
<Label small>Type</Label> <Label small>Export as</Label>
<Select bind:value={parameters.type} options={FORMATS} /> <Select bind:value={parameters.type} options={FORMATS} />
</div> </div>
</div> </div>
@ -48,7 +63,7 @@
<style> <style>
.root { .root {
width: 100%; width: 100%;
max-width: 800px; max-width: 500px;
margin: 0 auto; margin: 0 auto;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -63,9 +78,9 @@
.params { .params {
display: grid; display: grid;
column-gap: var(--spacing-l); column-gap: var(--spacing-xs);
row-gap: var(--spacing-s); row-gap: var(--spacing-s);
grid-template-columns: 100px 1fr; grid-template-columns: 70px 1fr;
align-items: center; align-items: center;
} }
</style> </style>

View File

@ -14,6 +14,7 @@ export function createTablesStore() {
...state, ...state,
list: tables, list: tables,
})) }))
return tables
} }
async function select(table) { async function select(table) {

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/cli", "name": "@budibase/cli",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"description": "Budibase CLI, for developers, self hosting and migrations.", "description": "Budibase CLI, for developers, self hosting and migrations.",
"main": "src/index.js", "main": "src/index.js",
"bin": { "bin": {

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/client", "name": "@budibase/client",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"license": "MPL-2.0", "license": "MPL-2.0",
"module": "dist/budibase-client.js", "module": "dist/budibase-client.js",
"main": "dist/budibase-client.js", "main": "dist/budibase-client.js",
@ -19,12 +19,26 @@
"dev:builder": "rollup -cw" "dev:builder": "rollup -cw"
}, },
"dependencies": { "dependencies": {
"@budibase/bbui": "^1.0.81-alpha.0", "@budibase/bbui": "^1.0.81-alpha.5",
"@budibase/frontend-core": "^1.0.81-alpha.0", "@budibase/frontend-core": "^1.0.81-alpha.5",
"@budibase/string-templates": "^1.0.81-alpha.0", "@budibase/string-templates": "^1.0.81-alpha.5",
"@spectrum-css/button": "^3.0.3",
"@spectrum-css/card": "^3.0.3",
"@spectrum-css/divider": "^1.0.3",
"@spectrum-css/link": "^3.1.3",
"@spectrum-css/page": "^3.0.1",
"@spectrum-css/tag": "^3.1.4",
"@spectrum-css/typography": "^3.0.2",
"@spectrum-css/vars": "^3.0.1",
"apexcharts": "^3.22.1",
"dayjs": "^1.10.5",
"downloadjs": "1.4.7",
"regexparam": "^1.3.0", "regexparam": "^1.3.0",
"rollup-plugin-polyfill-node": "^0.8.0", "rollup-plugin-polyfill-node": "^0.8.0",
"shortid": "^2.2.15", "shortid": "^2.2.15",
"svelte": "^3.38.2",
"svelte-apexcharts": "^1.0.2",
"svelte-flatpickr": "^3.1.0",
"svelte-spa-router": "^3.0.5" "svelte-spa-router": "^3.0.5"
}, },
"devDependencies": { "devDependencies": {

View File

@ -10,12 +10,12 @@ const createRowSelectionStore = () => {
}) })
} }
function getSelection(tableId) { function getSelection(tableComponentId) {
const selection = get(store) const selection = get(store)
const componentId = Object.keys(selection).find( const componentId = Object.keys(selection).find(
componentId => selection[componentId].tableId === tableId componentId => componentId === tableComponentId
) )
return componentId ? selection[componentId] : {} return selection[componentId] || {}
} }
return { return {

View File

@ -243,7 +243,7 @@ const s3UploadHandler = async action => {
const exportDataHandler = async action => { const exportDataHandler = async action => {
let selection = rowSelectionStore.actions.getSelection( let selection = rowSelectionStore.actions.getSelection(
action.parameters.tableId action.parameters.tableComponentId
) )
if (selection.selectedRows && selection.selectedRows.length > 0) { if (selection.selectedRows && selection.selectedRows.length > 0) {
try { try {

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
{ {
"name": "@budibase/frontend-core", "name": "@budibase/frontend-core",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"description": "Budibase frontend core libraries used in builder and client", "description": "Budibase frontend core libraries used in builder and client",
"author": "Budibase", "author": "Budibase",
"license": "MPL-2.0", "license": "MPL-2.0",
"svelte": "src/index.js", "svelte": "src/index.js",
"dependencies": { "dependencies": {
"@budibase/bbui": "^1.0.81-alpha.0", "@budibase/bbui": "^1.0.81-alpha.5",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"svelte": "^3.46.2" "svelte": "^3.46.2"
} }

View File

@ -1,7 +1,7 @@
{ {
"name": "@budibase/server", "name": "@budibase/server",
"email": "hi@budibase.com", "email": "hi@budibase.com",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"description": "Budibase Web Server", "description": "Budibase Web Server",
"main": "src/index.ts", "main": "src/index.ts",
"repository": { "repository": {
@ -71,9 +71,9 @@
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@apidevtools/swagger-parser": "^10.0.3", "@apidevtools/swagger-parser": "^10.0.3",
"@budibase/backend-core": "^1.0.81-alpha.0", "@budibase/backend-core": "^1.0.81-alpha.5",
"@budibase/client": "^1.0.81-alpha.0", "@budibase/client": "^1.0.81-alpha.5",
"@budibase/string-templates": "^1.0.81-alpha.0", "@budibase/string-templates": "^1.0.81-alpha.5",
"@bull-board/api": "^3.7.0", "@bull-board/api": "^3.7.0",
"@bull-board/koa": "^3.7.0", "@bull-board/koa": "^3.7.0",
"@elastic/elasticsearch": "7.10.0", "@elastic/elasticsearch": "7.10.0",

View File

@ -503,6 +503,71 @@
"data" "data"
] ]
}, },
"applicationSearch": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"description": "The name of the app.",
"type": "string"
},
"url": {
"description": "The URL by which the app is accessed, this must be URL encoded.",
"type": "string"
},
"_id": {
"description": "The ID of the app.",
"type": "string"
},
"status": {
"description": "The status of the app, stating it if is the development or published version.",
"type": "string",
"enum": [
"development",
"published"
]
},
"createdAt": {
"description": "States when the app was created, will be constant. Stored in ISO format.",
"type": "string"
},
"updatedAt": {
"description": "States the last time the app was updated - stored in ISO format.",
"type": "string"
},
"version": {
"description": "States the version of the Budibase client this app is currently based on.",
"type": "string"
},
"tenantId": {
"description": "In a multi-tenant environment this will state the tenant this app is within.",
"type": "string"
},
"lockedBy": {
"description": "The user this app is currently being built by.",
"type": "object"
}
},
"required": [
"_id",
"name",
"url",
"status",
"createdAt",
"updatedAt",
"version"
]
}
}
},
"required": [
"data"
]
},
"row": { "row": {
"description": "The row to be created/updated, based on the table schema.", "description": "The row to be created/updated, based on the table schema.",
"type": "object", "type": "object",
@ -980,6 +1045,221 @@
"data" "data"
] ]
}, },
"tableSearch": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"description": "The table to be created/updated.",
"type": "object",
"required": [
"name",
"schema",
"_id"
],
"properties": {
"name": {
"description": "The name of the table.",
"type": "string"
},
"primaryDisplay": {
"type": "string",
"description": "The name of the column which should be used in relationship tags when relating to this table."
},
"schema": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"link"
],
"description": "A relationship column."
},
"constraints": {
"type": "object",
"description": "A constraint can be applied to the column which will be validated against when a row is saved.",
"properties": {
"type": {
"type": "string",
"enum": [
"string",
"number",
"object",
"boolean"
]
},
"presence": {
"type": "boolean",
"description": "Defines whether the column is required or not."
}
}
},
"name": {
"type": "string",
"description": "The name of the column."
},
"autocolumn": {
"type": "boolean",
"description": "Defines whether the column is automatically generated."
},
"fieldName": {
"type": "string",
"description": "The name of the column which a relationship column is related to in another table."
},
"tableId": {
"type": "string",
"description": "The ID of the table which a relationship column is related to."
},
"relationshipType": {
"type": "string",
"enum": [
"one-to-many",
"many-to-one",
"many-to-many"
],
"description": "Defines the type of relationship that this column will be used for."
},
"through": {
"type": "string",
"description": "When using a SQL table that contains many to many relationships this defines the table the relationships are linked through."
},
"foreignKey": {
"type": "string",
"description": "When using a SQL table that contains a one to many relationship this defines the foreign key."
},
"throughFrom": {
"type": "string",
"description": "When using a SQL table that utilises a through table, this defines the primary key in the through table for this table."
},
"throughTo": {
"type": "string",
"description": "When using a SQL table that utilises a through table, this defines the primary key in the through table for the related table."
}
}
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"formula"
],
"description": "A formula column."
},
"constraints": {
"type": "object",
"description": "A constraint can be applied to the column which will be validated against when a row is saved.",
"properties": {
"type": {
"type": "string",
"enum": [
"string",
"number",
"object",
"boolean"
]
},
"presence": {
"type": "boolean",
"description": "Defines whether the column is required or not."
}
}
},
"name": {
"type": "string",
"description": "The name of the column."
},
"autocolumn": {
"type": "boolean",
"description": "Defines whether the column is automatically generated."
},
"formula": {
"type": "string",
"description": "Defines a Handlebars or JavaScript formula to use, note that Javascript formulas are expected to be provided in the base64 format."
},
"formulaType": {
"type": "string",
"enum": [
"static",
"dynamic"
],
"description": "Defines whether this is a static or dynamic formula."
}
}
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"string",
"longform",
"options",
"number",
"boolean",
"array",
"datetime",
"attachment",
"link",
"formula",
"auto",
"json",
"internal"
],
"description": "Defines the type of the column, most explain themselves, a link column is a relationship."
},
"constraints": {
"type": "object",
"description": "A constraint can be applied to the column which will be validated against when a row is saved.",
"properties": {
"type": {
"type": "string",
"enum": [
"string",
"number",
"object",
"boolean"
]
},
"presence": {
"type": "boolean",
"description": "Defines whether the column is required or not."
}
}
},
"name": {
"type": "string",
"description": "The name of the column."
},
"autocolumn": {
"type": "boolean",
"description": "Defines whether the column is automatically generated."
}
}
}
]
}
},
"_id": {
"description": "The ID of the table.",
"type": "string"
}
}
}
}
},
"required": [
"data"
]
},
"executeQuery": { "executeQuery": {
"description": "The query body must contain the required parameters for the query, this depends on query type, setup and bindings.", "description": "The query body must contain the required parameters for the query, this depends on query type, setup and bindings.",
"type": "object", "type": "object",
@ -1074,6 +1354,71 @@
"_id" "_id"
] ]
}, },
"querySearch": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"_id": {
"description": "The ID of the query.",
"type": "string"
},
"datasourceId": {
"description": "The ID of the data source the query belongs to.",
"type": "string"
},
"parameters": {
"description": "The bindings which are required to perform this query.",
"type": "array",
"items": {
"type": "string"
}
},
"fields": {
"description": "The fields that are used to perform this query, e.g. the sql statement",
"type": "object"
},
"queryVerb": {
"description": "The verb that describes this query.",
"enum": [
"create",
"read",
"update",
"delete"
]
},
"name": {
"description": "The name of the query.",
"type": "string"
},
"schema": {
"description": "The schema of the data returned when the query is executed.",
"type": "object"
},
"transformer": {
"description": "The JavaScript transformer function, applied after the query responds with data.",
"type": "string"
},
"readable": {
"description": "Whether the query has readable data.",
"type": "boolean"
}
},
"required": [
"name",
"schema",
"_id"
]
}
}
},
"required": [
"data"
]
},
"user": { "user": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -1215,6 +1560,86 @@
"data" "data"
] ]
}, },
"userSearch": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"description": "The email address of the user, this must be unique.",
"type": "string"
},
"password": {
"description": "The password of the user if using password based login - this will never be returned. This can be left out of subsequent requests (updates) and will be enriched back into the user structure.",
"type": "string"
},
"status": {
"description": "The status of the user, if they are active.",
"type": "string",
"enum": [
"active"
]
},
"firstName": {
"description": "The first name of the user",
"type": "string"
},
"lastName": {
"description": "The last name of the user",
"type": "string"
},
"forceResetPassword": {
"description": "If set to true forces the user to reset their password on first login.",
"type": "boolean"
},
"builder": {
"description": "Describes if the user is a builder user or not.",
"type": "object",
"properties": {
"global": {
"description": "If set to true the user will be able to build any app in the system.",
"type": "boolean"
}
}
},
"admin": {
"description": "Describes if the user is an admin user or not.",
"type": "object",
"properties": {
"global": {
"description": "If set to true the user will be able to administrate the system.",
"type": "boolean"
}
}
},
"roles": {
"description": "Contains the roles of the user per app (assuming they are not a builder user).",
"type": "object",
"additionalProperties": {
"type": "string",
"description": "A map of app ID (production app ID, minus the _dev component) to a role ID, e.g. ADMIN."
}
},
"_id": {
"description": "The ID of the user.",
"type": "string"
}
},
"required": [
"email",
"roles",
"_id"
]
}
}
},
"required": [
"data"
]
},
"nameSearch": { "nameSearch": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -1399,18 +1824,7 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "object", "$ref": "#/components/schemas/applicationSearch"
"required": [
"data"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/application"
}
}
}
}, },
"examples": { "examples": {
"applications": { "applications": {
@ -1498,18 +1912,7 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "object", "$ref": "#/components/schemas/querySearch"
"required": [
"data"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/query"
}
}
}
}, },
"examples": { "examples": {
"queries": { "queries": {
@ -2025,18 +2428,7 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "object", "$ref": "#/components/schemas/tableSearch"
"required": [
"data"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/table"
}
}
}
}, },
"examples": { "examples": {
"tables": { "tables": {
@ -2203,18 +2595,7 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "object", "$ref": "#/components/schemas/userSearch"
"required": [
"data"
],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/user"
}
}
}
}, },
"examples": { "examples": {
"users": { "users": {

View File

@ -360,6 +360,58 @@ components:
- version - version
required: required:
- data - data
applicationSearch:
type: object
properties:
data:
type: array
items:
type: object
properties:
name:
description: The name of the app.
type: string
url:
description: The URL by which the app is accessed, this must be URL encoded.
type: string
_id:
description: The ID of the app.
type: string
status:
description: The status of the app, stating it if is the development or
published version.
type: string
enum:
- development
- published
createdAt:
description: States when the app was created, will be constant. Stored in ISO
format.
type: string
updatedAt:
description: States the last time the app was updated - stored in ISO format.
type: string
version:
description: States the version of the Budibase client this app is currently
based on.
type: string
tenantId:
description: In a multi-tenant environment this will state the tenant this app
is within.
type: string
lockedBy:
description: The user this app is currently being built by.
type: object
required:
- _id
- name
- url
- status
- createdAt
- updatedAt
- version
required:
- data
row: row:
description: The row to be created/updated, based on the table schema. description: The row to be created/updated, based on the table schema.
type: object type: object
@ -730,6 +782,175 @@ components:
type: string type: string
required: required:
- data - data
tableSearch:
type: object
properties:
data:
type: array
items:
description: The table to be created/updated.
type: object
required:
- name
- schema
- _id
properties:
name:
description: The name of the table.
type: string
primaryDisplay:
type: string
description: The name of the column which should be used in relationship tags
when relating to this table.
schema:
type: object
additionalProperties:
oneOf:
- type: object
properties:
type:
type: string
enum:
- link
description: A relationship column.
constraints:
type: object
description: A constraint can be applied to the column which will be validated
against when a row is saved.
properties:
type:
type: string
enum:
- string
- number
- object
- boolean
presence:
type: boolean
description: Defines whether the column is required or not.
name:
type: string
description: The name of the column.
autocolumn:
type: boolean
description: Defines whether the column is automatically generated.
fieldName:
type: string
description: The name of the column which a relationship column is related to in
another table.
tableId:
type: string
description: The ID of the table which a relationship column is related to.
relationshipType:
type: string
enum:
- one-to-many
- many-to-one
- many-to-many
description: Defines the type of relationship that this column will be used for.
through:
type: string
description: When using a SQL table that contains many to many relationships
this defines the table the relationships are linked
through.
foreignKey:
type: string
description: When using a SQL table that contains a one to many relationship
this defines the foreign key.
throughFrom:
type: string
description: When using a SQL table that utilises a through table, this defines
the primary key in the through table for this table.
throughTo:
type: string
description: When using a SQL table that utilises a through table, this defines
the primary key in the through table for the related
table.
- type: object
properties:
type:
type: string
enum:
- formula
description: A formula column.
constraints:
type: object
description: A constraint can be applied to the column which will be validated
against when a row is saved.
properties:
type:
type: string
enum:
- string
- number
- object
- boolean
presence:
type: boolean
description: Defines whether the column is required or not.
name:
type: string
description: The name of the column.
autocolumn:
type: boolean
description: Defines whether the column is automatically generated.
formula:
type: string
description: Defines a Handlebars or JavaScript formula to use, note that
Javascript formulas are expected to be provided in
the base64 format.
formulaType:
type: string
enum:
- static
- dynamic
description: Defines whether this is a static or dynamic formula.
- type: object
properties:
type:
type: string
enum:
- string
- longform
- options
- number
- boolean
- array
- datetime
- attachment
- link
- formula
- auto
- json
- internal
description: Defines the type of the column, most explain themselves, a link
column is a relationship.
constraints:
type: object
description: A constraint can be applied to the column which will be validated
against when a row is saved.
properties:
type:
type: string
enum:
- string
- number
- object
- boolean
presence:
type: boolean
description: Defines whether the column is required or not.
name:
type: string
description: The name of the column.
autocolumn:
type: boolean
description: Defines whether the column is automatically generated.
_id:
description: The ID of the table.
type: string
required:
- data
executeQuery: executeQuery:
description: The query body must contain the required parameters for the query, description: The query body must contain the required parameters for the query,
this depends on query type, setup and bindings. this depends on query type, setup and bindings.
@ -803,6 +1024,55 @@ components:
- name - name
- schema - schema
- _id - _id
querySearch:
type: object
properties:
data:
type: array
items:
type: object
properties:
_id:
description: The ID of the query.
type: string
datasourceId:
description: The ID of the data source the query belongs to.
type: string
parameters:
description: The bindings which are required to perform this query.
type: array
items:
type: string
fields:
description: The fields that are used to perform this query, e.g. the sql
statement
type: object
queryVerb:
description: The verb that describes this query.
enum:
- create
- read
- update
- delete
name:
description: The name of the query.
type: string
schema:
description: The schema of the data returned when the query is executed.
type: object
transformer:
description: The JavaScript transformer function, applied after the query
responds with data.
type: string
readable:
description: Whether the query has readable data.
type: boolean
required:
- name
- schema
- _id
required:
- data
user: user:
type: object type: object
properties: properties:
@ -916,6 +1186,69 @@ components:
- _id - _id
required: required:
- data - data
userSearch:
type: object
properties:
data:
type: array
items:
type: object
properties:
email:
description: The email address of the user, this must be unique.
type: string
password:
description: The password of the user if using password based login - this will
never be returned. This can be left out of subsequent requests
(updates) and will be enriched back into the user structure.
type: string
status:
description: The status of the user, if they are active.
type: string
enum:
- active
firstName:
description: The first name of the user
type: string
lastName:
description: The last name of the user
type: string
forceResetPassword:
description: If set to true forces the user to reset their password on first
login.
type: boolean
builder:
description: Describes if the user is a builder user or not.
type: object
properties:
global:
description: If set to true the user will be able to build any app in the
system.
type: boolean
admin:
description: Describes if the user is an admin user or not.
type: object
properties:
global:
description: If set to true the user will be able to administrate the system.
type: boolean
roles:
description: Contains the roles of the user per app (assuming they are not a
builder user).
type: object
additionalProperties:
type: string
description: A map of app ID (production app ID, minus the _dev component) to a
role ID, e.g. ADMIN.
_id:
description: The ID of the user.
type: string
required:
- email
- roles
- _id
required:
- data
nameSearch: nameSearch:
type: object type: object
properties: properties:
@ -1028,14 +1361,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
type: object $ref: "#/components/schemas/applicationSearch"
required:
- data
properties:
data:
type: array
items:
$ref: "#/components/schemas/application"
examples: examples:
applications: applications:
$ref: "#/components/examples/applications" $ref: "#/components/examples/applications"
@ -1087,14 +1413,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
type: object $ref: "#/components/schemas/querySearch"
required:
- data
properties:
data:
type: array
items:
$ref: "#/components/schemas/query"
examples: examples:
queries: queries:
$ref: "#/components/examples/queries" $ref: "#/components/examples/queries"
@ -1419,14 +1738,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
type: object $ref: "#/components/schemas/tableSearch"
required:
- data
properties:
data:
type: array
items:
$ref: "#/components/schemas/table"
examples: examples:
tables: tables:
$ref: "#/components/examples/tables" $ref: "#/components/examples/tables"
@ -1524,14 +1836,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
type: object $ref: "#/components/schemas/userSearch"
required:
- data
properties:
data:
type: array
items:
$ref: "#/components/schemas/user"
examples: examples:
users: users:
$ref: "#/components/examples/users" $ref: "#/components/examples/users"

View File

@ -98,4 +98,10 @@ module.exports = new Resource()
applicationOutput: object({ applicationOutput: object({
data: applicationOutputSchema, data: applicationOutputSchema,
}), }),
applicationSearch: object({
data: {
type: "array",
items: applicationOutputSchema,
},
}),
}) })

View File

@ -186,4 +186,10 @@ module.exports = new Resource()
executeQuery: executeQuerySchema, executeQuery: executeQuerySchema,
executeQueryOutput: executeQueryOutputSchema, executeQueryOutput: executeQueryOutputSchema,
query: querySchema, query: querySchema,
querySearch: object({
data: {
type: "array",
items: querySchema,
},
}),
}) })

View File

@ -188,4 +188,10 @@ module.exports = new Resource()
tableOutput: object({ tableOutput: object({
data: tableOutputSchema, data: tableOutputSchema,
}), }),
tableSearch: object({
data: {
type: "array",
items: tableOutputSchema,
},
}),
}) })

View File

@ -123,4 +123,10 @@ module.exports = new Resource()
userOutput: object({ userOutput: object({
data: userOutputSchema, data: userOutputSchema,
}), }),
userSearch: object({
data: {
type: "array",
items: userOutputSchema,
},
}),
}) })

View File

@ -1,6 +1,7 @@
import { default as rowController } from "../row" import { default as rowController } from "../row"
import { addRev } from "./utils" import { addRev } from "./utils"
import { Row } from "../../../definitions/common" import { Row } from "../../../definitions/common"
import { convertBookmark } from "../../../utilities"
// makes sure that the user doesn't need to pass in the type, tableId or _id params for // makes sure that the user doesn't need to pass in the type, tableId or _id params for
// the call to be correct // the call to be correct
@ -30,7 +31,7 @@ export async function search(ctx: any, next: any) {
sort: sort.column, sort: sort.column,
sortType: sort.type, sortType: sort.type,
sortOrder: sort.order, sortOrder: sort.order,
bookmark, bookmark: convertBookmark(bookmark),
paginate, paginate,
limit, limit,
query, query,

View File

@ -33,11 +33,11 @@ exports.handleRequest = handleRequest
exports.patch = async ctx => { exports.patch = async ctx => {
const inputs = ctx.request.body const inputs = ctx.request.body
const tableId = ctx.params.tableId const tableId = ctx.params.tableId
const id = breakRowIdField(inputs._id) const id = inputs._id
// don't save the ID to db // don't save the ID to db
delete inputs._id delete inputs._id
return handleRequest(DataSourceOperation.UPDATE, tableId, { return handleRequest(DataSourceOperation.UPDATE, tableId, {
id, id: breakRowIdField(id),
row: inputs, row: inputs,
}) })
} }
@ -67,7 +67,7 @@ exports.find = async ctx => {
const id = ctx.params.rowId const id = ctx.params.rowId
const tableId = ctx.params.tableId const tableId = ctx.params.tableId
const response = await handleRequest(DataSourceOperation.READ, tableId, { const response = await handleRequest(DataSourceOperation.READ, tableId, {
id, id: breakRowIdField(id),
}) })
return response ? response[0] : response return response ? response[0] : response
} }
@ -76,7 +76,7 @@ exports.destroy = async ctx => {
const tableId = ctx.params.tableId const tableId = ctx.params.tableId
const id = ctx.request.body._id const id = ctx.request.body._id
const { row } = await handleRequest(DataSourceOperation.DELETE, tableId, { const { row } = await handleRequest(DataSourceOperation.DELETE, tableId, {
id, id: breakRowIdField(id),
}) })
return { response: { ok: true }, row } return { response: { ok: true }, row }
} }

View File

@ -135,14 +135,7 @@ read.push(new Endpoint("get", "/applications/:appId", controller.read))
* content: * content:
* application/json: * application/json:
* schema: * schema:
* type: object * $ref: '#/components/schemas/applicationSearch'
* required:
* - data
* properties:
* data:
* type: array
* items:
* $ref: '#/components/schemas/application'
* examples: * examples:
* applications: * applications:
* $ref: '#/components/examples/applications' * $ref: '#/components/examples/applications'

View File

@ -60,14 +60,7 @@ write.push(new Endpoint("post", "/queries/:queryId", controller.execute))
* content: * content:
* application/json: * application/json:
* schema: * schema:
* type: object * $ref: '#/components/schemas/querySearch'
* required:
* - data
* properties:
* data:
* type: array
* items:
* $ref: '#/components/schemas/query'
* examples: * examples:
* queries: * queries:
* $ref: '#/components/examples/queries' * $ref: '#/components/examples/queries'

View File

@ -148,14 +148,7 @@ read.push(new Endpoint("get", "/tables/:tableId", controller.read))
* content: * content:
* application/json: * application/json:
* schema: * schema:
* type: object * $ref: '#/components/schemas/tableSearch'
* required:
* - data
* properties:
* data:
* type: array
* items:
* $ref: '#/components/schemas/table'
* examples: * examples:
* tables: * tables:
* $ref: '#/components/examples/tables' * $ref: '#/components/examples/tables'

View File

@ -123,14 +123,7 @@ read.push(new Endpoint("get", "/users/:userId", controller.read))
* content: * content:
* application/json: * application/json:
* schema: * schema:
* type: object * $ref: '#/components/schemas/userSearch'
* required:
* - data
* properties:
* data:
* type: array
* items:
* $ref: '#/components/schemas/user'
* examples: * examples:
* users: * users:
* $ref: '#/components/examples/users' * $ref: '#/components/examples/users'

View File

@ -95,9 +95,7 @@ export interface paths {
/** Returns the applications that were found based on the search parameters. */ /** Returns the applications that were found based on the search parameters. */
200: { 200: {
content: { content: {
"application/json": { "application/json": components["schemas"]["applicationSearch"]
data: components["schemas"]["application"][]
}
} }
} }
} }
@ -149,9 +147,7 @@ export interface paths {
/** Returns the queries found based on the search parameters. */ /** Returns the queries found based on the search parameters. */
200: { 200: {
content: { content: {
"application/json": { "application/json": components["schemas"]["querySearch"]
data: components["schemas"]["query"][]
}
} }
} }
} }
@ -449,9 +445,7 @@ export interface paths {
/** Returns the found tables, based on the search parameters. */ /** Returns the found tables, based on the search parameters. */
200: { 200: {
content: { content: {
"application/json": { "application/json": components["schemas"]["tableSearch"]
data: components["schemas"]["table"][]
}
} }
} }
} }
@ -541,9 +535,7 @@ export interface paths {
/** Returns the found users based on search parameters. */ /** Returns the found users based on search parameters. */
200: { 200: {
content: { content: {
"application/json": { "application/json": components["schemas"]["userSearch"]
data: components["schemas"]["user"][]
}
} }
} }
} }
@ -589,6 +581,31 @@ export interface components {
lockedBy?: { [key: string]: unknown } lockedBy?: { [key: string]: unknown }
} }
} }
applicationSearch: {
data: {
/** @description The name of the app. */
name: string
/** @description The URL by which the app is accessed, this must be URL encoded. */
url: string
/** @description The ID of the app. */
_id: string
/**
* @description The status of the app, stating it if is the development or published version.
* @enum {string}
*/
status: "development" | "published"
/** @description States when the app was created, will be constant. Stored in ISO format. */
createdAt: string
/** @description States the last time the app was updated - stored in ISO format. */
updatedAt: string
/** @description States the version of the Budibase client this app is currently based on. */
version: string
/** @description In a multi-tenant environment this will state the tenant this app is within. */
tenantId?: string
/** @description The user this app is currently being built by. */
lockedBy?: { [key: string]: unknown }
}[]
}
/** @description The row to be created/updated, based on the table schema. */ /** @description The row to be created/updated, based on the table schema. */
row: { [key: string]: unknown } row: { [key: string]: unknown }
searchOutput: { searchOutput: {
@ -817,6 +834,113 @@ export interface components {
_id: string _id: string
} }
} }
tableSearch: {
data: {
/** @description The name of the table. */
name: string
/** @description The name of the column which should be used in relationship tags when relating to this table. */
primaryDisplay?: string
schema: {
[key: string]:
| {
/**
* @description A relationship column.
* @enum {string}
*/
type?: "link"
/** @description A constraint can be applied to the column which will be validated against when a row is saved. */
constraints?: {
/** @enum {string} */
type?: "string" | "number" | "object" | "boolean"
/** @description Defines whether the column is required or not. */
presence?: boolean
}
/** @description The name of the column. */
name?: string
/** @description Defines whether the column is automatically generated. */
autocolumn?: boolean
/** @description The name of the column which a relationship column is related to in another table. */
fieldName?: string
/** @description The ID of the table which a relationship column is related to. */
tableId?: string
/**
* @description Defines the type of relationship that this column will be used for.
* @enum {string}
*/
relationshipType?:
| "one-to-many"
| "many-to-one"
| "many-to-many"
/** @description When using a SQL table that contains many to many relationships this defines the table the relationships are linked through. */
through?: string
/** @description When using a SQL table that contains a one to many relationship this defines the foreign key. */
foreignKey?: string
/** @description When using a SQL table that utilises a through table, this defines the primary key in the through table for this table. */
throughFrom?: string
/** @description When using a SQL table that utilises a through table, this defines the primary key in the through table for the related table. */
throughTo?: string
}
| {
/**
* @description A formula column.
* @enum {string}
*/
type?: "formula"
/** @description A constraint can be applied to the column which will be validated against when a row is saved. */
constraints?: {
/** @enum {string} */
type?: "string" | "number" | "object" | "boolean"
/** @description Defines whether the column is required or not. */
presence?: boolean
}
/** @description The name of the column. */
name?: string
/** @description Defines whether the column is automatically generated. */
autocolumn?: boolean
/** @description Defines a Handlebars or JavaScript formula to use, note that Javascript formulas are expected to be provided in the base64 format. */
formula?: string
/**
* @description Defines whether this is a static or dynamic formula.
* @enum {string}
*/
formulaType?: "static" | "dynamic"
}
| {
/**
* @description Defines the type of the column, most explain themselves, a link column is a relationship.
* @enum {string}
*/
type?:
| "string"
| "longform"
| "options"
| "number"
| "boolean"
| "array"
| "datetime"
| "attachment"
| "link"
| "formula"
| "auto"
| "json"
| "internal"
/** @description A constraint can be applied to the column which will be validated against when a row is saved. */
constraints?: {
/** @enum {string} */
type?: "string" | "number" | "object" | "boolean"
/** @description Defines whether the column is required or not. */
presence?: boolean
}
/** @description The name of the column. */
name?: string
/** @description Defines whether the column is automatically generated. */
autocolumn?: boolean
}
}
/** @description The ID of the table. */
_id: string
}[]
}
/** @description The query body must contain the required parameters for the query, this depends on query type, setup and bindings. */ /** @description The query body must contain the required parameters for the query, this depends on query type, setup and bindings. */
executeQuery: { [key: string]: unknown } executeQuery: { [key: string]: unknown }
executeQueryOutput: { executeQueryOutput: {
@ -855,6 +979,31 @@ export interface components {
/** @description Whether the query has readable data. */ /** @description Whether the query has readable data. */
readable?: boolean readable?: boolean
} }
querySearch: {
data: {
/** @description The ID of the query. */
_id: string
/** @description The ID of the data source the query belongs to. */
datasourceId?: string
/** @description The bindings which are required to perform this query. */
parameters?: string[]
/** @description The fields that are used to perform this query, e.g. the sql statement */
fields?: { [key: string]: unknown }
/**
* @description The verb that describes this query.
* @enum {undefined}
*/
queryVerb?: "create" | "read" | "update" | "delete"
/** @description The name of the query. */
name: string
/** @description The schema of the data returned when the query is executed. */
schema: { [key: string]: unknown }
/** @description The JavaScript transformer function, applied after the query responds with data. */
transformer?: string
/** @description Whether the query has readable data. */
readable?: boolean
}[]
}
user: { user: {
/** @description The email address of the user, this must be unique. */ /** @description The email address of the user, this must be unique. */
email: string email: string
@ -917,6 +1066,39 @@ export interface components {
_id: string _id: string
} }
} }
userSearch: {
data: {
/** @description The email address of the user, this must be unique. */
email: string
/** @description The password of the user if using password based login - this will never be returned. This can be left out of subsequent requests (updates) and will be enriched back into the user structure. */
password?: string
/**
* @description The status of the user, if they are active.
* @enum {string}
*/
status?: "active"
/** @description The first name of the user */
firstName?: string
/** @description The last name of the user */
lastName?: string
/** @description If set to true forces the user to reset their password on first login. */
forceResetPassword?: boolean
/** @description Describes if the user is a builder user or not. */
builder?: {
/** @description If set to true the user will be able to build any app in the system. */
global?: boolean
}
/** @description Describes if the user is an admin user or not. */
admin?: {
/** @description If set to true the user will be able to administrate the system. */
global?: boolean
}
/** @description Contains the roles of the user per app (assuming they are not a builder user). */
roles: { [key: string]: string }
/** @description The ID of the user. */
_id: string
}[]
}
nameSearch: { nameSearch: {
/** @description The name to be used when searching - this will be used in a case insensitive starts with match. */ /** @description The name to be used when searching - this will be used in a case insensitive starts with match. */
name: string name: string

View File

@ -151,3 +151,11 @@ exports.formatBytes = bytes => {
} }
return `${size.toFixed(size < 10 && unit > 0 ? 1 : 0)}${units[unit]}` return `${size.toFixed(size < 10 && unit > 0 ? 1 : 0)}${units[unit]}`
} }
exports.convertBookmark = bookmark => {
const IS_NUMBER = /^\d+\.?\d*$/
if (typeof bookmark === "string" && bookmark.match(IS_NUMBER)) {
return parseFloat(bookmark)
}
return bookmark
}

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/string-templates", "name": "@budibase/string-templates",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"description": "Handlebars wrapper for Budibase templating.", "description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.cjs", "main": "src/index.cjs",
"module": "dist/bundle.mjs", "module": "dist/bundle.mjs",

View File

@ -1,7 +1,7 @@
{ {
"name": "@budibase/worker", "name": "@budibase/worker",
"email": "hi@budibase.com", "email": "hi@budibase.com",
"version": "1.0.81-alpha.0", "version": "1.0.81-alpha.5",
"description": "Budibase background service", "description": "Budibase background service",
"main": "src/index.ts", "main": "src/index.ts",
"repository": { "repository": {
@ -34,8 +34,8 @@
"author": "Budibase", "author": "Budibase",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@budibase/backend-core": "^1.0.81-alpha.0", "@budibase/backend-core": "^1.0.81-alpha.5",
"@budibase/string-templates": "^1.0.81-alpha.0", "@budibase/string-templates": "^1.0.81-alpha.5",
"@koa/router": "^8.0.0", "@koa/router": "^8.0.0",
"@sentry/node": "^6.0.0", "@sentry/node": "^6.0.0",
"@techpass/passport-openidconnect": "^0.3.0", "@techpass/passport-openidconnect": "^0.3.0",

File diff suppressed because it is too large Load Diff