diff --git a/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs b/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs index c6ffba1ea5..4c2d911709 100644 --- a/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs +++ b/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs @@ -16,6 +16,7 @@ import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.js' import Errors from '../Errors/Errors.js' import AuthenticationController from '../Authentication/AuthenticationController.js' import PrivilegeLevels from '../Authorization/PrivilegeLevels.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' // This rate limiter allows a different number of requests depending on the // number of callaborators a user is allowed. This is implemented by providing @@ -244,6 +245,10 @@ async function generateNewInvite(req, res) { async function viewInvite(req, res) { const projectId = req.params.Project_id const { token } = req.params + + // Read split test assignment so that it's available for Pug to read + await SplitTestHandler.promises.getAssignment(req, res, 'core-pug-bs5') + const _renderInvalidPage = function () { res.status(404) logger.debug({ projectId }, 'invite not valid, rendering not-valid page') diff --git a/services/web/app/src/Features/Templates/TemplatesController.js b/services/web/app/src/Features/Templates/TemplatesController.js index ac82d0c5d3..a8730a61be 100644 --- a/services/web/app/src/Features/Templates/TemplatesController.js +++ b/services/web/app/src/Features/Templates/TemplatesController.js @@ -4,9 +4,13 @@ const TemplatesManager = require('./TemplatesManager') const ProjectHelper = require('../Project/ProjectHelper') const logger = require('@overleaf/logger') const { expressify } = require('@overleaf/promise-utils') +const SplitTestHandler = require('../SplitTests/SplitTestHandler') const TemplatesController = { - getV1Template(req, res) { + async getV1Template(req, res) { + // Read split test assignment so that it's available for Pug to read + await SplitTestHandler.promises.getAssignment(req, res, 'core-pug-bs5') + const templateVersionId = req.params.Template_version_id const templateId = req.query.id if (!/^[0-9]+$/.test(templateVersionId) || !/^[0-9]+$/.test(templateId)) { @@ -25,7 +29,7 @@ const TemplatesController = { mainFile: req.query.mainFile, brandVariationId: req.query.brandVariationId, } - return res.render( + res.render( path.resolve( __dirname, '../../../views/project/editor/new_from_template' @@ -55,7 +59,7 @@ const TemplatesController = { } module.exports = { - getV1Template: TemplatesController.getV1Template, + getV1Template: expressify(TemplatesController.getV1Template), createProjectFromV1Template: expressify( TemplatesController.createProjectFromV1Template ), diff --git a/services/web/app/views/project/editor/new_from_template.pug b/services/web/app/views/project/editor/new_from_template.pug index c3b40cecf5..f2945b20f1 100644 --- a/services/web/app/views/project/editor/new_from_template.pug +++ b/services/web/app/views/project/editor/new_from_template.pug @@ -4,7 +4,8 @@ block vars - var suppressFooter = true - var suppressCookieBanner = true - var suppressSkipToContent = true - - bootstrap5PageStatus = 'disabled' + - bootstrap5PageStatus = 'enabled' + - bootstrap5PageSplitTest = 'core-pug-bs5' block content .editor.full-size diff --git a/services/web/app/views/project/invite/not-valid.pug b/services/web/app/views/project/invite/not-valid.pug index ac3eaed80a..693c162205 100644 --- a/services/web/app/views/project/invite/not-valid.pug +++ b/services/web/app/views/project/invite/not-valid.pug @@ -1,21 +1,22 @@ extends ../../layout-marketing block vars - - bootstrap5PageStatus = 'disabled' + - bootstrap5PageStatus = 'enabled' + - bootstrap5PageSplitTest = 'core-pug-bs5' block content main.content.content-alt#main-content .container .row - .col-md-8.col-md-offset-2 + .col-md-8.col-md-offset-2.offset-md-2 .card.project-invite-invalid - .page-header.text-centered - h1 #{translate("invite_not_valid")} - .row.text-center - .col-md-12 - p - | #{translate("invite_not_valid_description")}. - .row.text-center.actions - .col-md-12 - a.btn.btn-secondary-info.btn-secondary(href="/project") #{translate("back_to_your_projects")} - + .card-body + .page-header.text-center + h1 #{translate("invite_not_valid")} + .row.text-center + .col-12.col-md-12 + p + | #{translate("invite_not_valid_description")}. + .row.text-center.actions + .col-12.col-md-12 + a.btn.btn-secondary-info.btn-secondary(href="/project") #{translate("back_to_your_projects")} diff --git a/services/web/app/views/project/invite/show.pug b/services/web/app/views/project/invite/show.pug index 8d19a1edba..35926977e2 100644 --- a/services/web/app/views/project/invite/show.pug +++ b/services/web/app/views/project/invite/show.pug @@ -1,37 +1,39 @@ extends ../../layout-marketing block vars - - bootstrap5PageStatus = 'disabled' + - bootstrap5PageStatus = 'enabled' + - bootstrap5PageSplitTest = 'core-pug-bs5' block content main.content.content-alt#main-content .container .row - .col-md-8.col-md-offset-2 + .col-12.col-md-8.col-md-offset-2.offset-md-2 .card.project-invite-accept - .page-header.text-centered - h1 #{translate("user_wants_you_to_see_project", {username:owner.first_name, projectname:""})} - br - em #{project.name} - .row.text-center - .col-md-12 - p - | #{translate("accepting_invite_as")}  - em #{user.email} - .row - .col-md-12 - form.form( - data-ol-regular-form - method="POST", - action="/project/"+invite.projectId+"/invite/token/"+token+"/accept" - ) - input(name='_csrf', type='hidden', value=csrfToken) - input(name='token', type='hidden', value=token) - .form-group.text-center - button.btn.btn-lg.btn-primary( - type="submit" - data-ol-disabled-inflight - ) - span(data-ol-inflight="idle") #{translate("join_project")} - span(hidden data-ol-inflight="pending") #{translate("joining")}… - .form-group.text-center + .card-body + .page-header.text-center + h1 #{translate("user_wants_you_to_see_project", {username:owner.first_name, projectname:""})} + br + em #{project.name} + .row.text-center + .col-12.col-md-12 + p + | #{translate("accepting_invite_as")}  + em #{user.email} + .row + .col-12.col-md-12 + form.form( + data-ol-regular-form + method="POST", + action="/project/"+invite.projectId+"/invite/token/"+token+"/accept" + ) + input(name='_csrf', type='hidden', value=csrfToken) + input(name='token', type='hidden', value=token) + .form-group.text-center + button.btn.btn-lg.btn-primary( + type="submit" + data-ol-disabled-inflight + ) + span(data-ol-inflight="idle") #{translate("join_project")} + span(hidden data-ol-inflight="pending") #{translate("joining")}… + .form-group.text-center diff --git a/services/web/test/unit/src/Collaborators/CollaboratorsInviteControllerTests.mjs b/services/web/test/unit/src/Collaborators/CollaboratorsInviteControllerTests.mjs index 53f49d0eb2..3e7d4c3daa 100644 --- a/services/web/test/unit/src/Collaborators/CollaboratorsInviteControllerTests.mjs +++ b/services/web/test/unit/src/Collaborators/CollaboratorsInviteControllerTests.mjs @@ -117,6 +117,7 @@ describe('CollaboratorsInviteController', function () { this.SplitTestHandler = { promises: { + getAssignment: sinon.stub().resolves({ variant: 'default' }), getAssignmentForUser: sinon.stub().resolves({ variant: 'default' }), }, } diff --git a/services/web/test/unit/src/Templates/TemplatesControllerTests.js b/services/web/test/unit/src/Templates/TemplatesControllerTests.js index 911a16a515..282f3121f9 100644 --- a/services/web/test/unit/src/Templates/TemplatesControllerTests.js +++ b/services/web/test/unit/src/Templates/TemplatesControllerTests.js @@ -18,6 +18,11 @@ describe('TemplatesController', function () { './TemplatesManager': (this.TemplatesManager = { promises: { createProjectFromV1Template: sinon.stub() }, }), + '../SplitTests/SplitTestHandler': (this.SplitTestHandler = { + promises: { + getAssignment: sinon.stub().resolves({ variant: 'default' }), + }, + }), }, }) this.next = sinon.stub()