diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 1b236caab56..4c5cc94d2b4 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -240,7 +240,7 @@ jobs: any_commit=$(git log --no-merges $base_commit_excluding_merges...$pro_commit) - if [ -n "$any_commit" ]; then + if [ -n "$any_commit" ] && [ "$base_commit" != "$pro_commit" ]; then echo $any_commit echo "An error occurred: " diff --git a/.github/workflows/deploy-featurebranch.yml b/.github/workflows/deploy-featurebranch.yml index eccc783dfb9..d86d3015075 100644 --- a/.github/workflows/deploy-featurebranch.yml +++ b/.github/workflows/deploy-featurebranch.yml @@ -22,6 +22,7 @@ jobs: env: PAYLOAD_BRANCH: ${{ github.head_ref }} PAYLOAD_PR_NUMBER: ${{ github.event.pull_request.number }} + PAYLOAD_LICENSE_TYPE: "free" with: repository: budibase/budibase-deploys event: featurebranch-qa-deploy diff --git a/examples/nextjs-api-sales/yarn.lock b/examples/nextjs-api-sales/yarn.lock index 2c360662114..a44956ba21c 100644 --- a/examples/nextjs-api-sales/yarn.lock +++ b/examples/nextjs-api-sales/yarn.lock @@ -329,7 +329,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -1201,12 +1201,12 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.3" + picomatch "^2.3.1" minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" @@ -1422,7 +1422,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== diff --git a/lerna.json b/lerna.json index 754041d6efc..3396c082bf8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.31.3", + "version": "2.31.4", "npmClient": "yarn", "packages": [ "packages/*", diff --git a/packages/backend-core/src/features/index.ts b/packages/backend-core/src/features/index.ts index a8d6f0d0ef3..b84237b1f0d 100644 --- a/packages/backend-core/src/features/index.ts +++ b/packages/backend-core/src/features/index.ts @@ -266,6 +266,6 @@ export class FlagSet, T extends { [key: string]: V }> { // All of the machinery in this file is to make sure that flags have their // default values set correctly and their types flow through the system. export const flags = new FlagSet({ - DEFAULT_VALUES: Flag.boolean(false), - SQS: Flag.boolean(false), + DEFAULT_VALUES: Flag.boolean(env.isDev()), + SQS: Flag.boolean(env.isDev()), }) diff --git a/packages/backend-core/src/tenancy/db.ts b/packages/backend-core/src/tenancy/db.ts index d430296a5c2..332ecbca48a 100644 --- a/packages/backend-core/src/tenancy/db.ts +++ b/packages/backend-core/src/tenancy/db.ts @@ -15,7 +15,15 @@ export async function saveTenantInfo(tenantInfo: TenantInfo) { }) } -export async function getTenantInfo(tenantId: string): Promise { - const db = getTenantDB(tenantId) - return db.get("tenant_info") +export async function getTenantInfo( + tenantId: string +): Promise { + try { + const db = getTenantDB(tenantId) + const tenantInfo = (await db.get("tenant_info")) as TenantInfo + delete tenantInfo.owner.password + return tenantInfo + } catch { + return undefined + } } diff --git a/packages/bbui/src/Table/SelectEditRenderer.svelte b/packages/bbui/src/Table/SelectEditRenderer.svelte index c6eafa3ed0c..0c88fa31672 100644 --- a/packages/bbui/src/Table/SelectEditRenderer.svelte +++ b/packages/bbui/src/Table/SelectEditRenderer.svelte @@ -6,10 +6,11 @@ export let onEdit export let allowSelectRows = false export let allowEditRows = false + export let data
- {#if allowSelectRows} + {#if allowSelectRows && data.__selectable !== false} {/if} {#if allowEditRows} diff --git a/packages/bbui/src/Table/Table.svelte b/packages/bbui/src/Table/Table.svelte index 868f7b3a0ba..3916bec7388 100644 --- a/packages/bbui/src/Table/Table.svelte +++ b/packages/bbui/src/Table/Table.svelte @@ -43,6 +43,8 @@ export let showHeaderBorder = true export let placeholderText = "No rows found" export let snippets = [] + export let defaultSortColumn + export let defaultSortOrder = "Ascending" const dispatch = createEventDispatcher() @@ -162,6 +164,8 @@ } const sortRows = (rows, sortColumn, sortOrder) => { + sortColumn = sortColumn ?? defaultSortColumn + sortOrder = sortOrder ?? defaultSortOrder if (!sortColumn || !sortOrder || disableSorting) { return rows } @@ -259,7 +263,10 @@ if (select) { // Add any rows which are not already in selected rows rows.forEach(row => { - if (selectedRows.findIndex(x => x._id === row._id) === -1) { + if ( + row.__selectable !== false && + selectedRows.findIndex(x => x._id === row._id) === -1 + ) { selectedRows.push(row) } }) @@ -396,6 +403,9 @@ class:noBorderCheckbox={!showHeaderBorder} class="spectrum-Table-cell spectrum-Table-cell--divider spectrum-Table-cell--edit" on:click={e => { + if (row.__selectable === false) { + return + } toggleSelectRow(row) e.stopPropagation() }} diff --git a/packages/builder/src/dataBinding.js b/packages/builder/src/dataBinding.js index a7e98e1c3f0..3eefb373ca5 100644 --- a/packages/builder/src/dataBinding.js +++ b/packages/builder/src/dataBinding.js @@ -57,6 +57,7 @@ export const getBindableProperties = (asset, componentId) => { const stateBindings = getStateBindings() const selectedRowsBindings = getSelectedRowsBindings(asset) const roleBindings = getRoleBindings() + const embedBindings = getEmbedBindings() return [ ...contextBindings, ...urlBindings, @@ -65,6 +66,7 @@ export const getBindableProperties = (asset, componentId) => { ...deviceBindings, ...selectedRowsBindings, ...roleBindings, + ...embedBindings, ] } @@ -813,6 +815,25 @@ export const getActionBindings = (actions, actionId) => { return bindings } +/** + * Gets all device bindings for embeds. + */ +const getEmbedBindings = () => { + let bindings = [] + const safeEmbed = makePropSafe("embed") + + bindings = [ + { + type: "context", + runtimeBinding: `${safeEmbed}`, + readableBinding: `ParentWindow`, + category: "Embed", + icon: "DistributeVertically", + }, + ] + return bindings +} + /** * Gets the schema for a certain datasource plus. * The options which can be passed in are: diff --git a/packages/builder/src/helpers/utils.js b/packages/builder/src/helpers/utils.js index a1f9b34e3dc..f3d48331e70 100644 --- a/packages/builder/src/helpers/utils.js +++ b/packages/builder/src/helpers/utils.js @@ -7,10 +7,22 @@ import { FIELDS, isAutoColumnUserRelationship, } from "constants/backend" +import { isEnabled } from "helpers/featureFlags" export function getAutoColumnInformation(enabled = true) { let info = {} - for (let [key, subtype] of Object.entries(AUTO_COLUMN_SUB_TYPES)) { + for (const [key, subtype] of Object.entries(AUTO_COLUMN_SUB_TYPES)) { + // Because it's possible to replicate the functionality of CREATED_AT and + // CREATED_BY columns, we disable their creation when the DEFAULT_VALUES + // feature flag is enabled. + if (isEnabled("DEFAULT_VALUES")) { + if ( + subtype === AUTO_COLUMN_SUB_TYPES.CREATED_AT || + subtype === AUTO_COLUMN_SUB_TYPES.CREATED_BY + ) { + continue + } + } info[subtype] = { enabled, name: AUTO_COLUMN_DISPLAY_NAMES[key] } } return info diff --git a/packages/builder/src/pages/builder/app/[application]/_components/PreviewOverlay.svelte b/packages/builder/src/pages/builder/app/[application]/_components/PreviewOverlay.svelte index 6d3441400f0..d77744a809d 100644 --- a/packages/builder/src/pages/builder/app/[application]/_components/PreviewOverlay.svelte +++ b/packages/builder/src/pages/builder/app/[application]/_components/PreviewOverlay.svelte @@ -49,7 +49,7 @@ right: 0; left: 0; bottom: 0; - z-index: 999; + z-index: 9000; position: absolute; background: rgba(255, 255, 255, 0.1); display: flex; diff --git a/packages/builder/src/pages/builder/portal/users/users/[userId].svelte b/packages/builder/src/pages/builder/portal/users/users/[userId].svelte index d4e765a4be3..458c9a3f798 100644 --- a/packages/builder/src/pages/builder/portal/users/users/[userId].svelte +++ b/packages/builder/src/pages/builder/portal/users/users/[userId].svelte @@ -85,7 +85,7 @@ let popoverAnchor let searchTerm = "" let popover - let user + let user, tenantOwner let loaded = false $: internalGroups = $groups?.filter(g => !g?.scimInfo?.isSync) @@ -104,6 +104,7 @@ }) }) $: globalRole = users.getUserRole(user) + $: isTenantOwner = tenantOwner?.email && tenantOwner.email === user?.email const getAvailableApps = (appList, privileged, roles) => { let availableApps = appList.slice() @@ -205,6 +206,7 @@ if (!user?._id) { $goto("./") } + tenantOwner = await users.tenantOwner($auth.tenantId) } async function toggleFlags(detail) { @@ -268,9 +270,11 @@ Force password reset {/if} - - Delete - + {#if !isTenantOwner} + + Delete + + {/if}
{/if} @@ -310,9 +314,11 @@