diff --git a/services/web/app/src/Features/Project/ProjectController.mjs b/services/web/app/src/Features/Project/ProjectController.mjs index 61e27f4325..043267825a 100644 --- a/services/web/app/src/Features/Project/ProjectController.mjs +++ b/services/web/app/src/Features/Project/ProjectController.mjs @@ -513,7 +513,7 @@ const _ProjectController = { req, projectId ) - const allowedImageNames = ProjectHelper.getAllowedImagesForUser(user) + const imageNames = ProjectHelper.getAllowedImagesForUser(user) const privilegeLevel = await AuthorizationManager.promises.getPrivilegeLevelForProject( @@ -847,7 +847,7 @@ const _ProjectController = { maxReconnectGracefullyIntervalMs: Settings.maxReconnectGracefullyIntervalMs, brandVariation, - allowedImageNames, + imageNames, gitBridgePublicBaseUrl: Settings.gitBridgePublicBaseUrl, gitBridgeEnabled: Features.hasFeature('git-bridge'), wsUrl, diff --git a/services/web/app/src/Features/Project/ProjectHelper.js b/services/web/app/src/Features/Project/ProjectHelper.js index ab03600347..cdb03bca3a 100644 --- a/services/web/app/src/Features/Project/ProjectHelper.js +++ b/services/web/app/src/Features/Project/ProjectHelper.js @@ -148,11 +148,27 @@ function _addNumericSuffixToProjectName(name, allProjectNames, maxLength) { return null } -function getAllowedImagesForUser(user) { - const images = Settings.allowedImageNames || [] - if (user?.alphaProgram) { - return images - } else { - return images.filter(image => !image.alphaOnly) +function _imageAllowed(user, image) { + if (image.alphaOnly) { + return Boolean(user?.alphaProgram) } + if (image.monthlyExperimental) { + return Boolean( + user?.labsProgram && user.labsExperiments.includes('monthly-texlive') + ) + } + return true +} + +function getAllowedImagesForUser(user) { + let images = Settings.allowedImageNames || [] + + images = images.map(image => { + return { + ...image, + allowed: _imageAllowed(user, image), + } + }) + + return images } diff --git a/services/web/app/views/project/editor/_meta.pug b/services/web/app/views/project/editor/_meta.pug index 9b60857be0..5aebbd8b01 100644 --- a/services/web/app/views/project/editor/_meta.pug +++ b/services/web/app/views/project/editor/_meta.pug @@ -1,6 +1,6 @@ meta(name="ol-project_id" content=project_id) meta(name="ol-projectName" content=projectName) -meta(name="ol-projectOwnerHasPremiumOnPageLoad" data-type="boolean" content=projectOwnerHasPremiumOnPageLoad) +meta(name="ol-projectOwnerHasPremiumOnPageLoad" content=projectOwnerHasPremiumOnPageLoad) 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) @@ -26,16 +26,16 @@ meta(name="ol-showSymbolPalette" data-type="boolean" content=showSymbolPalette) meta(name="ol-symbolPaletteAvailable" data-type="boolean" content=symbolPaletteAvailable) meta(name="ol-showAiErrorAssistant" data-type="boolean" content=showAiErrorAssistant) meta(name="ol-detachRole" data-type="string" content=detachRole) -meta(name="ol-allowedImageNames" data-type="json" content=allowedImageNames) +meta(name="ol-imageNames" data-type="json" content=imageNames) meta(name="ol-languages" data-type="json" content=languages) meta(name="ol-editorThemes" data-type="json" content=editorThemes) meta(name="ol-legacyEditorThemes" data-type="json" content=legacyEditorThemes) meta(name="ol-showUpgradePrompt" data-type="boolean" content=showUpgradePrompt) -meta(name="ol-showSupport", data-type="boolean" content=showSupport) -meta(name="ol-showTemplatesServerPro", data-type="boolean" content=showTemplatesServerPro) -meta(name="ol-hasTrackChangesFeature", data-type="boolean" content=hasTrackChangesFeature) -meta(name="ol-otMigrationStage", data-type="number" content=otMigrationStage) -meta(name="ol-inactiveTutorials", data-type="json" content=user.inactiveTutorials) +meta(name="ol-showSupport" data-type="boolean" content=showSupport) +meta(name="ol-showTemplatesServerPro" data-type="boolean" content=showTemplatesServerPro) +meta(name="ol-hasTrackChangesFeature" data-type="boolean" content=hasTrackChangesFeature) +meta(name="ol-otMigrationStage" data-type="number" content=otMigrationStage) +meta(name="ol-inactiveTutorials" data-type="json" content=user.inactiveTutorials) meta(name="ol-projectTags" data-type="json" content=projectTags) meta(name="ol-ro-mirror-on-client-no-local-storage" data-type="boolean" content=roMirrorOnClientNoLocalStorage) meta(name="ol-isSaas" data-type="boolean" content=isSaas) @@ -44,12 +44,12 @@ meta(name='ol-customerIoEnabled' data-type="boolean" content=customerIoEnabled) meta(name='ol-compileSettings' data-type="json" content=compileSettings) if(isOverleafAssistBundleEnabled) //- expose plans info to show prices in paywall-change-compile-timeout test - meta(name="ol-addonPrices", data-type="json" content=addonPrices) + meta(name="ol-addonPrices" data-type="json" content=addonPrices) // translations for the loading page, before i18n has loaded in the client -meta(name="ol-loadingText", data-type="string" content=translate("loading")) -meta(name="ol-translationIoNotLoaded", data-type="string" content=translate("could_not_connect_to_websocket_server")) -meta(name="ol-translationLoadErrorMessage", data-type="string" content=translate("could_not_load_translations")) -meta(name="ol-translationUnableToJoin", data-type="string" content=translate("could_not_connect_to_collaboration_server")) +meta(name="ol-loadingText" data-type="string" content=translate("loading")) +meta(name="ol-translationIoNotLoaded" data-type="string" content=translate("could_not_connect_to_websocket_server")) +meta(name="ol-translationLoadErrorMessage" data-type="string" content=translate("could_not_load_translations")) +meta(name="ol-translationUnableToJoin" data-type="string" content=translate("could_not_connect_to_collaboration_server")) if (settings.overleaf != null) meta(name="ol-overallThemes" data-type="json" content=overallThemes) diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 7d6c354e01..252270222e 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -1484,6 +1484,7 @@ "revoke_invite": "", "right": "", "role": "", + "rolling_texlive_build": "", "saml_auth_error": "", "saml_identity_exists_error": "", "saml_invalid_signature_error": "", @@ -1778,6 +1779,7 @@ "test": "", "test_configuration": "", "test_configuration_successful": "", + "test_more_recent_versions_of_texlive": "", "tex_live_version": "", "texgpt": "", "thank_you": "", diff --git a/services/web/frontend/js/features/editor-left-menu/components/settings/settings-image-name.tsx b/services/web/frontend/js/features/editor-left-menu/components/settings/settings-image-name.tsx index a0499fe569..996323ffa9 100644 --- a/services/web/frontend/js/features/editor-left-menu/components/settings/settings-image-name.tsx +++ b/services/web/frontend/js/features/editor-left-menu/components/settings/settings-image-name.tsx @@ -11,18 +11,18 @@ export default function SettingsImageName() { const { imageName, setImageName } = useProjectSettingsContext() const { write } = usePermissionsContext() - const allowedImageNames = useMemo( - () => getMeta('ol-allowedImageNames') || [], - [] - ) + const allowedImageNames = useMemo(() => getMeta('ol-imageNames') || [], []) const options: Array