diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index 92c957acbd..2a30e44def 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -3,7 +3,7 @@ name: Deploy QA on: push: branches: - - feature/automation-branching-ux + - v3-ui workflow_dispatch: jobs: diff --git a/hosting/single/Dockerfile b/hosting/single/Dockerfile index a243e8cddc..a1230f3c37 100644 --- a/hosting/single/Dockerfile +++ b/hosting/single/Dockerfile @@ -22,7 +22,7 @@ RUN ./scripts/removeWorkspaceDependencies.sh packages/worker/package.json RUN jq 'del(.scripts.postinstall)' package.json > temp.json && mv temp.json package.json RUN ./scripts/removeWorkspaceDependencies.sh package.json -RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --production --frozen-lockfile --network-concurrency 1 +RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --production --frozen-lockfile # copy the actual code COPY packages/server/dist packages/server/dist diff --git a/lerna.json b/lerna.json index 8e869ae8cc..81e53da035 100644 --- a/lerna.json +++ b/lerna.json @@ -22,4 +22,4 @@ "loadEnvFiles": false } } -} \ No newline at end of file +} diff --git a/packages/backend-core/src/security/roles.ts b/packages/backend-core/src/security/roles.ts index 42a55c16c7..c14178cacb 100644 --- a/packages/backend-core/src/security/roles.ts +++ b/packages/backend-core/src/security/roles.ts @@ -219,10 +219,7 @@ export function getBuiltinRole(roleId: string): Role | undefined { export function builtinRoleToNumber(id: string) { const builtins = getBuiltinRoles() const MAX = Object.values(builtins).length + 1 - if ( - compareRoleIds(id, BUILTIN_IDS.ADMIN) || - compareRoleIds(id, BUILTIN_IDS.BUILDER) - ) { + if (id === BUILTIN_IDS.ADMIN || id === BUILTIN_IDS.BUILDER) { return MAX } let role = builtins[id], @@ -259,9 +256,7 @@ export async function roleToNumber(id: string) { // find the built-in roles, get their number, sort it, then get the last one const highestBuiltin: number | undefined = role.inherits .map(roleId => { - const foundRole = hierarchy.find(role => - compareRoleIds(role._id!, roleId) - ) + const foundRole = hierarchy.find(role => role._id === roleId) if (foundRole) { return findNumber(foundRole) + 1 } @@ -385,7 +380,7 @@ async function getAllUserRoles( ): Promise { const allRoles = await getAllRoles() // admins have access to all roles - if (compareRoleIds(userRoleId, BUILTIN_IDS.ADMIN)) { + if (userRoleId === BUILTIN_IDS.ADMIN) { return allRoles } @@ -496,21 +491,17 @@ export async function getAllRoles(appId?: string): Promise { // need to combine builtin with any DB record of them (for sake of permissions) for (let builtinRoleId of externalBuiltinRoles) { const builtinRole = builtinRoles[builtinRoleId] - const dbBuiltin = roles.filter(dbRole => - compareRoleIds(dbRole._id!, builtinRoleId) + const dbBuiltin = roles.filter( + dbRole => + getExternalRoleID(dbRole._id!, dbRole.version) === builtinRoleId )[0] if (dbBuiltin == null) { roles.push(builtinRole || builtinRoles.BASIC) } else { // remove role and all back after combining with the builtin roles = roles.filter(role => role._id !== dbBuiltin._id) - dbBuiltin._id = getExternalRoleID(builtinRole._id!, dbBuiltin.version) - roles.push({ - ...builtinRole, - ...dbBuiltin, - name: builtinRole.name, - _id: getExternalRoleID(builtinRole._id!, builtinRole.version), - }) + dbBuiltin._id = getExternalRoleID(dbBuiltin._id!, dbBuiltin.version) + roles.push(Object.assign(builtinRole, dbBuiltin)) } } // check permissions @@ -553,9 +544,9 @@ export class AccessController { if ( tryingRoleId == null || tryingRoleId === "" || - compareRoleIds(tryingRoleId, BUILTIN_IDS.BUILDER) || - compareRoleIds(userRoleId!, tryingRoleId) || - compareRoleIds(userRoleId!, BUILTIN_IDS.BUILDER) + tryingRoleId === userRoleId || + tryingRoleId === BUILTIN_IDS.BUILDER || + userRoleId === BUILTIN_IDS.BUILDER ) { return true } diff --git a/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte b/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte index dd332c92a9..6518b6cf58 100644 --- a/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte +++ b/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte @@ -38,10 +38,6 @@ let loaded = false $: app = $appsStore.apps.find(app => $appStore.appId?.includes(app.appId)) $: licensePlan = $auth.user?.license?.plan - - // Reset the page every time that a filter gets updated - $: pageInfo.reset(), automationId, status, timeRange - $: page = $pageInfo.page $: fetchLogs(automationId, status, page, timeRange) $: isCloud = $admin.cloud diff --git a/packages/builder/src/pages/builder/portal/users/users/index.svelte b/packages/builder/src/pages/builder/portal/users/users/index.svelte index 9ecb42b6d3..5a7e334c9c 100644 --- a/packages/builder/src/pages/builder/portal/users/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/users/users/index.svelte @@ -71,6 +71,7 @@ ] let userData = [] let invitesLoaded = false + let tenantOwnerLoaded = false let pendingInvites = [] let parsedInvites = [] @@ -99,9 +100,13 @@ $: pendingSchema = getPendingSchema(schema) $: userData = [] $: inviteUsersResponse = { successful: [], unsuccessful: [] } - $: setEnrichedUsers($fetch.rows, tenantOwner) + $: setEnrichedUsers($fetch.rows, tenantOwnerLoaded) - const setEnrichedUsers = async (rows, owner) => { + const setEnrichedUsers = async rows => { + if (!tenantOwnerLoaded) { + enrichedUsers = [] + return + } enrichedUsers = rows?.map(user => { let userGroups = [] $groups.forEach(group => { @@ -113,9 +118,7 @@ }) } }) - if (owner) { - user.tenantOwnerEmail = owner.email - } + user.tenantOwnerEmail = tenantOwner?.email const role = Constants.ExtendedBudibaseRoleOptions.find( x => x.value === users.getUserRole(user) ) @@ -319,21 +322,12 @@ try { await groups.actions.init() groupsLoaded = true - } catch (error) { - notifications.error("Error fetching user group data") - } - try { pendingInvites = await users.getInvites() invitesLoaded = true - } catch (err) { - notifications.error("Error fetching user invitations") - } - try { tenantOwner = await users.getAccountHolder() - } catch (err) { - if (err.status !== 404) { - notifications.error("Error fetching account holder") - } + tenantOwnerLoaded = true + } catch (error) { + notifications.error("Error fetching user group data") } }) diff --git a/packages/client/src/components/app/forms/RelationshipField.svelte b/packages/client/src/components/app/forms/RelationshipField.svelte index 1439902b26..a6d0564f7f 100644 --- a/packages/client/src/components/app/forms/RelationshipField.svelte +++ b/packages/client/src/components/app/forms/RelationshipField.svelte @@ -113,10 +113,7 @@ $: debouncedFetchRows(searchTerm, primaryDisplay, defaultValue) const forceFetchRows = async () => { - // if the filter has changed, then we need to reset the options, clear the selection, and re-fetch - optionsObj = {} fieldApi?.setValue([]) - selectedValue = [] debouncedFetchRows(searchTerm, primaryDisplay, defaultValue) } const fetchRows = async (searchTerm, primaryDisplay, defaultVal) => { diff --git a/packages/frontend-core/src/fetch/UserFetch.js b/packages/frontend-core/src/fetch/UserFetch.js index a68a3a06f4..cb2c045cc6 100644 --- a/packages/frontend-core/src/fetch/UserFetch.js +++ b/packages/frontend-core/src/fetch/UserFetch.js @@ -32,7 +32,7 @@ export default class UserFetch extends DataFetch { const { cursor, query } = get(this.store) let finalQuery // convert old format to new one - we now allow use of the lucene format - const { appId, paginated, ...rest } = query || {} + const { appId, paginated, ...rest } = query if (!QueryUtils.hasFilters(query) && rest.email != null) { finalQuery = { string: { email: rest.email } } } else { diff --git a/packages/pro b/packages/pro index 2ab8536b60..f6aebba944 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 2ab8536b6005576684810d774f1ac22239218546 +Subproject commit f6aebba94451ce47bba551926e5ad72bd75f71c6 diff --git a/packages/server/Dockerfile b/packages/server/Dockerfile index 8dec5b6771..2206d49d9b 100644 --- a/packages/server/Dockerfile +++ b/packages/server/Dockerfile @@ -41,7 +41,7 @@ RUN chmod +x ./scripts/removeWorkspaceDependencies.sh RUN ./scripts/removeWorkspaceDependencies.sh package.json # Install yarn packages with caching -RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --production=true --network-timeout 1000000 --network-concurrency 1 \ +RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --production=true --network-timeout 1000000 \ && yarn cache clean \ && apk del g++ make python3 jq \ && rm -rf /tmp/* /root/.node-gyp /usr/local/lib/node_modules/npm/node_modules/node-gyp diff --git a/packages/worker/Dockerfile b/packages/worker/Dockerfile index 807a91de5f..4b708626f3 100644 --- a/packages/worker/Dockerfile +++ b/packages/worker/Dockerfile @@ -24,7 +24,7 @@ COPY packages/worker/dist/yarn.lock . RUN ../scripts/removeWorkspaceDependencies.sh package.json -RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --production=true --network-timeout 1000000 --network-concurrency 1 +RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --production=true --network-timeout 1000000 # Remove unneeded data from file system to reduce image size RUN apk del .gyp \ && yarn cache clean