Merge pull request #24733 from overleaf/mj-labs-without-features

[web] Move labs experiments from features to own property

GitOrigin-RevId: 22dee79758e5fa65fc31d9b8d4b155443cd585e7
This commit is contained in:
Mathias Jakobsen
2025-04-16 11:47:56 +01:00
committed by Copybot
parent 8fa6760d26
commit 9896bf21cd
7 changed files with 18 additions and 1 deletions
@@ -363,7 +363,7 @@ const _ProjectController = {
user: (async () => {
const user = await User.findById(
userId,
'email first_name last_name referal_id signUpDate featureSwitches features featuresEpoch refProviders alphaProgram betaProgram isAdmin ace labsProgram completedTutorials writefull aiErrorAssistant'
'email first_name last_name referal_id signUpDate featureSwitches features featuresEpoch refProviders alphaProgram betaProgram isAdmin ace labsProgram labsExperiments completedTutorials writefull aiErrorAssistant'
).exec()
// Handle case of deleted user
if (!user) {
@@ -838,6 +838,7 @@ const _ProjectController = {
referencesSearchMode: user.ace.referencesSearchMode,
enableNewEditor: user.ace.enableNewEditor ?? true,
},
labsExperiments: user.labsExperiments ?? [],
privilegeLevel,
anonymous,
isTokenMember,
@@ -149,6 +149,7 @@ async function settingsPage(req, res) {
enabled: Boolean(user.aiErrorAssistant?.enabled),
},
},
labsExperiments: user.labsExperiments ?? [],
hasPassword: !!user.hashedPassword,
shouldAllowEditingDetails,
oauthProviders: UserPagesController._translateProviderDescriptions(
+1
View File
@@ -203,6 +203,7 @@ const UserSchema = new Schema(
alphaProgram: { type: Boolean, default: false }, // experimental features
betaProgram: { type: Boolean, default: false },
labsProgram: { type: Boolean, default: false },
labsExperiments: { type: Array, default: [] },
overleaf: {
id: { type: Number },
accessToken: { type: String },
@@ -2,6 +2,7 @@ meta(name="ol-project_id" content=project_id)
meta(name="ol-projectName" content=projectName)
meta(name="ol-userSettings" data-type="json" content=userSettings)
meta(name="ol-user" data-type="json" content=user)
meta(name="ol-labsExperiments" data-type="json" content=labsExperiments)
meta(name="ol-learnedWords" data-type="json" content=learnedWords)
meta(name="ol-anonymous" data-type="boolean" content=anonymous)
meta(name="ol-brandVariation" data-type="json" content=brandVariation)
+1
View File
@@ -22,6 +22,7 @@ block append meta
meta(name="ol-passwordStrengthOptions", data-type="json", content=settings.passwordStrengthOptions || {})
meta(name="ol-isExternalAuthenticationSystemUsed" data-type="boolean" content=externalAuthenticationSystemUsed())
meta(name="ol-user" data-type="json" content=user)
meta(name="ol-labsExperiments" data-type="json" content=labsExperiments)
meta(name="ol-dropbox" data-type="json" content=dropbox)
meta(name="ol-github" data-type="json" content=github)
meta(name="ol-projectSyncSuccessMessage", content=projectSyncSuccessMessage)
@@ -0,0 +1,10 @@
import getMeta from './meta'
// Should be `never` when no experiments are active. Otherwise it should be a
// union of active experiment names e.g. `'experiment1' | 'experiment2'`
export type ActiveExperiment = never
export const isInExperiment = (experiment: ActiveExperiment): boolean => {
const experiments = getMeta('ol-labsExperiments')
return Boolean(experiments?.includes(experiment))
}
+2
View File
@@ -52,6 +52,7 @@ import { SubscriptionChangePreview } from '../../../types/subscription/subscript
import { DefaultNavbarMetadata } from '@/features/ui/components/types/default-navbar-metadata'
import { FooterMetadata } from '@/features/ui/components/types/footer-metadata'
import type { ScriptLogType } from '../../../modules/admin-panel/frontend/js/features/script-logs/script-log'
import { ActiveExperiment } from './labs-utils'
export interface Meta {
'ol-ExposedSettings': ExposedSettings
'ol-addonPrices': Record<string, { annual: string; monthly: string }>
@@ -139,6 +140,7 @@ export interface Meta {
'ol-itm_content': string
'ol-itm_referrer': string
'ol-labs': boolean
'ol-labsExperiments': ActiveExperiment[] | undefined
'ol-languages': SpellCheckLanguage[]
'ol-learnedWords': string[]
'ol-legacyEditorThemes': string[]