Merge pull request #12160 from overleaf/mf-old-plans-page-annual-button

Fix annual buy button in old plans page is linked to the free trial check out page

GitOrigin-RevId: 7157b354a21e46f4eb194ae1ef741e90790b6071
This commit is contained in:
Jakob Ackermann 2023-03-10 15:57:41 +00:00 committed by Copybot
parent 62450f8f31
commit 7ae5a9f060
5 changed files with 68 additions and 43 deletions

View file

@ -71,6 +71,14 @@ async function plansPage(req, res) {
) )
} }
let currentView = 'monthly'
if (
plansPageLayoutV3Assignment.variant === 'old-plans-page-annual' ||
plansPageLayoutV3Assignment.variant === 'new-plans-page'
) {
currentView = 'annual'
}
const showNewPlansPage = const showNewPlansPage =
plansPageLayoutV3Assignment.variant === 'new-plans-page' plansPageLayoutV3Assignment.variant === 'new-plans-page'
@ -95,6 +103,7 @@ async function plansPage(req, res) {
res.render(template, { res.render(template, {
title: 'plans_and_pricing', title: 'plans_and_pricing',
currentView,
plans, plans,
itm_content: req.query?.itm_content, itm_content: req.query?.itm_content,
itm_referrer: req.query?.itm_referrer, itm_referrer: req.query?.itm_referrer,

View file

@ -11,6 +11,7 @@ block append meta
meta(name="ol-groupPlans" data-type="json" content=groupPlans) meta(name="ol-groupPlans" data-type="json" content=groupPlans)
meta(name="ol-currencySymbols" data-type="json" content=groupPlanModalOptions.currencySymbols) meta(name="ol-currencySymbols" data-type="json" content=groupPlanModalOptions.currencySymbols)
meta(name="ol-itm_content" content=itm_content) meta(name="ol-itm_content" content=itm_content)
meta(name="ol-currentView" content=currentView)
block content block content
main.content.content-alt#main-content main.content.content-alt#main-content

View file

@ -11,6 +11,7 @@ block append meta
meta(name="ol-groupPlans" data-type="json" content=groupPlans) meta(name="ol-groupPlans" data-type="json" content=groupPlans)
meta(name="ol-currencySymbols" data-type="json" content=groupPlanModalOptions.currencySymbols) meta(name="ol-currencySymbols" data-type="json" content=groupPlanModalOptions.currencySymbols)
meta(name="ol-itm_content" content=itm_content) meta(name="ol-itm_content" content=itm_content)
meta(name="ol-currentView" content=currentView)
block content block content
main.content.content-alt#main-content main.content.content-alt#main-content
@ -69,11 +70,11 @@ block content
.col-md-3.text-right .col-md-3.text-right
+currency_dropdown +currency_dropdown
.row(event-tracking="features-table-viewed" event-tracking-ga="subscription-funnel" event-tracking-trigger="scroll" event-tracking-send-once="true" event-tracking-label="exp-") .row(event-tracking="features-table-viewed" event-tracking-ga="subscription-funnel" event-tracking-trigger="scroll" event-tracking-send-once="true" event-tracking-label="exp-")
.col-sm-12(data-ol-view='monthly') .col-sm-12(hidden=(currentView !== 'monthly') data-ol-view='monthly')
+table_premium +table_premium
.col-sm-12(hidden data-ol-view='annual') .col-sm-12(hidden=(currentView !== 'annual') data-ol-view='annual')
+table_premium +table_premium
.col-sm-12(hidden data-ol-view='student') .col-sm-12(hidden=(currentView !== 'student') data-ol-view='student')
+table_student +table_student
include ./plans-marketing/_quotes include ./plans-marketing/_quotes

View file

@ -4,16 +4,16 @@ mixin btn_buy_collaborator(location)
data-ol-start-new-subscription='collaborator' data-ol-start-new-subscription='collaborator'
data-ol-location=location data-ol-location=location
) )
span(data-ol-view='monthly') #{translate("start_free_trial")} span(hidden=(currentView !== 'monthly') data-ol-view='monthly') #{translate("start_free_trial")}
span(hidden data-ol-view='annual') #{translate("buy_now")} span(hidden=(currentView !== 'annual') data-ol-view='annual') #{translate("buy_now")}
mixin btn_buy_personal(location) mixin btn_buy_personal(location)
a.btn.btn-primary( a.btn.btn-primary(
data-ol-start-new-subscription='paid-personal' data-ol-start-new-subscription='paid-personal'
data-ol-tracking-plan='personal' data-ol-tracking-plan='personal'
data-ol-location=location data-ol-location=location
) )
span(data-ol-view='monthly') #{translate("start_free_trial")} span(hidden=(currentView !== 'monthly') data-ol-view='monthly') #{translate("start_free_trial")}
span(hidden data-ol-view='annual') #{translate("buy_now")} span(hidden=(currentView !== 'annual') data-ol-view='annual') #{translate("buy_now")}
mixin btn_buy_free(location) mixin btn_buy_free(location)
a.btn.btn-primary( a.btn.btn-primary(
data-ol-has-custom-href data-ol-has-custom-href
@ -28,8 +28,8 @@ mixin btn_buy_professional(location)
data-ol-start-new-subscription='professional' data-ol-start-new-subscription='professional'
data-ol-location=location data-ol-location=location
) )
span(data-ol-view='monthly') #{translate("start_free_trial")} span(hidden=(currentView !== 'monthly') data-ol-view='monthly') #{translate("start_free_trial")}
span(hidden data-ol-view='annual') #{translate("buy_now")} span(hidden=(currentView !== 'annual') data-ol-view='annual') #{translate("buy_now")}
mixin btn_buy_student(location, plan) mixin btn_buy_student(location, plan)
if plan == 'annual' if plan == 'annual'
a.btn.btn-primary( a.btn.btn-primary(
@ -141,15 +141,15 @@ mixin gen_localized_undiscounted_price_for_plan_view(plan)
mixin gen_localized_price_for_plan(plan) mixin gen_localized_price_for_plan(plan)
div(data-ol-view='monthly') div(hidden=(currentView !== 'monthly') data-ol-view='monthly')
+gen_localized_price_for_plan_view(plan, 'monthly') +gen_localized_price_for_plan_view(plan, 'monthly')
span.small /mo span.small /mo
div(hidden data-ol-view='annual') div(hidden=(currentView !== 'annual') data-ol-view='annual')
+gen_localized_price_for_plan_view(plan, 'annual') +gen_localized_price_for_plan_view(plan, 'annual')
span.small /yr span.small /yr
mixin gen_localized_undiscounted_price_for_plan(plan) mixin gen_localized_undiscounted_price_for_plan(plan)
div(hidden data-ol-view='annual') div(hidden=(currentView !== 'annual') data-ol-view='annual')
strike.undiscounted-price.small strike.undiscounted-price.small
span.sr-only Price reduced from span.sr-only Price reduced from
+gen_localized_undiscounted_price_for_plan_view(plan) +gen_localized_undiscounted_price_for_plan_view(plan)
@ -211,9 +211,9 @@ mixin plan_switch(location)
) )
.tooltip-arrow .tooltip-arrow
.tooltip-inner .tooltip-inner
span(data-ol-view="monthly") #{translate("save_20_percent_by_paying_annually")} span(hidden=(currentView !== 'monthly') data-ol-view='monthly') #{translate("save_20_percent_by_paying_annually")}
span(hidden data-ol-view="annual") #{translate("saving_20_percent")} span(hidden=(currentView !== 'annual') data-ol-view='annual') #{translate("saving_20_percent")}
span(hidden data-ol-view="student") #{translate("save_20_percent_by_paying_annually")} span(hidden=(currentView !== 'student') data-ol-view='student') #{translate("save_20_percent_by_paying_annually")}
li(data-ol-view-tab='student') li(data-ol-view-tab='student')
button.btn-default-outline #{translate("special_price_student")} button.btn-default-outline #{translate("special_price_student")}
@ -228,9 +228,9 @@ mixin plan_switch_annual_default(location)
) )
.tooltip-arrow .tooltip-arrow
.tooltip-inner .tooltip-inner
span(data-ol-view="annual") #{translate("saving_20_percent")} span(hidden=(currentView !== 'annual') data-ol-view='annual') #{translate("saving_20_percent")}
span(hidden data-ol-view="monthly") #{translate("save_20_percent_by_paying_annually")} span(hidden=(currentView !== 'monthly') data-ol-view='monthly') #{translate("save_20_percent_by_paying_annually")}
span(hidden data-ol-view="student") #{translate("save_20_percent_by_paying_annually")} span(hidden=(currentView !== 'student') data-ol-view='student') #{translate("save_20_percent_by_paying_annually")}
li(data-ol-view-tab='monthly') li(data-ol-view-tab='monthly')
button.btn-default-outline #{translate("monthly")} button.btn-default-outline #{translate("monthly")}
li(data-ol-view-tab='student') li(data-ol-view-tab='student')
@ -285,7 +285,7 @@ mixin allCardsAndControls(controlsRowSpaced, listLocation)
+price_professional_undiscounted +price_professional_undiscounted
+features_professional(location) +features_professional(location)
.card-group.text-centered(hidden data-ol-view='student') .card-group.text-centered(hidden=(currentView !== 'student') data-ol-view='student')
.col-md-4 .col-md-4
.card.card-first .card.card-first
.card-header .card-header

View file

@ -3,8 +3,14 @@ import '../../../features/plans/group-plan-modal'
import * as eventTracking from '../../../infrastructure/event-tracking' import * as eventTracking from '../../../infrastructure/event-tracking'
import getMeta from '../../../utils/meta' import getMeta from '../../../utils/meta'
let currentView = 'monthly' let currentView = getMeta('ol-currentView')
let currentCurrencyCode = getMeta('ol-recommendedCurrency') let currentCurrencyCode = getMeta('ol-recommendedCurrency')
const plansPageLayoutV3Variant =
getMeta('ol-splitTestVariants')?.['plans-page-layout-v3'] ?? 'default'
if (window.location.href.includes('validate-pre-rendering=true')) {
validatePreRendering()
}
function selectView(view) { function selectView(view) {
document.querySelectorAll('[data-ol-view-tab]').forEach(el => { document.querySelectorAll('[data-ol-view-tab]').forEach(el => {
@ -25,9 +31,6 @@ function selectView(view) {
} }
function setUpViewSwitching(liEl) { function setUpViewSwitching(liEl) {
const plansPageLayoutV3Variant =
getMeta('ol-splitTestVariants')?.['plans-page-layout-v3'] ?? 'default'
const view = liEl.getAttribute('data-ol-view-tab') const view = liEl.getAttribute('data-ol-view-tab')
liEl.querySelector('button').addEventListener('click', function (e) { liEl.querySelector('button').addEventListener('click', function (e) {
@ -137,23 +140,6 @@ function updateAnnualSavingBanner(view) {
} }
} }
function makeAnnualViewAsDefault() {
const plansPageLayoutV3Variant =
getMeta('ol-splitTestVariants')?.['plans-page-layout-v3'] ?? 'default'
// there are a handful of html elements that will switch between monthly and annual view
// with the `hidden` attribute.
// On the variant `old-plans-page-annual`, we want annual as the default.
// So, instead of changing the pugfiles directly, we change the default with this
if (plansPageLayoutV3Variant === 'old-plans-page-annual') {
document.querySelectorAll('[data-ol-view]').forEach(el => {
const view = el.getAttribute('data-ol-view')
el.hidden = view !== 'annual'
})
}
}
function selectViewFromHash() { function selectViewFromHash() {
try { try {
const params = new URLSearchParams(window.location.hash.substring(1)) const params = new URLSearchParams(window.location.hash.substring(1))
@ -171,6 +157,37 @@ function selectViewFromHash() {
} }
} }
function validatePreRendering() {
document.querySelectorAll('[data-ol-view-tab]').forEach(el => {
console.assert(
(el.getAttribute('data-ol-view-tab') === currentView) ===
el.classList.contains('active'),
el
)
})
document.querySelectorAll('[data-ol-view]').forEach(el => {
console.assert(
(el.hidden === el.getAttribute('data-ol-view')) !== currentView,
el
)
})
const plansPageLayoutV3Variant = getMeta('ol-splitTestVariants')?.[
'plans-page-layout-v3'
]
if (plansPageLayoutV3Variant !== 'new-plans-page') {
const tooltipEl = document.querySelector('[data-ol-annual-saving-tooltip]')
console.assert(
(currentView === 'annual') ===
tooltipEl.classList.contains('annual-selected'),
tooltipEl
)
}
console.log('validated pre-rendering')
}
document.querySelectorAll('[data-ol-view-tab]').forEach(setUpViewSwitching) document.querySelectorAll('[data-ol-view-tab]').forEach(setUpViewSwitching)
document document
.querySelectorAll('[data-ol-currencyCode-switch]') .querySelectorAll('[data-ol-currencyCode-switch]')
@ -182,6 +199,3 @@ updateLinkTargets()
selectViewFromHash() selectViewFromHash()
window.addEventListener('hashchange', selectViewFromHash) window.addEventListener('hashchange', selectViewFromHash)
// only for `old-plans-page-annual` variant of the `plans-page-layout-v3` split test
makeAnnualViewAsDefault()