Skip to content

Commit

Permalink
Merge branch 'master' into feat/row-action-view-security
Browse files Browse the repository at this point in the history
  • Loading branch information
adrinr authored Sep 3, 2024
2 parents 2b49c3f + 1005b83 commit 1be8289
Show file tree
Hide file tree
Showing 36 changed files with 490 additions and 299 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/budibase_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: <error_message>"
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/deploy-featurebranch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 7 additions & 7 deletions examples/nextjs-api-sales/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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==
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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==
Expand Down
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "2.31.3",
"version": "2.31.4",
"npmClient": "yarn",
"packages": [
"packages/*",
Expand Down
4 changes: 2 additions & 2 deletions packages/backend-core/src/features/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,6 @@ export class FlagSet<V extends Flag<any>, 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()),
})
14 changes: 11 additions & 3 deletions packages/backend-core/src/tenancy/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,15 @@ export async function saveTenantInfo(tenantInfo: TenantInfo) {
})
}

export async function getTenantInfo(tenantId: string): Promise<TenantInfo> {
const db = getTenantDB(tenantId)
return db.get("tenant_info")
export async function getTenantInfo(
tenantId: string
): Promise<TenantInfo | undefined> {
try {
const db = getTenantDB(tenantId)
const tenantInfo = (await db.get("tenant_info")) as TenantInfo
delete tenantInfo.owner.password
return tenantInfo
} catch {
return undefined
}
}
3 changes: 2 additions & 1 deletion packages/bbui/src/Table/SelectEditRenderer.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
export let onEdit
export let allowSelectRows = false
export let allowEditRows = false
export let data
</script>

<div>
{#if allowSelectRows}
{#if allowSelectRows && data.__selectable !== false}
<Checkbox value={selected} />
{/if}
{#if allowEditRows}
Expand Down
12 changes: 11 additions & 1 deletion packages/bbui/src/Table/Table.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -162,6 +164,8 @@
}
const sortRows = (rows, sortColumn, sortOrder) => {
sortColumn = sortColumn ?? defaultSortColumn
sortOrder = sortOrder ?? defaultSortOrder
if (!sortColumn || !sortOrder || disableSorting) {
return rows
}
Expand Down Expand Up @@ -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)
}
})
Expand Down Expand Up @@ -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()
}}
Expand Down
21 changes: 21 additions & 0 deletions packages/builder/src/dataBinding.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -65,6 +66,7 @@ export const getBindableProperties = (asset, componentId) => {
...deviceBindings,
...selectedRowsBindings,
...roleBindings,
...embedBindings,
]
}

