-
$goto(`/settings`)}>
-
-
+
diff --git a/packages/builder/src/pages/[application]/backend/database/_layout.svelte b/packages/builder/src/pages/[application]/backend/database/_layout.svelte
deleted file mode 100644
index 94453e3943..0000000000
--- a/packages/builder/src/pages/[application]/backend/database/_layout.svelte
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
diff --git a/packages/builder/src/pages/[application]/backend/database/index.svelte b/packages/builder/src/pages/[application]/backend/database/index.svelte
deleted file mode 100644
index 09c7c773f8..0000000000
--- a/packages/builder/src/pages/[application]/backend/database/index.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-Please select a database
diff --git a/packages/builder/src/pages/[application]/backend/index.svelte b/packages/builder/src/pages/[application]/backend/index.svelte
index 82c0f9e069..488c67ff0e 100644
--- a/packages/builder/src/pages/[application]/backend/index.svelte
+++ b/packages/builder/src/pages/[application]/backend/index.svelte
@@ -1,6 +1,6 @@
diff --git a/packages/builder/src/pages/[application]/backend/model/[selectedModel]/_layout.svelte b/packages/builder/src/pages/[application]/backend/model/[selectedModel]/_layout.svelte
new file mode 100644
index 0000000000..a3ce7c6bf9
--- /dev/null
+++ b/packages/builder/src/pages/[application]/backend/model/[selectedModel]/_layout.svelte
@@ -0,0 +1,14 @@
+
+
+
diff --git a/packages/builder/src/pages/[application]/backend/database/[selectedDatabase]/index.svelte b/packages/builder/src/pages/[application]/backend/model/[selectedModel]/index.svelte
similarity index 95%
rename from packages/builder/src/pages/[application]/backend/database/[selectedDatabase]/index.svelte
rename to packages/builder/src/pages/[application]/backend/model/[selectedModel]/index.svelte
index a9f5589caf..232a569caa 100644
--- a/packages/builder/src/pages/[application]/backend/database/[selectedDatabase]/index.svelte
+++ b/packages/builder/src/pages/[application]/backend/model/[selectedModel]/index.svelte
@@ -3,7 +3,7 @@
import { Button } from "@budibase/bbui"
import EmptyModel from "components/nav/ModelNavigator/EmptyModel.svelte"
import ModelDataTable from "components/database/ModelDataTable"
- import { store, backendUiStore } from "builderStore"
+ import { backendUiStore } from "builderStore"
import ActionButton from "components/common/ActionButton.svelte"
import * as api from "components/database/ModelDataTable/api"
import { CreateEditRecordModal } from "components/database/ModelDataTable/modals"
diff --git a/packages/builder/src/pages/[application]/backend/model/_layout.svelte b/packages/builder/src/pages/[application]/backend/model/_layout.svelte
new file mode 100644
index 0000000000..ee17644f3a
--- /dev/null
+++ b/packages/builder/src/pages/[application]/backend/model/_layout.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+
diff --git a/packages/builder/src/pages/[application]/backend/model/index.svelte b/packages/builder/src/pages/[application]/backend/model/index.svelte
new file mode 100644
index 0000000000..15a08b1d09
--- /dev/null
+++ b/packages/builder/src/pages/[application]/backend/model/index.svelte
@@ -0,0 +1,24 @@
+
+
+{#if $backendUiStore.models.length === 0}
+Please create a model
+{:else}
+Please select a model
+{/if}
diff --git a/packages/builder/src/pages/[application]/frontend/[page]/[screen]/_layout.svelte b/packages/builder/src/pages/[application]/frontend/[page]/[screen]/_layout.svelte
index 8dcdc0ed41..f35626a1f5 100644
--- a/packages/builder/src/pages/[application]/frontend/[page]/[screen]/_layout.svelte
+++ b/packages/builder/src/pages/[application]/frontend/[page]/[screen]/_layout.svelte
@@ -14,7 +14,7 @@
if ($leftover) {
// Get the correct screen children.
const screenChildren = $store.pages[$params.page]._screens.find(
- screen => screen.name === $params.screen
+ screen => screen.props._instanceName === $params.screen
).props._children
findComponent(componentIds, screenChildren)
}
diff --git a/packages/builder/src/pages/[application]/frontend/_layout.svelte b/packages/builder/src/pages/[application]/frontend/_layout.svelte
index 87b064addf..d0569fc7c8 100644
--- a/packages/builder/src/pages/[application]/frontend/_layout.svelte
+++ b/packages/builder/src/pages/[application]/frontend/_layout.svelte
@@ -88,7 +88,6 @@
padding: 0;
display: flex;
flex-direction: column;
- z-index: 5;
}
.preview-pane {
diff --git a/packages/client/src/render/screenRouter.js b/packages/client/src/render/screenRouter.js
index fb0b005096..4f4256f9fe 100644
--- a/packages/client/src/render/screenRouter.js
+++ b/packages/client/src/render/screenRouter.js
@@ -56,13 +56,13 @@ export const screenRouter = ({ screens, onScreenSelected, window }) => {
const screenIndex = current !== -1 ? current : fallback
- onScreenSelected(screens[screenIndex], _url)
-
try {
!url.state && history.pushState(_url, null, _url)
} catch (_) {
// ignoring an exception here as the builder runs an iframe, which does not like this
}
+
+ onScreenSelected(screens[screenIndex], _url)
}
function click(e) {
diff --git a/packages/client/src/state/stateManager.js b/packages/client/src/state/stateManager.js
index 5c5f198956..ac417f32fa 100644
--- a/packages/client/src/state/stateManager.js
+++ b/packages/client/src/state/stateManager.js
@@ -59,7 +59,7 @@ const _setup = ({ handlerTypes, getCurrentState, bb, store }) => node => {
const propValue = props[propName]
// A little bit of a hack - won't bind if the string doesn't start with {{
- const isBound = typeof propValue === "string" && propValue.startsWith("{{")
+ const isBound = typeof propValue === "string" && propValue.includes("{{")
if (isBound) {
initialProps[propName] = mustache.render(propValue, {
diff --git a/packages/server/src/api/controllers/user.js b/packages/server/src/api/controllers/user.js
index 7805ad251d..d4525974f9 100644
--- a/packages/server/src/api/controllers/user.js
+++ b/packages/server/src/api/controllers/user.js
@@ -63,7 +63,19 @@ exports.create = async function(ctx) {
}
}
-exports.update = async function() {}
+exports.update = async function(ctx) {
+ const db = new CouchDB(ctx.user.instanceId)
+ const user = ctx.request.body
+ const dbUser = db.get(ctx.request.body._id)
+ const newData = { ...dbUser, ...user }
+
+ const response = await db.put(newData)
+ user._rev = response.rev
+
+ ctx.status = 200
+ ctx.message = `User ${ctx.request.body.username} updated successfully.`
+ ctx.body = response
+}
exports.destroy = async function(ctx) {
const database = new CouchDB(ctx.user.instanceId)
diff --git a/packages/server/src/api/routes/user.js b/packages/server/src/api/routes/user.js
index 3c560d3f80..532943ea62 100644
--- a/packages/server/src/api/routes/user.js
+++ b/packages/server/src/api/routes/user.js
@@ -8,6 +8,7 @@ const router = Router()
router
.get("/api/users", authorized(LIST_USERS), controller.fetch)
.get("/api/users/:username", authorized(USER_MANAGEMENT), controller.find)
+ .put("/api/users/", authorized(USER_MANAGEMENT), controller.update)
.post("/api/users", authorized(USER_MANAGEMENT), controller.create)
.delete(
"/api/users/:username",
diff --git a/packages/server/src/utilities/appDirectoryTemplate/pages/main/page.json b/packages/server/src/utilities/appDirectoryTemplate/pages/main/page.json
index 392496988f..a86d485fe5 100644
--- a/packages/server/src/utilities/appDirectoryTemplate/pages/main/page.json
+++ b/packages/server/src/utilities/appDirectoryTemplate/pages/main/page.json
@@ -4,6 +4,7 @@
"stylesheets": [],
"componentLibraries": ["@budibase/standard-components", "@budibase/materialdesign-components"],
"props" : {
+ "_id": "private-master-root",
"_component": "@budibase/standard-components/container",
"_children": [
{
@@ -19,7 +20,6 @@
"_children": []
}
],
- "_id": 0,
"type": "div",
"_styles": {
"active": {},
diff --git a/packages/server/src/utilities/appDirectoryTemplate/pages/unauthenticated/page.json b/packages/server/src/utilities/appDirectoryTemplate/pages/unauthenticated/page.json
index 7aad3e6dca..bfe0590912 100644
--- a/packages/server/src/utilities/appDirectoryTemplate/pages/unauthenticated/page.json
+++ b/packages/server/src/utilities/appDirectoryTemplate/pages/unauthenticated/page.json
@@ -7,6 +7,7 @@
"favicon": "./_shared/favicon.png",
"stylesheets": [],
"props": {
+ "_id": "public-master-root",
"_component": "@budibase/standard-components/container",
"_children": [
{
@@ -31,7 +32,6 @@
"logo": ""
}
],
- "_id": 1,
"type": "div",
"_styles": {
"layout": {},
diff --git a/packages/server/src/utilities/builder/index.template.html b/packages/server/src/utilities/builder/index.template.html
index 91b33cb284..58faca7da6 100644
--- a/packages/server/src/utilities/builder/index.template.html
+++ b/packages/server/src/utilities/builder/index.template.html
@@ -17,6 +17,9 @@
margin: 0px;
padding: 0px;
}
+ *, *:before, *:after {
+ box-sizing: border-box;
+ }
{{ each(options.stylesheets) }}
@@ -31,6 +34,9 @@
{{ /if }}
+
+
+
diff --git a/packages/standard-components/components.json b/packages/standard-components/components.json
index c4c0246672..2c24c02615 100644
--- a/packages/standard-components/components.json
+++ b/packages/standard-components/components.json
@@ -209,6 +209,13 @@
"model": "models"
}
},
+ "dataformwide": {
+ "description": "an HTML table that fetches data from a model or view and displays it.",
+ "data": true,
+ "props": {
+ "model": "models"
+ }
+ },
"datalist": {
"description": "A configurable data list that attaches to your backend models.",
"data": true,
@@ -228,15 +235,14 @@
"description": "A configurable data list that attaches to your backend models.",
"data": true,
"props": {
- "model": "models",
- "layout": {
- "type": "options",
- "default": "list",
- "options": [
- "list",
- "grid"
- ]
- }
+ "model": "models"
+ }
+ },
+ "recorddetail": {
+ "description": "Loads a record, using an ID in the url",
+ "data": true,
+ "props": {
+ "model": "models"
}
},
"datamap": {
diff --git a/packages/standard-components/src/DataForm.svelte b/packages/standard-components/src/DataForm.svelte
index 1510110ba9..389ce0ecd2 100644
--- a/packages/standard-components/src/DataForm.svelte
+++ b/packages/standard-components/src/DataForm.svelte
@@ -4,6 +4,12 @@
export let _bb
export let model
+ const TYPE_MAP = {
+ string: "text",
+ boolean: "checkbox",
+ number: "number",
+ }
+
let username
let password
let newModel = {
@@ -59,15 +65,23 @@