[web] Read subscription.features on Group Management rendering (#36168)

* [web] Read subscription.features on Group Management rendering

Fixes 'ai-toggling' not properly read on Group Management rendering, causing the Feature Controls option not being displayed in certain scenarios.

GitOrigin-RevId: 4465fea15279d650d9d231e85072f1d85f2358be
This commit is contained in:
Miguel Serrano
2026-09-17 11:47:01 +00:00
committed by Copybot
parent 588979097d
commit d20052bf3e
4 changed files with 96 additions and 1 deletions
@@ -171,6 +171,7 @@ async function userSubscriptionPage(req, res) {
res,
'group-discount-10'
)
await SplitTestHandler.promises.getAssignment(req, res, 'ai-toggling')
const showGroupDiscount = groupPricingDiscount.variant === 'enabled'
@@ -100,6 +100,7 @@ export default function ManagedGroupSubscriptions() {
const isSharingPermissionsEnabled = useFeatureFlag(
'sharing-updates-sharing-permissions'
)
const aiTogglingSplitTestEnabled = useFeatureFlag('ai-toggling')
if (!managedGroupSubscriptions) {
return null
@@ -116,9 +117,11 @@ export default function ManagedGroupSubscriptions() {
// Feature controls are currently rendered only for managed groups, where the admin can
// toggle AI Feature on/off. For non-managed groups, the section only displays notifications
// for features that have been disabled by Overleaf Support.
// for features that have been disabled by Overleaf Support. When the `ai-toggling` split
// test is enabled, it's always displayed for non-managed groups that have the feature on.
// This flag will be deleted once AI Features toggling is available to all groups.
const shouldDisplayFeatureControls =
(subscription.features?.aiToggling && aiTogglingSplitTestEnabled) ||
subscription.managedUsersEnabled ||
subscription.groupPolicy?.userCannotUseAIFeatures ||
subscription.groupPolicy?.userCannotUseChat ||
@@ -441,5 +441,95 @@ describe('<ManagedGroupSubscriptions />', function () {
expect(screen.queryByText('Feature controls')).to.be.null
})
})
describe('AI toggling', function () {
it('renders the feature controls row when the "ai-toggling" split test is enabled and the group has the aiToggling feature', async function () {
renderWithSubscriptionDashContext(<ManagedGroupSubscriptions />, {
metaTags: [
{
name: 'ol-managedGroupSubscriptions',
value: makeSubscription({
features: {
groupSSO: false,
managedUsers: false,
aiToggling: true,
},
}),
},
{ name: 'ol-usersEmail', value: adminEmail },
{
name: 'ol-splitTestVariants',
value: { 'ai-toggling': 'enabled' },
},
],
})
await screen.findByText('Feature controls')
})
it('does not render the feature controls row when the "ai-toggling" split test is enabled but the group lacks the aiToggling feature', function () {
renderWithSubscriptionDashContext(<ManagedGroupSubscriptions />, {
metaTags: [
{
name: 'ol-managedGroupSubscriptions',
value: makeSubscription({
features: {
groupSSO: false,
managedUsers: false,
aiToggling: false,
},
}),
},
{ name: 'ol-usersEmail', value: adminEmail },
{
name: 'ol-splitTestVariants',
value: { 'ai-toggling': 'enabled' },
},
],
})
expect(screen.queryByText('Feature controls')).to.be.null
})
it('does not render the feature controls row when the group has the aiToggling feature but the "ai-toggling" split test is disabled', function () {
renderWithSubscriptionDashContext(<ManagedGroupSubscriptions />, {
metaTags: [
{
name: 'ol-managedGroupSubscriptions',
value: makeSubscription({
features: {
groupSSO: false,
managedUsers: false,
aiToggling: true,
},
}),
},
{ name: 'ol-usersEmail', value: adminEmail },
],
})
expect(screen.queryByText('Feature controls')).to.be.null
})
it('does not render the feature controls row when the user is not the group admin', function () {
renderWithSubscriptionDashContext(<ManagedGroupSubscriptions />, {
metaTags: [
{
name: 'ol-managedGroupSubscriptions',
value: makeSubscription({
features: {
groupSSO: false,
managedUsers: false,
aiToggling: true,
},
}),
},
{ name: 'ol-usersEmail', value: 'other@example.com' },
{
name: 'ol-splitTestVariants',
value: { 'ai-toggling': 'enabled' },
},
],
})
expect(screen.queryByText('Feature controls')).to.be.null
})
})
})
})
@@ -102,6 +102,7 @@ export type ManagedGroupSubscription = {
features: {
groupSSO: boolean | null
managedUsers: boolean | null
aiToggling?: boolean | null
}
managedUsersEnabled: boolean
groupPolicy?: GroupPolicy