Merge pull request #25060 from overleaf/mj-core-pug-bs5

[web] Convert various pug pages to BS5

GitOrigin-RevId: f42de89eca778db19d5faa8a19fa8a210c7a749b
This commit is contained in:
Mathias Jakobsen
2025-04-28 13:29:53 +01:00
committed by Copybot
parent 447be67f78
commit d7bd665bee
7 changed files with 63 additions and 44 deletions

View File

@@ -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')

View File

@@ -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
),

View File

@@ -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

View File

@@ -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")}

View File

@@ -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

View File

@@ -117,6 +117,7 @@ describe('CollaboratorsInviteController', function () {
this.SplitTestHandler = {
promises: {
getAssignment: sinon.stub().resolves({ variant: 'default' }),
getAssignmentForUser: sinon.stub().resolves({ variant: 'default' }),
},
}

View File

@@ -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()