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);