feat: remove granularProjectAccess feature flag from project-specific roles

Gate solely on supportsProjectSpecificRoles plan flag — no feature flag
needed. Also always fetch orgProjects in page load since it is no longer
conditionally needed.
This commit is contained in:
harsh mahajan
2026-06-04 14:29:13 +05:30
parent 29ad2341cb
commit 109d27fbf5
4 changed files with 10 additions and 28 deletions
@@ -11,8 +11,6 @@
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';
@@ -29,9 +27,7 @@
} = $props();
const supportsProjectRoles = $derived(
isCloud &&
flags.granularProjectAccess({ account: $user, organization: $organization }) &&
!!$currentPlan?.supportsProjectSpecificRoles
isCloud && !!$currentPlan?.supportsProjectSpecificRoles
);
let email = $state('');
@@ -20,10 +20,8 @@
} 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';
@@ -63,10 +61,7 @@
$: isButtonDisabled =
isCloud && (($readOnly && !GRACE_PERIOD_OVERRIDE) || (isLimited && memberCount >= limit));
$: supportsOrgRoles = isCloud && !!$currentPlan?.supportsOrganizationRoles;
$: supportsProjectRoles =
isCloud &&
flags.granularProjectAccess({ account: $user, organization: $organization }) &&
!!$currentPlan?.supportsProjectSpecificRoles;
$: supportsProjectRoles = isCloud && !!$currentPlan?.supportsProjectSpecificRoles;
const resend = async (member: Models.Membership) => {
try {
@@ -1,12 +1,11 @@
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, parent }) => {
const { account, organization } = await parent();
await parent();
depends(Dependencies.ORGANIZATION);
depends(Dependencies.MEMBERS);
@@ -15,22 +14,18 @@ export const load: PageLoad = async ({ url, params, route, depends, parent }) =>
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
}),
supportsProjectRoles
? sdk.forConsole
.organization(params.organization)
.listProjects({
queries: [Query.limit(100), Query.equal('teamId', params.organization)]
})
.catch(() => null)
: null
sdk.forConsole
.organization(params.organization)
.listProjects({
queries: [Query.limit(100), Query.equal('teamId', params.organization)]
})
.catch(() => null)
]);
return {
@@ -19,8 +19,6 @@
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 {
@@ -34,9 +32,7 @@
} = $props();
const supportsProjectRoles = $derived(
isCloud &&
flags.granularProjectAccess({ account: $user, organization: $organization }) &&
!!$currentPlan?.supportsProjectSpecificRoles
isCloud && !!$currentPlan?.supportsProjectSpecificRoles
);
const defaultRole = isSelfHosted ? 'owner' : 'developer';