Expand Down Expand Up @@ -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:
Expand Down
14 changes: 13 additions & 1 deletion packages/builder/src/helpers/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -104,6 +104,7 @@
})
})
$: globalRole = users.getUserRole(user)
$: isTenantOwner = tenantOwner?.email && tenantOwner.email === user?.email
const getAvailableApps = (appList, privileged, roles) => {
let availableApps = appList.slice()
Expand Down Expand Up @@ -205,6 +206,7 @@
if (!user?._id) {
$goto("./")
}
tenantOwner = await users.tenantOwner($auth.tenantId)
}
async function toggleFlags(detail) {
Expand Down Expand Up @@ -268,9 +270,11 @@
Force password reset
</MenuItem>
{/if}
<MenuItem on:click={deleteModal.show} icon="Delete">
Delete
</MenuItem>
{#if !isTenantOwner}
<MenuItem on:click={deleteModal.show} icon="Delete">
Delete
</MenuItem>
{/if}
</ActionMenu>
</div>
{/if}
Expand Down Expand Up @@ -310,9 +314,11 @@
<Label size="L">Role</Label>
<Select
placeholder={null}
disabled={!sdk.users.isAdmin($auth.user)}
value={globalRole}
options={Constants.BudibaseRoleOptions}
disabled={!sdk.users.isAdmin($auth.user) || isTenantOwner}
value={isTenantOwner ? "owner" : globalRole}
options={isTenantOwner
? Constants.ExtendedBudibaseRoleOptions
: Constants.BudibaseRoleOptions}
on:change={updateUserRole}
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
export let row
$: role = Constants.BudibaseRoleOptions.find(
$: role = Constants.ExtendedBudibaseRoleOptions.find(
x => x.value === users.getUserRole(row)
)
$: value = role?.label || "Not available"
Expand Down
23 changes: 20 additions & 3 deletions packages/builder/src/pages/builder/portal/users/users/index.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
let groupsLoaded = !$licensing.groupsEnabled || $groups?.length
let enrichedUsers = []
let tenantOwner
let createUserModal,
inviteConfirmationModal,
onboardingTypeModal,
Expand All @@ -70,6 +71,7 @@
]
let userData = []
let invitesLoaded = false
let tenantOwnerLoaded = false
let pendingInvites = []
let parsedInvites = []
Expand Down Expand Up @@ -98,8 +100,14 @@
$: pendingSchema = getPendingSchema(schema)
$: userData = []
$: inviteUsersResponse = { successful: [], unsuccessful: [] }
$: {
enrichedUsers = $fetch.rows?.map(user => {
$: setEnrichedUsers($fetch.rows, tenantOwnerLoaded)
const setEnrichedUsers = async rows => {
if (!tenantOwnerLoaded) {
enrichedUsers = []
return
}
enrichedUsers = rows?.map(user => {
let userGroups = []
$groups.forEach(group => {
if (group.users) {
Expand All @@ -110,15 +118,21 @@
})
}
})
user.tenantOwnerEmail = tenantOwner?.email
const role = Constants.ExtendedBudibaseRoleOptions.find(
x => x.value === users.getUserRole(user)
)
return {
...user,
name: user.firstName ? user.firstName + " " + user.lastName : "",
userGroups,
__selectable:
role.value === Constants.BudibaseRoles.Owner ? false : undefined,
apps: [...new Set(Object.keys(user.roles))],
access: role.sortOrder,
}
})
}
const getPendingSchema = tblSchema => {
if (!tblSchema) {
return {}
Expand Down Expand Up @@ -302,6 +316,8 @@
groupsLoaded = true
pendingInvites = await users.getInvites()
invitesLoaded = true
tenantOwner = await users.tenantOwner($auth.tenantId)
tenantOwnerLoaded = true
} catch (error) {
notifications.error("Error fetching user group data")
}
Expand Down Expand Up @@ -376,6 +392,7 @@
allowSelectRows={!readonly}
{customRenderers}
loading={!$fetch.loaded || !groupsLoaded}
defaultSortColumn={"access"}
/>
<div class="pagination">
Expand Down
2 changes: 1 addition & 1 deletion packages/builder/src/stores/portal/licensing.js
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ export const createLicensingStore = () => {
}, {})
}
const monthlyMetrics = getMetrics(
["dayPasses", "queries", "automations"],
["queries", "automations"],
license.quotas.usage.monthly,
usage.monthly.current
)
Expand Down
10 changes: 9 additions & 1 deletion packages/builder/src/stores/portal/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,15 @@ export function createUsersStore() {
return await API.removeAppBuilder({ userId, appId })
}

async function getTenantOwner(tenantId) {
const tenantInfo = await API.getTenantInfo({ tenantId })
return tenantInfo?.owner
}

const getUserRole = user => {
if (sdk.users.isAdmin(user)) {
if (user && user.email === user.tenantOwnerEmail) {
return Constants.BudibaseRoles.Owner
} else if (sdk.users.isAdmin(user)) {
return Constants.BudibaseRoles.Admin
} else if (sdk.users.isBuilder(user)) {
return Constants.BudibaseRoles.Developer
Expand Down Expand Up @@ -169,6 +176,7 @@ export function createUsersStore() {
save: refreshUsage(save),
bulkDelete: refreshUsage(bulkDelete),
delete: refreshUsage(del),
tenantOwner: getTenantOwner,
}
}

Expand Down
Loading

0 comments on commit 1be8289

Please sign in to comment.