Merge branch 'develop' into api-tests-generate-tenants

This commit is contained in:
Pedro Silva 2023-02-02 16:16:31 +00:00
commit dd4525d837
38 changed files with 283 additions and 233 deletions

View File

@ -1,5 +1,5 @@
{ {
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"npmClient": "yarn", "npmClient": "yarn",
"packages": [ "packages": [
"packages/*" "packages/*"

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/backend-core", "name": "@budibase/backend-core",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"description": "Budibase backend core libraries used in server and worker", "description": "Budibase backend core libraries used in server and worker",
"main": "dist/src/index.js", "main": "dist/src/index.js",
"types": "dist/src/index.d.ts", "types": "dist/src/index.d.ts",
@ -23,7 +23,7 @@
}, },
"dependencies": { "dependencies": {
"@budibase/nano": "10.1.1", "@budibase/nano": "10.1.1",
"@budibase/types": "2.2.12-alpha.61", "@budibase/types": "2.2.12-alpha.66",
"@shopify/jest-koa-mocks": "5.0.1", "@shopify/jest-koa-mocks": "5.0.1",
"@techpass/passport-openidconnect": "0.3.2", "@techpass/passport-openidconnect": "0.3.2",
"aws-cloudfront-sign": "2.2.0", "aws-cloudfront-sign": "2.2.0",

View File

@ -310,6 +310,11 @@
qs "^6.11.0" qs "^6.11.0"
tough-cookie "^4.1.2" tough-cookie "^4.1.2"
"@budibase/types@2.2.12-alpha.62":
version "2.2.12-alpha.62"
resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.62.tgz#385ef000610d5c00b83cb2eafda2bd63c86b7f3f"
integrity sha512-idlhB4fSyBCEDWsVvQvdmN9Dg9VAEwxZ8TLE9pGnXIRZPg48MKXPNn5AUT9zv6cDlbQdlU2tFFF8st9b6lyLuw==
"@cspotcode/source-map-support@^0.8.0": "@cspotcode/source-map-support@^0.8.0":
version "0.8.1" version "0.8.1"
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
@ -2773,9 +2778,9 @@ http-assert@^1.3.0:
http-errors "~1.8.0" http-errors "~1.8.0"
http-cache-semantics@^4.0.0: http-cache-semantics@^4.0.0:
version "4.1.0" version "4.1.1"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
http-cookie-agent@^4.0.2: http-cookie-agent@^4.0.2:
version "4.0.2" version "4.0.2"

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": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"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": "2.2.12-alpha.61", "@budibase/string-templates": "2.2.12-alpha.66",
"@spectrum-css/accordion": "3.0.24", "@spectrum-css/accordion": "3.0.24",
"@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actionbutton": "1.0.1",
"@spectrum-css/actiongroup": "1.0.1", "@spectrum-css/actiongroup": "1.0.1",

View File

@ -86,7 +86,7 @@
} }
.is-selected:not(.spectrum-ActionButton--emphasized):not(.spectrum-ActionButton--quiet) { .is-selected:not(.spectrum-ActionButton--emphasized):not(.spectrum-ActionButton--quiet) {
background: var(--spectrum-global-color-gray-300); background: var(--spectrum-global-color-gray-300);
border-color: var(--spectrum-global-color-gray-700); border-color: var(--spectrum-global-color-gray-500);
} }
.noPadding { .noPadding {
padding: 0; padding: 0;

View File

@ -1,11 +1,21 @@
export default function positionDropdown( export default function positionDropdown(element, opts) {
element, let resizeObserver
{ anchor, align, maxWidth, useAnchorWidth, offset = 5 } let latestOpts = opts
) {
const update = () => { // We need a static reference to this function so that we can properly
// clean up the scroll listener.
const scrollUpdate = () => {
updatePosition(latestOpts)
}
// Updates the position of the dropdown
const updatePosition = opts => {
const { anchor, align, maxWidth, useAnchorWidth, offset = 5 } = opts
if (!anchor) { if (!anchor) {
return return
} }
// Compute bounds
const anchorBounds = anchor.getBoundingClientRect() const anchorBounds = anchor.getBoundingClientRect()
const elementBounds = element.getBoundingClientRect() const elementBounds = element.getBoundingClientRect()
let styles = { let styles = {
@ -51,26 +61,47 @@ export default function positionDropdown(
}) })
} }
// The actual svelte action callback which creates observers on the relevant
// DOM elements
const update = newOpts => {
latestOpts = newOpts
// Cleanup old state
if (resizeObserver) {
resizeObserver.disconnect()
}
// Do nothing if no anchor
const { anchor } = newOpts
if (!anchor) {
return
}
// Observe both anchor and element and resize the popover as appropriate
resizeObserver = new ResizeObserver(() => updatePosition(newOpts))
resizeObserver.observe(anchor)
resizeObserver.observe(element)
resizeObserver.observe(document.body)
}
// Apply initial styles which don't need to change // Apply initial styles which don't need to change
element.style.position = "absolute" element.style.position = "absolute"
element.style.zIndex = "9999" element.style.zIndex = "9999"
// Observe both anchor and element and resize the popover as appropriate // Set up a scroll listener
const resizeObserver = new ResizeObserver(entries => { document.addEventListener("scroll", scrollUpdate, true)
entries.forEach(update)
})
if (anchor) {
resizeObserver.observe(anchor)
}
resizeObserver.observe(element)
resizeObserver.observe(document.body)
document.addEventListener("scroll", update, true) // Perform initial update
update(opts)
return { return {
update,
destroy() { destroy() {
resizeObserver.disconnect() // Cleanup
document.removeEventListener("scroll", update, true) if (resizeObserver) {
resizeObserver.disconnect()
}
document.removeEventListener("scroll", scrollUpdate, true)
}, },
} }
} }

View File

@ -57,30 +57,28 @@
</script> </script>
{#if open} {#if open}
{#key anchor} <Portal {target}>
<Portal {target}> <div
<div tabindex="0"
tabindex="0" use:positionDropdown={{
use:positionDropdown={{ anchor,
anchor, align,
align, maxWidth,
maxWidth, useAnchorWidth,
useAnchorWidth, offset,
offset, }}
}} use:clickOutside={{
use:clickOutside={{ callback: dismissible ? handleOutsideClick : () => {},
callback: dismissible ? handleOutsideClick : () => {}, anchor,
anchor, }}
}} on:keydown={handleEscape}
on:keydown={handleEscape} class="spectrum-Popover is-open"
class="spectrum-Popover is-open" role="presentation"
role="presentation" transition:fly|local={{ y: -20, duration: 200 }}
transition:fly|local={{ y: -20, duration: 200 }} >
> <slot />
<slot /> </div>
</div> </Portal>
</Portal>
{/key}
{/if} {/if}
<style> <style>

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/builder", "name": "@budibase/builder",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"license": "GPL-3.0", "license": "GPL-3.0",
"private": true, "private": true,
"scripts": { "scripts": {
@ -58,10 +58,10 @@
} }
}, },
"dependencies": { "dependencies": {
"@budibase/bbui": "2.2.12-alpha.61", "@budibase/bbui": "2.2.12-alpha.66",
"@budibase/client": "2.2.12-alpha.61", "@budibase/client": "2.2.12-alpha.66",
"@budibase/frontend-core": "2.2.12-alpha.61", "@budibase/frontend-core": "2.2.12-alpha.66",
"@budibase/string-templates": "2.2.12-alpha.61", "@budibase/string-templates": "2.2.12-alpha.66",
"@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/fontawesome-svg-core": "^6.2.1",
"@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-brands-svg-icons": "^6.2.1",
"@fortawesome/free-solid-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.1",

View File

@ -177,7 +177,7 @@
<EnvDropdown <EnvDropdown
showModal={() => showModal(configKey)} showModal={() => showModal(configKey)}
variables={$environment.variables} variables={$environment.variables}
type={schema[configKey].type} type={configKey === "port" ? "string" : schema[configKey].type}
on:change on:change
bind:value={config[configKey]} bind:value={config[configKey]}
error={$validation.errors[configKey]} error={$validation.errors[configKey]}

View File

@ -22,6 +22,7 @@
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
let bindingDrawer let bindingDrawer
let valid = true
$: readableValue = runtimeToReadableBinding(bindings, value) $: readableValue = runtimeToReadableBinding(bindings, value)
$: tempValue = readableValue $: tempValue = readableValue
@ -76,12 +77,15 @@
<svelte:fragment slot="description"> <svelte:fragment slot="description">
Add the objects on the left to enrich your text. Add the objects on the left to enrich your text.
</svelte:fragment> </svelte:fragment>
<Button cta slot="buttons" on:click={handleClose}>Save</Button> <Button cta slot="buttons" on:click={handleClose} disabled={!valid}>
Save
</Button>
<svelte:component <svelte:component
this={panel} this={panel}
slot="body" slot="body"
value={readableValue} value={readableValue}
close={handleClose} close={handleClose}
bind:valid
on:change={event => (tempValue = event.detail)} on:change={event => (tempValue = event.detail)}
{bindings} {bindings}
{allowJS} {allowJS}

View File

@ -118,6 +118,10 @@
const getAllBindings = (bindings, eventContextBindings, actions) => { const getAllBindings = (bindings, eventContextBindings, actions) => {
let allBindings = eventContextBindings.concat(bindings) let allBindings = eventContextBindings.concat(bindings)
if (!actions) {
return []
}
// Ensure bindings are generated for all "update state" action keys // Ensure bindings are generated for all "update state" action keys
actions actions
.filter(action => { .filter(action => {

View File

@ -108,50 +108,52 @@
} }
</script> </script>
{#key tourStepKey} {#if tourKey}
<Popover {#key tourStepKey}
align={tourStep?.align} <Popover
bind:this={popover} align={tourStep?.align}
anchor={popoverAnchor} bind:this={popover}
maxWidth={300} anchor={popoverAnchor}
dismissible={false} maxWidth={300}
offset={15} dismissible={false}
> offset={15}
<div class="tour-content"> >
<Layout noPadding gap="M"> <div class="tour-content">
<div class="tour-header"> <Layout noPadding gap="M">
<Heading size="XS">{tourStep?.title || "-"}</Heading> <div class="tour-header">
<div>{`${tourStepIdx + 1}/${tourSteps?.length}`}</div> <Heading size="XS">{tourStep?.title || "-"}</Heading>
</div> <div>{`${tourStepIdx + 1}/${tourSteps?.length}`}</div>
<Body size="S">
<span class="tour-body">
{#if tourStep.layout}
<svelte:component this={tourStep.layout} />
{:else}
{tourStep?.body || ""}
{/if}
</span>
</Body>
<div class="tour-footer">
<div class="tour-navigation">
{#if tourStepIdx > 0}
<Button
secondary
on:click={previousStep}
disabled={tourStepIdx == 0}
>
<div>Back</div>
</Button>
{/if}
<Button cta on:click={nextStep}>
<div>{lastStep ? "Finish" : "Next"}</div>
</Button>
</div> </div>
</div> <Body size="S">
</Layout> <span class="tour-body">
</div> {#if tourStep.layout}
</Popover> <svelte:component this={tourStep.layout} />
{/key} {:else}
{tourStep?.body || ""}
{/if}
</span>
</Body>
<div class="tour-footer">
<div class="tour-navigation">
{#if tourStepIdx > 0}
<Button
secondary
on:click={previousStep}
disabled={tourStepIdx == 0}
>
<div>Back</div>
</Button>
{/if}
<Button cta on:click={nextStep}>
<div>{lastStep ? "Finish" : "Next"}</div>
</Button>
</div>
</div>
</Layout>
</div>
</Popover>
{/key}
{/if}
<style> <style>
.tour-content { .tour-content {

View File

@ -1,5 +1,5 @@
<div> <div>
In this section you can mange the data for your app: In this section you can manage the data for your app:
<ul class="feature-list"> <ul class="feature-list">
<li>Connect data sources</li> <li>Connect data sources</li>
<li>Edit data</li> <li>Edit data</li>

View File

@ -138,7 +138,6 @@
} }
$goto(`/builder/app/${createdApp.instance._id}`) $goto(`/builder/app/${createdApp.instance._id}`)
// apps.load()
} catch (error) { } catch (error) {
creating = false creating = false
console.error(error) console.error(error)

View File

@ -52,7 +52,7 @@
<span class="back-chev" on:click={() => $goto("../")}> <span class="back-chev" on:click={() => $goto("../")}>
<Icon name="ChevronLeft" size="XL" /> <Icon name="ChevronLeft" size="XL" />
</span> </span>
Forgotten your password? Forgot your password?
</div> </div>
</Heading> </Heading>
</span> </span>
@ -83,7 +83,12 @@
</FancyForm> </FancyForm>
</Layout> </Layout>
<div> <div>
<Button disabled={!email || error || submitted} cta on:click={forgot}> <Button
size="L"
disabled={!email || error || submitted}
cta
on:click={forgot}
>
Reset password Reset password
</Button> </Button>
</div> </div>
@ -92,7 +97,7 @@
<style> <style>
img { img {
width: 48px; width: 46px;
} }
.back-chev { .back-chev {
display: inline-block; display: inline-block;
@ -102,5 +107,6 @@
.heading-content { .heading-content {
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--spacing-m);
} }
</style> </style>

View File

@ -66,7 +66,7 @@
<svelte:window on:keydown={handleKeydown} /> <svelte:window on:keydown={handleKeydown} />
<TestimonialPage> <TestimonialPage>
<Layout gap="S" noPadding> <Layout gap="L" noPadding>
<Layout justifyItems="center" noPadding> <Layout justifyItems="center" noPadding>
{#if loaded} {#if loaded}
<img alt="logo" src={$organisation.logoUrl || Logo} /> <img alt="logo" src={$organisation.logoUrl || Logo} />
@ -124,14 +124,19 @@
</FancyForm> </FancyForm>
</Layout> </Layout>
<Layout gap="XS" noPadding justifyItems="center"> <Layout gap="XS" noPadding justifyItems="center">
<Button cta disabled={Object.keys(errors).length > 0} on:click={login}> <Button
size="L"
cta
disabled={Object.keys(errors).length > 0}
on:click={login}
>
Log in to {company} Log in to {company}
</Button> </Button>
</Layout> </Layout>
<Layout gap="XS" noPadding justifyItems="center"> <Layout gap="XS" noPadding justifyItems="center">
<div class="user-actions"> <div class="user-actions">
<ActionButton quiet on:click={() => $goto("./forgot")}> <ActionButton size="L" quiet on:click={() => $goto("./forgot")}>
Forgot password Forgot password?
</ActionButton> </ActionButton>
</div> </div>
</Layout> </Layout>

View File

@ -68,7 +68,7 @@
</script> </script>
<TestimonialPage> <TestimonialPage>
<Layout gap="S" noPadding> <Layout gap="M" noPadding>
<img alt="logo" src={$organisation.logoUrl || Logo} /> <img alt="logo" src={$organisation.logoUrl || Logo} />
<Layout gap="XS" noPadding> <Layout gap="XS" noPadding>
<Heading size="M">Join {company}</Heading> <Heading size="M">Join {company}</Heading>
@ -175,6 +175,7 @@
</Layout> </Layout>
<div> <div>
<Button <Button
size="L"
disabled={Object.keys(errors).length > 0 || onboarding} disabled={Object.keys(errors).length > 0 || onboarding}
cta cta
on:click={acceptInvite} on:click={acceptInvite}

View File

@ -14,7 +14,7 @@
let activeTab = "Apps" let activeTab = "Apps"
$: $url(), updateActiveTab($menu) $: $url(), updateActiveTab($menu)
$: fullScreen = !$apps?.length $: fullscreen = !$apps.length
const updateActiveTab = menu => { const updateActiveTab = menu => {
for (let entry of menu) { for (let entry of menu) {
@ -37,7 +37,8 @@
$redirect("../") $redirect("../")
} else { } else {
try { try {
await organisation.init() // We need to load apps to know if we need to show onboarding fullscreen
await Promise.all([apps.load(), organisation.init()])
} catch (error) { } catch (error) {
notifications.error("Error getting org config") notifications.error("Error getting org config")
} }
@ -47,37 +48,39 @@
}) })
</script> </script>
{#if fullScreen} {#if $auth.user && loaded}
<slot /> {#if fullscreen}
{:else if $auth.user && loaded} <slot />
<HelpMenu /> {:else}
<div class="container"> <HelpMenu />
<div class="nav"> <div class="container">
<div class="branding"> <div class="nav">
<Logo /> <div class="branding">
<Logo />
</div>
<div class="desktop">
<Tabs selected={activeTab}>
{#each $menu as { title, href }}
<Tab {title} on:click={() => $goto(href)} />
{/each}
</Tabs>
</div>
<div class="mobile">
<Icon hoverable name="ShowMenu" on:click={showMobileMenu} />
</div>
<div class="desktop">
<UpgradeButton />
</div>
<div class="dropdown">
<UserDropdown />
</div>
</div> </div>
<div class="desktop"> <div class="main">
<Tabs selected={activeTab}> <slot />
{#each $menu as { title, href }}
<Tab {title} on:click={() => $goto(href)} />
{/each}
</Tabs>
</div>
<div class="mobile">
<Icon hoverable name="ShowMenu" on:click={showMobileMenu} />
</div>
<div class="desktop">
<UpgradeButton />
</div>
<div class="dropdown">
<UserDropdown />
</div> </div>
<MobileMenu visible={mobileMenuVisible} on:close={hideMobileMenu} />
</div> </div>
<div class="main"> {/if}
<slot />
</div>
<MobileMenu visible={mobileMenuVisible} on:close={hideMobileMenu} />
</div>
{/if} {/if}
<style> <style>

View File

@ -10,13 +10,11 @@
onMount(async () => { onMount(async () => {
try { try {
// Always load latest // Always load latest
await apps.load() await Promise.all([
await licensing.init() licensing.init(),
await templates.load() templates.load(),
groups.actions.init(),
if ($licensing.groupsEnabled) { ])
await groups.actions.init()
}
if ($templates?.length === 0) { if ($templates?.length === 0) {
notifications.error("There was a problem loading quick start templates") notifications.error("There was a problem loading quick start templates")

View File

@ -5,6 +5,8 @@
export let name = "" export let name = ""
export let url = "" export let url = ""
export let onNext = () => {} export let onNext = () => {}
const nameRegex = /^[a-zA-Z0-9\s]*$/
let nameError = null let nameError = null
let urlError = null let urlError = null
@ -14,6 +16,9 @@
if (name.length < 1) { if (name.length < 1) {
return "Name must be provided" return "Name must be provided"
} }
if (!nameRegex.test(name)) {
return "No special characters are allowed"
}
} }
const validateUrl = url => { const validateUrl = url => {

View File

@ -17,8 +17,8 @@
import createFromScratchScreen from "builderStore/store/screenTemplates/createFromScratchScreen" import createFromScratchScreen from "builderStore/store/screenTemplates/createFromScratchScreen"
import { Roles } from "constants/backend" import { Roles } from "constants/backend"
let name = "" let name = "My first app"
let url = "" let url = "my-first-app"
let stage = "name" let stage = "name"
let appId = null let appId = null
@ -57,7 +57,7 @@
defaultScreenTemplate.routing.roldId = Roles.BASIC defaultScreenTemplate.routing.roldId = Roles.BASIC
await store.actions.screens.save(defaultScreenTemplate) await store.actions.screens.save(defaultScreenTemplate)
return createdApp.instance._id appId = createdApp.instance._id
} }
const getIntegrations = async () => { const getIntegrations = async () => {
@ -79,14 +79,14 @@
} }
} }
const goToApp = appId => { const goToApp = () => {
$goto(`/builder/app/${appId}`) $goto(`/builder/app/${appId}`)
notifications.success(`App created successfully`) notifications.success(`App created successfully`)
} }
const handleCreateApp = async ({ datasourceConfig, useSampleData }) => { const handleCreateApp = async ({ datasourceConfig, useSampleData }) => {
try { try {
appId = await createApp(useSampleData) await createApp(useSampleData)
if (datasourceConfig) { if (datasourceConfig) {
await saveDatasource({ await saveDatasource({
@ -99,7 +99,7 @@
}) })
} }
goToApp(appId) goToApp()
} catch (e) { } catch (e) {
console.log(e) console.log(e)
notifications.error("There was a problem creating your app") notifications.error("There was a problem creating your app")
@ -111,7 +111,7 @@
<CreateTableModal <CreateTableModal
name="Your Data" name="Your Data"
beforeSave={createApp} beforeSave={createApp}
afterSave={() => goToApp(appId)} afterSave={goToApp}
/> />
</Modal> </Modal>
@ -142,7 +142,7 @@
<div class="dataButtonIcon"> <div class="dataButtonIcon">
<FontAwesomeIcon name="fa-solid fa-file-arrow-up" /> <FontAwesomeIcon name="fa-solid fa-file-arrow-up" />
</div> </div>
Upload file Upload data (CSV or JSON)
</div> </div>
</FancyButton> </FancyButton>
</div> </div>

View File

@ -100,8 +100,9 @@
const deleteApp = async () => { const deleteApp = async () => {
try { try {
await API.deleteApp(app?.devId) await API.deleteApp(app?.devId)
apps.load()
notifications.success("App deleted successfully") notifications.success("App deleted successfully")
$goto("../") $goto("../../")
} catch (err) { } catch (err) {
notifications.error("Error deleting app") notifications.error("Error deleting app")
} }

View File

@ -1,17 +1,12 @@
<script> <script>
import { apps, groups, licensing } from "stores/portal" import { groups } from "stores/portal"
import { onMount } from "svelte" import { onMount } from "svelte"
let loaded = !!$apps?.length let loaded = false
onMount(async () => { onMount(async () => {
if (!loaded) { await groups.actions.init()
await apps.load() loaded = true
if ($licensing.groupsEnabled) {
await groups.actions.init()
}
loaded = true
}
}) })
</script> </script>

View File

@ -146,7 +146,7 @@
onMount(async () => { onMount(async () => {
try { try {
await Promise.all([groups.actions.init(), apps.load(), roles.fetch()]) await Promise.all([groups.actions.init(), roles.fetch()])
loaded = true loaded = true
} catch (error) { } catch (error) {
notifications.error("Error fetching user group data") notifications.error("Error fetching user group data")

View File

@ -80,9 +80,7 @@
try { try {
// always load latest // always load latest
await licensing.init() await licensing.init()
if ($licensing.groupsEnabled) { await groups.actions.init()
await groups.actions.init()
}
} catch (error) { } catch (error) {
notifications.error("Error getting user groups") notifications.error("Error getting user groups")
} }

View File

@ -215,12 +215,7 @@
onMount(async () => { onMount(async () => {
try { try {
await Promise.all([ await Promise.all([fetchUser(), groups.actions.init(), roles.fetch()])
fetchUser(),
groups.actions.init(),
apps.load(),
roles.fetch(),
])
loaded = true loaded = true
} catch (error) { } catch (error) {
notifications.error("Error getting user groups") notifications.error("Error getting user groups")

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/cli", "name": "@budibase/cli",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"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": {
@ -26,9 +26,9 @@
"outputPath": "build" "outputPath": "build"
}, },
"dependencies": { "dependencies": {
"@budibase/backend-core": "2.2.12-alpha.61", "@budibase/backend-core": "2.2.12-alpha.66",
"@budibase/string-templates": "2.2.12-alpha.61", "@budibase/string-templates": "2.2.12-alpha.66",
"@budibase/types": "2.2.12-alpha.61", "@budibase/types": "2.2.12-alpha.66",
"axios": "0.21.2", "axios": "0.21.2",
"chalk": "4.1.0", "chalk": "4.1.0",
"cli-progress": "3.11.2", "cli-progress": "3.11.2",

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/client", "name": "@budibase/client",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"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,9 +19,9 @@
"dev:builder": "rollup -cw" "dev:builder": "rollup -cw"
}, },
"dependencies": { "dependencies": {
"@budibase/bbui": "2.2.12-alpha.61", "@budibase/bbui": "2.2.12-alpha.66",
"@budibase/frontend-core": "2.2.12-alpha.61", "@budibase/frontend-core": "2.2.12-alpha.66",
"@budibase/string-templates": "2.2.12-alpha.61", "@budibase/string-templates": "2.2.12-alpha.66",
"@spectrum-css/button": "^3.0.3", "@spectrum-css/button": "^3.0.3",
"@spectrum-css/card": "^3.0.3", "@spectrum-css/card": "^3.0.3",
"@spectrum-css/divider": "^1.0.3", "@spectrum-css/divider": "^1.0.3",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

View File

@ -1,12 +1,12 @@
{ {
"name": "@budibase/frontend-core", "name": "@budibase/frontend-core",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"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": "2.2.12-alpha.61", "@budibase/bbui": "2.2.12-alpha.66",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"svelte": "^3.46.2" "svelte": "^3.46.2"
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/sdk", "name": "@budibase/sdk",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"description": "Budibase Public API SDK", "description": "Budibase Public API SDK",
"author": "Budibase", "author": "Budibase",
"license": "MPL-2.0", "license": "MPL-2.0",

View File

@ -1,7 +1,7 @@
{ {
"name": "@budibase/server", "name": "@budibase/server",
"email": "hi@budibase.com", "email": "hi@budibase.com",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"description": "Budibase Web Server", "description": "Budibase Web Server",
"main": "src/index.ts", "main": "src/index.ts",
"repository": { "repository": {
@ -43,11 +43,11 @@
"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": "2.2.12-alpha.61", "@budibase/backend-core": "2.2.12-alpha.66",
"@budibase/client": "2.2.12-alpha.61", "@budibase/client": "2.2.12-alpha.66",
"@budibase/pro": "2.2.12-alpha.61", "@budibase/pro": "2.2.12-alpha.66",
"@budibase/string-templates": "2.2.12-alpha.61", "@budibase/string-templates": "2.2.12-alpha.66",
"@budibase/types": "2.2.12-alpha.61", "@budibase/types": "2.2.12-alpha.66",
"@bull-board/api": "3.7.0", "@bull-board/api": "3.7.0",
"@bull-board/koa": "3.9.4", "@bull-board/koa": "3.9.4",
"@elastic/elasticsearch": "7.10.0", "@elastic/elasticsearch": "7.10.0",

View File

@ -1273,13 +1273,13 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@budibase/backend-core@2.2.12-alpha.61": "@budibase/backend-core@2.2.12-alpha.66":
version "2.2.12-alpha.61" version "2.2.12-alpha.66"
resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.61.tgz#5453d8de94d8262eb39816f673bdb2d729434788" resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.66.tgz#0679a20dbea1cc97550710b3abef4c0c320612ba"
integrity sha512-NOwZlA6jjQY5HjLujlhnWfJBWjUb7mryFD3d6tLyVuq+exf3ALZO59TE2hSsgSPTpaVTrNOSV4gwbYOev/Drsg== integrity sha512-dJ4ocMjyXwpQj4i5J+DJqe6Oxo5DP1qzz1N9XHrwfk1CQIeemE0qu4d/T5bMjoeCvPci8sWRqGBmeHQh3ICAXw==
dependencies: dependencies:
"@budibase/nano" "10.1.1" "@budibase/nano" "10.1.1"
"@budibase/types" "2.2.12-alpha.61" "@budibase/types" "2.2.12-alpha.66"
"@shopify/jest-koa-mocks" "5.0.1" "@shopify/jest-koa-mocks" "5.0.1"
"@techpass/passport-openidconnect" "0.3.2" "@techpass/passport-openidconnect" "0.3.2"
aws-cloudfront-sign "2.2.0" aws-cloudfront-sign "2.2.0"
@ -1374,13 +1374,13 @@
qs "^6.11.0" qs "^6.11.0"
tough-cookie "^4.1.2" tough-cookie "^4.1.2"
"@budibase/pro@2.2.12-alpha.61": "@budibase/pro@2.2.12-alpha.66":
version "2.2.12-alpha.61" version "2.2.12-alpha.66"
resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.61.tgz#93ca762a0773950d959c9fff24325cfe93718eff" resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.66.tgz#6eb18460f4821132aa0c8454ca874ad699bf1e6b"
integrity sha512-ttg6TEGTn+IX2+Uyv853wsNp9pXPZ1n9tNZC9un4jAH/edbxhCElBSNMH8gsHyqw9oOGJOkNNTzsd1IfOTckqw== integrity sha512-6wEjYpxVORqvKhO3oCxnYMUWPZT3pN8SEtxgvU5y01ncMrwfpywthDS8EGXX8Zj1cAm2YuPMvq+oJaufE8Xz0g==
dependencies: dependencies:
"@budibase/backend-core" "2.2.12-alpha.61" "@budibase/backend-core" "2.2.12-alpha.66"
"@budibase/types" "2.2.12-alpha.61" "@budibase/types" "2.2.12-alpha.66"
"@koa/router" "8.0.8" "@koa/router" "8.0.8"
bull "4.10.1" bull "4.10.1"
joi "17.6.0" joi "17.6.0"
@ -1406,10 +1406,10 @@
svelte-apexcharts "^1.0.2" svelte-apexcharts "^1.0.2"
svelte-flatpickr "^3.1.0" svelte-flatpickr "^3.1.0"
"@budibase/types@2.2.12-alpha.61": "@budibase/types@2.2.12-alpha.66":
version "2.2.12-alpha.61" version "2.2.12-alpha.66"
resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.61.tgz#b1f87134dccfb14a9222a1733bba6f7a5277e3f1" resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.66.tgz#f77901a39c94256bb7bd771912acc7cff2e79288"
integrity sha512-gbST+HYYMZ2R+eUnb1lHSoRfLI72XYxzimCaDfWVfBjYTsfQoUkkhMbse+zldUBIveLMGFETZ6MIs3k2puHqEQ== integrity sha512-plEyZ/KS0ThswRGIsXAZjIZXJWGBtHVJF9FN9BSOui+9J6SZI7RwMapbPgHXBNOxde+fJGbKt0AOVwiDZrmLRg==
"@bull-board/api@3.7.0": "@bull-board/api@3.7.0":
version "3.7.0" version "3.7.0"

View File

@ -1,6 +1,6 @@
{ {
"name": "@budibase/string-templates", "name": "@budibase/string-templates",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"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,6 +1,6 @@
{ {
"name": "@budibase/types", "name": "@budibase/types",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"description": "Budibase types", "description": "Budibase types",
"main": "dist/index.js", "main": "dist/index.js",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",

View File

@ -1,7 +1,7 @@
{ {
"name": "@budibase/worker", "name": "@budibase/worker",
"email": "hi@budibase.com", "email": "hi@budibase.com",
"version": "2.2.12-alpha.61", "version": "2.2.12-alpha.66",
"description": "Budibase background service", "description": "Budibase background service",
"main": "src/index.ts", "main": "src/index.ts",
"repository": { "repository": {
@ -36,10 +36,10 @@
"author": "Budibase", "author": "Budibase",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@budibase/backend-core": "2.2.12-alpha.61", "@budibase/backend-core": "2.2.12-alpha.66",
"@budibase/pro": "2.2.12-alpha.61", "@budibase/pro": "2.2.12-alpha.66",
"@budibase/string-templates": "2.2.12-alpha.61", "@budibase/string-templates": "2.2.12-alpha.66",
"@budibase/types": "2.2.12-alpha.61", "@budibase/types": "2.2.12-alpha.66",
"@koa/router": "8.0.8", "@koa/router": "8.0.8",
"@sentry/node": "6.17.7", "@sentry/node": "6.17.7",
"@techpass/passport-openidconnect": "0.3.2", "@techpass/passport-openidconnect": "0.3.2",

View File

@ -267,7 +267,7 @@ export async function publicSettings(ctx: Ctx) {
// enrich the logo url // enrich the logo url
// empty url means deleted // empty url means deleted
if (config.config.logoUrl !== "") { if (config.config.logoUrl && config.config.logoUrl !== "") {
config.config.logoUrl = objectStore.getGlobalFileUrl( config.config.logoUrl = objectStore.getGlobalFileUrl(
"settings", "settings",
"logoUrl", "logoUrl",

View File

@ -470,13 +470,13 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@budibase/backend-core@2.2.12-alpha.61": "@budibase/backend-core@2.2.12-alpha.66":
version "2.2.12-alpha.61" version "2.2.12-alpha.66"
resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.61.tgz#5453d8de94d8262eb39816f673bdb2d729434788" resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.66.tgz#0679a20dbea1cc97550710b3abef4c0c320612ba"
integrity sha512-NOwZlA6jjQY5HjLujlhnWfJBWjUb7mryFD3d6tLyVuq+exf3ALZO59TE2hSsgSPTpaVTrNOSV4gwbYOev/Drsg== integrity sha512-dJ4ocMjyXwpQj4i5J+DJqe6Oxo5DP1qzz1N9XHrwfk1CQIeemE0qu4d/T5bMjoeCvPci8sWRqGBmeHQh3ICAXw==
dependencies: dependencies:
"@budibase/nano" "10.1.1" "@budibase/nano" "10.1.1"
"@budibase/types" "2.2.12-alpha.61" "@budibase/types" "2.2.12-alpha.66"
"@shopify/jest-koa-mocks" "5.0.1" "@shopify/jest-koa-mocks" "5.0.1"
"@techpass/passport-openidconnect" "0.3.2" "@techpass/passport-openidconnect" "0.3.2"
aws-cloudfront-sign "2.2.0" aws-cloudfront-sign "2.2.0"
@ -521,13 +521,13 @@
qs "^6.11.0" qs "^6.11.0"
tough-cookie "^4.1.2" tough-cookie "^4.1.2"
"@budibase/pro@2.2.12-alpha.61": "@budibase/pro@2.2.12-alpha.66":
version "2.2.12-alpha.61" version "2.2.12-alpha.66"
resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.61.tgz#93ca762a0773950d959c9fff24325cfe93718eff" resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.66.tgz#6eb18460f4821132aa0c8454ca874ad699bf1e6b"
integrity sha512-ttg6TEGTn+IX2+Uyv853wsNp9pXPZ1n9tNZC9un4jAH/edbxhCElBSNMH8gsHyqw9oOGJOkNNTzsd1IfOTckqw== integrity sha512-6wEjYpxVORqvKhO3oCxnYMUWPZT3pN8SEtxgvU5y01ncMrwfpywthDS8EGXX8Zj1cAm2YuPMvq+oJaufE8Xz0g==
dependencies: dependencies:
"@budibase/backend-core" "2.2.12-alpha.61" "@budibase/backend-core" "2.2.12-alpha.66"
"@budibase/types" "2.2.12-alpha.61" "@budibase/types" "2.2.12-alpha.66"
"@koa/router" "8.0.8" "@koa/router" "8.0.8"
bull "4.10.1" bull "4.10.1"
joi "17.6.0" joi "17.6.0"
@ -535,10 +535,10 @@
lru-cache "^7.14.1" lru-cache "^7.14.1"
node-fetch "^2.6.1" node-fetch "^2.6.1"
"@budibase/types@2.2.12-alpha.61": "@budibase/types@2.2.12-alpha.66":
version "2.2.12-alpha.61" version "2.2.12-alpha.66"
resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.61.tgz#b1f87134dccfb14a9222a1733bba6f7a5277e3f1" resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.66.tgz#f77901a39c94256bb7bd771912acc7cff2e79288"
integrity sha512-gbST+HYYMZ2R+eUnb1lHSoRfLI72XYxzimCaDfWVfBjYTsfQoUkkhMbse+zldUBIveLMGFETZ6MIs3k2puHqEQ== integrity sha512-plEyZ/KS0ThswRGIsXAZjIZXJWGBtHVJF9FN9BSOui+9J6SZI7RwMapbPgHXBNOxde+fJGbKt0AOVwiDZrmLRg==
"@cspotcode/source-map-support@^0.8.0": "@cspotcode/source-map-support@^0.8.0":
version "0.8.1" version "0.8.1"
@ -3954,9 +3954,9 @@ http-assert@^1.3.0:
http-errors "~1.8.0" http-errors "~1.8.0"
http-cache-semantics@^4.0.0: http-cache-semantics@^4.0.0:
version "4.1.0" version "4.1.1"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
http-cookie-agent@^4.0.2: http-cookie-agent@^4.0.2:
version "4.0.2" version "4.0.2"