diff --git a/src/lib/flags.ts b/src/lib/flags.ts index b7f92c9483..9f8c57a574 100644 --- a/src/lib/flags.ts +++ b/src/lib/flags.ts @@ -19,5 +19,6 @@ function isFlagEnabled(name: string) { } export const flags = { - multiDb: isFlagEnabled('multi-db') + multiDb: isFlagEnabled('multi-db'), + granularProjectAccess: isFlagEnabled('granular-project-access') }; diff --git a/src/routes/(console)/organization-[organization]/createMember.svelte b/src/routes/(console)/organization-[organization]/createMember.svelte index 32f480d7f5..a17b5f7377 100644 --- a/src/routes/(console)/organization-[organization]/createMember.svelte +++ b/src/routes/(console)/organization-[organization]/createMember.svelte @@ -11,6 +11,8 @@ import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import { isCloud, isSelfHosted } from '$lib/system'; import { roles, buildProjectRole } from '$lib/stores/billing'; + import { flags } from '$lib/flags'; + import { user } from '$lib/stores/user'; import InputSelect from '$lib/elements/forms/inputSelect.svelte'; import Roles from '$lib/components/roles/roles.svelte'; import { Icon, Popover, Layout } from '@appwrite.io/pink-svelte'; @@ -26,7 +28,11 @@ oncreated?: (team: Models.Membership) => void; } = $props(); - const supportsProjectRoles = $derived(isCloud && !!$currentPlan?.supportsOrganizationRoles); + const supportsProjectRoles = $derived( + isCloud && + flags.granularProjectAccess({ account: $user, organization: $organization }) && + !!$currentPlan?.supportsOrganizationRoles + ); let email = $state(''); let name = $state(''); diff --git a/src/routes/(console)/organization-[organization]/members/+page.svelte b/src/routes/(console)/organization-[organization]/members/+page.svelte index 67bbce0d9e..14cf5972be 100644 --- a/src/routes/(console)/organization-[organization]/members/+page.svelte +++ b/src/routes/(console)/organization-[organization]/members/+page.svelte @@ -20,8 +20,10 @@ } from '$lib/helpers/tooltipContent'; import { addNotification } from '$lib/stores/notifications'; import { currentPlan, newMemberModal, organization } from '$lib/stores/organization'; + import { flags } from '$lib/flags'; import { isOwner } from '$lib/stores/roles'; import { sdk } from '$lib/stores/sdk'; + import { user } from '$lib/stores/user'; import type { Models } from '@appwrite.io/console'; import Delete from '../deleteMember.svelte'; import Edit from './edit.svelte'; @@ -60,6 +62,10 @@ $: isLimited = limit !== 0 && limit < Infinity; $: isButtonDisabled = isCloud && (($readOnly && !GRACE_PERIOD_OVERRIDE) || (isLimited && memberCount >= limit)); + $: supportsProjectRoles = + isCloud && + flags.granularProjectAccess({ account: $user, organization: $organization }) && + $currentPlan?.supportsOrganizationRoles; const resend = async (member: Models.Membership) => { try { @@ -156,7 +162,7 @@ - {#if member.roles.some(isProjectSpecificRole)} + {#if supportsProjectRoles && member.roles.some(isProjectSpecificRole)} {@const projectRoles = member.roles.filter(isProjectSpecificRole)} {@const firstRole = projectRoles[0]} {@const firstParsed = parseProjectRole(firstRole)} @@ -217,7 +223,7 @@
- {#if isCloud && $currentPlan?.supportsOrganizationRoles} + {#if supportsProjectRoles} { diff --git a/src/routes/(console)/organization-[organization]/members/+page.ts b/src/routes/(console)/organization-[organization]/members/+page.ts index e0ce45e178..cf1e4fd9b4 100644 --- a/src/routes/(console)/organization-[organization]/members/+page.ts +++ b/src/routes/(console)/organization-[organization]/members/+page.ts @@ -1,10 +1,12 @@ import { Dependencies, PAGE_LIMIT } from '$lib/constants'; +import { flags } from '$lib/flags'; import { getLimit, getPage, getSearch, pageToOffset } from '$lib/helpers/load'; import { sdk } from '$lib/stores/sdk'; import { Query } from '@appwrite.io/console'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ url, params, route, depends }) => { +export const load: PageLoad = async ({ url, params, route, depends, parent }) => { + const { account, organization } = await parent(); depends(Dependencies.ORGANIZATION); depends(Dependencies.MEMBERS); @@ -13,18 +15,22 @@ export const load: PageLoad = async ({ url, params, route, depends }) => { const limit = getLimit(url, route, PAGE_LIMIT); const offset = pageToOffset(page, limit); + const supportsProjectRoles = flags.granularProjectAccess({ account, organization }); + const [organizationMembers, orgProjects] = await Promise.all([ sdk.forConsole.teams.listMemberships({ teamId: params.organization, queries: [Query.limit(limit), Query.offset(offset)], search }), - sdk.forConsole - .organization(params.organization) - .listProjects({ - queries: [Query.limit(100), Query.equal('teamId', params.organization)] - }) - .catch(() => null) + supportsProjectRoles + ? sdk.forConsole + .organization(params.organization) + .listProjects({ + queries: [Query.limit(100), Query.equal('teamId', params.organization)] + }) + .catch(() => null) + : null ]); return { diff --git a/src/routes/(console)/organization-[organization]/members/edit.svelte b/src/routes/(console)/organization-[organization]/members/edit.svelte index 38e01c30b2..468a70c11d 100644 --- a/src/routes/(console)/organization-[organization]/members/edit.svelte +++ b/src/routes/(console)/organization-[organization]/members/edit.svelte @@ -19,6 +19,8 @@ buildProjectRole } from '$lib/stores/billing'; import { isCloud, isSelfHosted } from '$lib/system'; + import { flags } from '$lib/flags'; + import { user } from '$lib/stores/user'; import ProjectAccessSelector from '../projectAccessSelector.svelte'; let { @@ -31,7 +33,11 @@ onupdated?: (membership: Models.Membership) => void; } = $props(); - const supportsProjectRoles = $derived(isCloud && !!$currentPlan?.supportsOrganizationRoles); + const supportsProjectRoles = $derived( + isCloud && + flags.granularProjectAccess({ account: $user, organization: $organization }) && + !!$currentPlan?.supportsOrganizationRoles + ); const defaultRole = isSelfHosted ? 'owner' : 'developer'; let error = $state(null);