mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Merge pull request #851 from sharelatex/jel-remove-a-b-test
Remove Plans and Pricing A/B Test
This commit is contained in:
commit
52381c8fb7
14 changed files with 308 additions and 493 deletions
|
@ -30,7 +30,6 @@ module.exports = SubscriptionController =
|
|||
plans: plans
|
||||
gaExperiments: Settings.gaExperiments.plansPage
|
||||
recomendedCurrency:recomendedCurrency
|
||||
shouldABTestPlans: currentUser == null or (currentUser?.signUpDate? and currentUser.signUpDate >= '2018-06-06')
|
||||
planFeatures: planFeatures
|
||||
user_id = AuthenticationController.getLoggedInUserId(req)
|
||||
if user_id?
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
script(type="text/ng-template", id="groupPlanModalTemplate")
|
||||
.modal-header
|
||||
h3 #{translate("group_plan_enquiry")}
|
||||
.modal-body
|
||||
form.text-left.form(ng-controller="UniverstiesContactController", ng-submit="contactUs()")
|
||||
span(ng-show="sent == false && error == false")
|
||||
.form-group
|
||||
label#title9(for='Field9')
|
||||
| Name
|
||||
input#Field9.field.text.medium.span8.form-control(ng-model="form.name", maxlength='255', tabindex='1', onkeyup='')
|
||||
label#title11.desc(for='Field11')
|
||||
| Email
|
||||
.form-group
|
||||
input#Field11.field.text.medium.span8.form-control(ng-model="form.email", name='Field11', type='email', spellcheck='false', value='', maxlength='255', tabindex='2')
|
||||
label#title12.desc(for='Field12')
|
||||
| University / Company
|
||||
.form-group
|
||||
input#Field12.field.text.medium.span8.form-control(ng-model="form.university", name='Field12', type='text', value='', maxlength='255', tabindex='3', onkeyup='')
|
||||
label#title13.desc(for='Field13')
|
||||
| Position
|
||||
.form-group
|
||||
input#Field13.field.text.medium.span8.form-control(ng-model="form.position", name='Field13', type='text', value='', maxlength='255', tabindex='4', onkeyup='')
|
||||
.form-group
|
||||
input(ng-model="form.source", type="hidden", ng-init="form.source = '__ref__'; form.subject = 'General enquiry for larger ShareLaTeX use';")
|
||||
.form-group.text-center
|
||||
input#saveForm.btn-success.btn.btn-lg(name='saveForm', type='submit', ng-disabled="sending", value='Request a quote')
|
||||
span(ng-show="sent == true && error == false")
|
||||
p Request Sent, Thank you.
|
||||
span(ng-show="error")
|
||||
p Error sending request.
|
33
services/web/app/views/subscriptions/_plans_faq.pug
Normal file
33
services/web/app/views/subscriptions/_plans_faq.pug
Normal file
|
@ -0,0 +1,33 @@
|
|||
.faq
|
||||
.row.row-spaced-large
|
||||
.col-md-12
|
||||
.page-header.plans-header.plans-subheader.text-centered
|
||||
h2 FAQ
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate("faq_how_free_trial_works_question")}
|
||||
p #{translate('faq_how_free_trial_works_answer', { len:'{{trial_len}}' })}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_change_plans_question')}
|
||||
p #{translate('faq_change_plans_answer')}
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate('faq_do_collab_need_premium_question')}
|
||||
p #{translate('faq_do_collab_need_premium_answer')}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_need_more_collab_question')}
|
||||
p !{translate('faq_need_more_collab_answer', { referFriendsLink: '<a href="/user/bonus">' + translate('referring_your_friends') + '</a>'})}
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate('faq_purchase_more_licenses_question')}
|
||||
p !{translate('faq_purchase_more_licenses_answer', { groupLink: '<a href="/i/university/groups">' + translate('discounted_group_accounts') + '</a>' })}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_monthly_or_annual_question')}
|
||||
p #{translate('faq_monthly_or_annual_answer')}
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate('faq_how_to_pay_question')}
|
||||
p #{translate('faq_how_to_pay_answer')}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_pay_by_invoice_question')}
|
||||
p !{translate('faq_pay_by_invoice_answer', { groupLink: '<a href="/i/university/groups">' + translate('discounted_group_accounts') + '</a>' })}
|
|
@ -1,118 +0,0 @@
|
|||
.row
|
||||
.col-md-12
|
||||
.page-header.centered.plans-header.text-centered
|
||||
h1 #{translate("start_x_day_trial", {len:'{{trial_len}}'})}
|
||||
.row
|
||||
.col-md-8.col-md-offset-2
|
||||
p.text-centered #{translate("sl_benefits_plans")}
|
||||
|
||||
.row.top-switch
|
||||
.col-md-6.col-md-offset-3
|
||||
+plan_switch('card')
|
||||
.col-md-2.text-right
|
||||
+currency_dropdown
|
||||
|
||||
div(ng-show="showPlans")
|
||||
.row
|
||||
.col-md-10.col-md-offset-1
|
||||
.row
|
||||
.card-group.text-centered(ng-if="ui.view == 'monthly' || ui.view == 'annual'")
|
||||
.col-md-4
|
||||
.card.card-first
|
||||
.card-header
|
||||
h2 #{translate("personal")}
|
||||
.circle #{translate("free")}
|
||||
+features_free
|
||||
.col-md-4
|
||||
.card.card-highlighted
|
||||
.card-header
|
||||
h2 #{translate("collaborator")}
|
||||
.circle
|
||||
+price_collaborator
|
||||
+features_collaborator
|
||||
.col-md-4
|
||||
.card.card-last
|
||||
.card-header
|
||||
h2 #{translate("professional")}
|
||||
.circle
|
||||
+price_professional
|
||||
+features_professional
|
||||
|
||||
.card-group.text-centered(ng-if="ui.view == 'student'")
|
||||
.col-md-4
|
||||
.card.card-first
|
||||
.card-header
|
||||
h2 #{translate("personal")}
|
||||
.circle #{translate("free")}
|
||||
+features_free
|
||||
|
||||
.col-md-4
|
||||
.card.card-highlighted
|
||||
+card_student_monthly
|
||||
|
||||
.col-md-4
|
||||
.card.card-last
|
||||
+card_student_annual
|
||||
|
||||
.row.row-spaced
|
||||
p.text-centered #{translate("choose_plan_works_for_you", {len:'{{trial_len}}'})}
|
||||
|
||||
.row
|
||||
.col-md-8.col-md-offset-2
|
||||
.alert.alert-info.text-centered
|
||||
| #{translate("interested_in_group_licence")}
|
||||
br
|
||||
a(href, ng-click="openGroupPlanModal()") #{translate("get_in_touch_for_details")}
|
||||
|
||||
script(type="text/ng-template", id="groupPlanModalTemplate")
|
||||
.modal-header
|
||||
h3 #{translate("group_plan_enquiry")}
|
||||
.modal-body
|
||||
form.text-left.form(ng-controller="UniverstiesContactController", ng-submit="contactUs()")
|
||||
span(ng-show="sent == false && error == false")
|
||||
.form-group
|
||||
label#title9(for='Field9')
|
||||
| Name
|
||||
input#Field9.field.text.medium.span8.form-control(ng-model="form.name", maxlength='255', tabindex='1', onkeyup='')
|
||||
label#title11.desc(for='Field11')
|
||||
| Email
|
||||
.form-group
|
||||
input#Field11.field.text.medium.span8.form-control(ng-model="form.email", name='Field11', type='email', spellcheck='false', value='', maxlength='255', tabindex='2')
|
||||
label#title12.desc(for='Field12')
|
||||
| University / Company
|
||||
.form-group
|
||||
input#Field12.field.text.medium.span8.form-control(ng-model="form.university", name='Field12', type='text', value='', maxlength='255', tabindex='3', onkeyup='')
|
||||
label#title13.desc(for='Field13')
|
||||
| Position
|
||||
.form-group
|
||||
input#Field13.field.text.medium.span8.form-control(ng-model="form.position", name='Field13', type='text', value='', maxlength='255', tabindex='4', onkeyup='')
|
||||
.form-group
|
||||
input(ng-model="form.source", type="hidden", ng-init="form.source = '__ref__'; form.subject = 'General enquiry for larger ShareLaTeX use';")
|
||||
.form-group.text-center
|
||||
input#saveForm.btn-success.btn.btn-lg(name='saveForm', type='submit', ng-disabled="sending", value='Request a quote')
|
||||
span(ng-show="sent == true && error == false")
|
||||
p Request Sent, Thank you.
|
||||
span(ng-show="error")
|
||||
p Error sending request.
|
||||
|
||||
.row
|
||||
.col-md-12
|
||||
.page-header.plans-header.plans-subheader.text-centered
|
||||
h2 #{translate("enjoy_these_features")}
|
||||
.col-md-4
|
||||
.card.features.text-centered
|
||||
i.fa.fa-file-text-o.fa-5x
|
||||
h4 #{translate("unlimited_projects")}
|
||||
p #{translate("create_unlimited_projects")}
|
||||
.col-md-4
|
||||
.card.features.text-centered
|
||||
i.fa.fa-clock-o.fa-5x
|
||||
h4 #{translate("full_doc_history")}
|
||||
p #{translate("never_loose_work")}
|
||||
.col-md-4
|
||||
.card.features.text-centered
|
||||
i.fa.fa-dropbox.fa-5x
|
||||
|
|
||||
i.fa.fa-github.fa-5x
|
||||
h4 #{translate("sync_to_dropbox_and_github")}
|
||||
p #{translate("access_projects_anywhere")}
|
|
@ -1,160 +0,0 @@
|
|||
.row
|
||||
.col-md-12
|
||||
.page-header.centered.plans-header.text-centered
|
||||
h1.text-capitalize #{translate('instant_access')}
|
||||
.row
|
||||
.col-md-8.col-md-offset-2
|
||||
p.text-centered #{translate("sl_benefits_plans")}
|
||||
|
||||
.row.top-switch
|
||||
.col-md-6.col-md-offset-3
|
||||
+plan_switch('card')
|
||||
.col-md-2.text-right
|
||||
+currency_dropdown
|
||||
|
||||
div(ng-show="showPlans")
|
||||
.row
|
||||
.col-md-10.col-md-offset-1
|
||||
.row
|
||||
.card-group.text-centered(ng-if="ui.view == 'monthly' || ui.view == 'annual'")
|
||||
.col-md-4
|
||||
.card.card-first
|
||||
.card-header
|
||||
h2 #{translate("personal")}
|
||||
h5.tagline #{translate("tagline_personal")}
|
||||
.circle #{translate("free")}
|
||||
+features_free
|
||||
.col-md-4
|
||||
.card.card-highlighted
|
||||
.best-value
|
||||
strong #{translate('best_value')}
|
||||
.card-header
|
||||
h2 #{translate("collaborator")}
|
||||
h5.tagline #{translate("tagline_collaborator")}
|
||||
.circle
|
||||
+price_collaborator
|
||||
+features_collaborator
|
||||
.col-md-4
|
||||
.card.card-last
|
||||
.card-header
|
||||
h2 #{translate("professional")}
|
||||
h5.tagline #{translate("tagline_professional")}
|
||||
.circle
|
||||
+price_professional
|
||||
+features_professional
|
||||
|
||||
.card-group.text-centered(ng-if="ui.view == 'student'")
|
||||
.col-md-4
|
||||
.card.card-first
|
||||
.card-header
|
||||
h2 #{translate("personal")}
|
||||
h5.tagline #{translate("tagline_personal")}
|
||||
.circle #{translate("free")}
|
||||
+features_free
|
||||
|
||||
.col-md-4
|
||||
.card.card-highlighted
|
||||
+card_student_annual
|
||||
|
||||
.col-md-4
|
||||
.card.card-last
|
||||
+card_student_monthly
|
||||
|
||||
.row.row-spaced-large.text-centered
|
||||
i.fa.fa-cc-mastercard.fa-2x
|
||||
i.fa.fa-cc-visa.fa-2x
|
||||
i.fa.fa-cc-amex.fa-2x
|
||||
i.fa.fa-cc-paypal.fa-2x
|
||||
div.text-centered #{translate('change_plans_any_time')}<br/> #{translate('billed_after_x_days', {len:'{{trial_len}}'})}
|
||||
|
||||
.row.row-spaced-large
|
||||
.col-md-8.col-md-offset-2
|
||||
.card.text-centered
|
||||
.card-header
|
||||
h2 #{translate('looking_multiple_licenses')}
|
||||
span #{translate('reduce_costs_group_licenses')}
|
||||
br
|
||||
br
|
||||
a.btn.btn-info(href="/i/university/groups") #{translate('find_out_more')}
|
||||
|
||||
div
|
||||
.row.row-spaced-large
|
||||
.col-sm-12
|
||||
.page-header.plans-header.plans-subheader.text-centered
|
||||
h2 #{translate('compare_plan_features')}
|
||||
.row
|
||||
.col-md-6.col-md-offset-3
|
||||
+plan_switch('table')
|
||||
.col-md-3.text-right
|
||||
+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-{{plansVariant}}`)
|
||||
.col-sm-12(ng-if="ui.view != 'student'")
|
||||
+table_premium
|
||||
.col-sm-12(ng-if="ui.view == 'student'")
|
||||
+table_student
|
||||
|
||||
.row.row-spaced-large
|
||||
.col-md-12
|
||||
.page-header.plans-header.plans-subheader.text-centered
|
||||
h2 #{translate('in_good_company')}
|
||||
.row
|
||||
.col-md-6
|
||||
div
|
||||
.row
|
||||
.col-md-3
|
||||
.circle-img
|
||||
img(src=buildImgPath('advocates/erdogmus.jpg') alt="Professor Erdogmus")
|
||||
.col-md-9
|
||||
blockquote
|
||||
p The ability to track changes and the real-time collaborative nature is what sets ShareLaTeX apart.
|
||||
footer Professor Erdogmus, Northeastern University
|
||||
.col-md-6
|
||||
div
|
||||
.row
|
||||
.col-md-3
|
||||
.circle-img
|
||||
img(src=buildImgPath('advocates/henderson.jpg') alt="Rob Henderson")
|
||||
.col-md-9
|
||||
blockquote
|
||||
p ShareLaTeX has proven to be a powerful and robust collaboration tool that is widely used in our School.
|
||||
footer Rob Henderson, School Of Informatics And Computing - Indiana University
|
||||
|
||||
.faq
|
||||
.row.row-spaced-large
|
||||
.col-md-12
|
||||
.page-header.plans-header.plans-subheader.text-centered
|
||||
h2 FAQ
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate("faq_how_free_trial_works_question")}
|
||||
p #{translate('faq_how_free_trial_works_answer', { len:'{{trial_len}}' })}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_change_plans_question')}
|
||||
p #{translate('faq_change_plans_answer')}
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate('faq_do_collab_need_premium_question')}
|
||||
p #{translate('faq_do_collab_need_premium_answer')}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_need_more_collab_question')}
|
||||
p !{translate('faq_need_more_collab_answer', { referFriendsLink: '<a href="/user/bonus">' + translate('referring_your_friends') + '</a>'})}
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate('faq_purchase_more_licenses_question')}
|
||||
p !{translate('faq_purchase_more_licenses_answer', { groupLink: '<a href="/i/university/groups">' + translate('discounted_group_accounts') + '</a>' })}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_monthly_or_annual_question')}
|
||||
p #{translate('faq_monthly_or_annual_answer')}
|
||||
.row
|
||||
.col-md-6
|
||||
h3 #{translate('faq_how_to_pay_question')}
|
||||
p #{translate('faq_how_to_pay_answer')}
|
||||
.col-md-6
|
||||
h3 #{translate('faq_pay_by_invoice_question')}
|
||||
p !{translate('faq_pay_by_invoice_answer', { groupLink: '<a href="/i/university/groups">' + translate('discounted_group_accounts') + '</a>' })}
|
||||
.row.row-spaced-large.text-centery
|
||||
.col-md-12
|
||||
.plans-header.plans-subheader.text-centered
|
||||
h2 #{translate('still_have_questions')}
|
||||
button.btn.btn-info.btn-header.text-capitalize(ng-controller="ContactGeneralModal" ng-click="openModal()") #{translate('get_in_touch')}
|
||||
!= moduleIncludes("contactModalGeneral", locals)
|
|
@ -12,8 +12,7 @@ mixin btn_buy_free(location)
|
|||
style=(getLoggedInUserId() === null ? "" : "visibility: hidden")
|
||||
ng-click="signUpNowClicked('free','" + location + "')"
|
||||
)
|
||||
span(ng-if="plansVariant !== 'more-details'") #{translate('sign_up_now')}
|
||||
span.text-capitalize(ng-if="plansVariant === 'more-details'") #{translate('get_started_now')}
|
||||
span.text-capitalize #{translate('get_started_now')}
|
||||
mixin btn_buy_professional(location)
|
||||
a.btn.btn-info(
|
||||
ng-href="/user/subscription/new?planCode=professional{{ ui.view == 'annual' && '-annual' || planQueryString}}¤cy={{currencyCode}}"
|
||||
|
@ -36,11 +35,11 @@ mixin btn_buy_student(location, plan)
|
|||
|
||||
//- Cards
|
||||
mixin card_student_annual
|
||||
.best-value(ng-if="plansVariant == 'more-details'")
|
||||
.best-value
|
||||
strong #{translate('best_value')}
|
||||
.card-header
|
||||
h2 #{translate("student")} (#{translate("annual")})
|
||||
h5.tagline(ng-if="plansVariant == 'more-details'") #{translate('tagline_student_annual')}
|
||||
h5.tagline #{translate('tagline_student_annual')}
|
||||
.circle
|
||||
span
|
||||
+price_student_annual
|
||||
|
@ -48,7 +47,7 @@ mixin card_student_annual
|
|||
mixin card_student_monthly
|
||||
.card-header
|
||||
h2 #{translate("student")}
|
||||
h5.tagline(ng-if="plansVariant == 'more-details'") #{translate('tagline_student_monthly')}
|
||||
h5.tagline #{translate('tagline_student_monthly')}
|
||||
.circle
|
||||
span
|
||||
+price_student_monthly
|
||||
|
@ -69,23 +68,20 @@ mixin features_free
|
|||
li(class="hidden-xs hidden-sm")
|
||||
li(class="hidden-xs hidden-sm")
|
||||
li(class="hidden-xs hidden-sm")
|
||||
li(class="hidden-xs hidden-sm" ng-if="plansVariant === 'more-details'")
|
||||
li(class="hidden-xs hidden-sm" ng-if="plansVariant === 'more-details'")
|
||||
li(class="hidden-xs hidden-sm" ng-if="plansVariant === 'more-details'")
|
||||
li(class="hidden-xs hidden-sm")
|
||||
li(class="hidden-xs hidden-sm")
|
||||
li(class="hidden-xs hidden-sm")
|
||||
li
|
||||
br
|
||||
+btn_buy_free('card')
|
||||
mixin features_premium
|
||||
li(ng-if="plansVariant != 'more-details'") #{translate("full_doc_history")}
|
||||
li(ng-if="plansVariant != 'more-details'") #{translate("sync_to_dropbox")}
|
||||
li(ng-if="plansVariant != 'more-details'") #{translate("sync_to_github")}
|
||||
li(ng-if="plansVariant === 'more-details'")
|
||||
li(ng-if="plansVariant === 'more-details'")
|
||||
li
|
||||
li
|
||||
strong #{translate('all_premium_features')}
|
||||
li(ng-if="plansVariant === 'more-details'") #{translate('sync_dropbox_github')}
|
||||
li(ng-if="plansVariant === 'more-details'") #{translate('full_doc_history')}
|
||||
li(ng-if="plansVariant === 'more-details'") #{translate('track_changes')}
|
||||
li(ng-if="plansVariant === 'more-details'") + #{translate('more').toLowerCase()}
|
||||
li #{translate('sync_dropbox_github')}
|
||||
li #{translate('full_doc_history')}
|
||||
li #{translate('track_changes')}
|
||||
li + #{translate('more').toLowerCase()}
|
||||
mixin features_professional
|
||||
ul.list-unstyled
|
||||
li
|
||||
|
@ -159,4 +155,3 @@ mixin plan_switch(location)
|
|||
href="#"
|
||||
ng-click="switchToStudent($event,'" + location + "')"
|
||||
) #{translate("half_price_student")}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ mixin table_premium
|
|||
|
||||
for feature in planFeatures
|
||||
tr
|
||||
td(event-tracking="features-table" event-tracking-trigger="hover" event-tracking-ga="subscription-funnel" event-tracking-label=`${feature.feature}-exp-{{plansVariant}}`)
|
||||
td(event-tracking="features-table" event-tracking-trigger="hover" event-tracking-ga="subscription-funnel" event-tracking-label=`${feature.feature}`)
|
||||
if feature.info
|
||||
span(tooltip=translate(feature.info)) #{translate(feature.feature)}
|
||||
else
|
||||
|
@ -77,7 +77,7 @@ mixin table_student
|
|||
|
||||
for feature in planFeatures
|
||||
tr
|
||||
td(event-tracking="plans-page-table" event-tracking-trigger="hover" event-tracking-ga="subscription-funnel" event-tracking-label=`${feature.feature}-exp-{{plansVariant}}`)
|
||||
td(event-tracking="plans-page-table" event-tracking-trigger="hover" event-tracking-ga="subscription-funnel" event-tracking-label=`${feature.feature}`)
|
||||
if feature.info
|
||||
span(tooltip=translate(feature.info)) #{translate(feature.feature)}
|
||||
else
|
||||
|
@ -104,4 +104,3 @@ mixin table_student
|
|||
.outer-content
|
||||
td
|
||||
+btn_buy_student('table', 'monthly')
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ block content
|
|||
a(
|
||||
ng-click="changeCurrency(currency)",
|
||||
) {{currency}} ({{value['symbol']}})
|
||||
.row(ng-if="plansVariant == 'more-details' && planCode == 'student-annual' || plansVariant == 'more-details' && planCode == 'student-monthly'")
|
||||
.row(ng-if="planCode == 'student-annual' || planCode == 'student-monthly'")
|
||||
.col-xs-12
|
||||
p.student-disclaimer #{translate('student_disclaimer')}
|
||||
|
||||
|
|
|
@ -7,12 +7,140 @@ block scripts
|
|||
script(type='text/javascript').
|
||||
window.recomendedCurrency = '#{recomendedCurrency}'
|
||||
window.abCurrencyFlag = '#{abCurrencyFlag}'
|
||||
window.shouldABTestPlans = #{shouldABTestPlans || false}
|
||||
|
||||
block content
|
||||
.content.content-alt
|
||||
.content.plans(ng-controller="PlansController")
|
||||
.container(class="more-details" ng-cloak ng-if="plansVariant === 'more-details'")
|
||||
include _plans_page_details_more
|
||||
.container(ng-cloak ng-if="plansVariant === 'default' || !shouldABTestPlans || timeout")
|
||||
include _plans_page_details_less
|
||||
.plans(ng-controller="PlansController")
|
||||
.container(ng-cloak)
|
||||
.row
|
||||
.col-md-12
|
||||
.page-header.centered.plans-header.text-centered
|
||||
h1.text-capitalize #{translate('instant_access')}
|
||||
.row
|
||||
.col-md-8.col-md-offset-2
|
||||
p.text-centered #{translate("sl_benefits_plans")}
|
||||
|
||||
.row.top-switch
|
||||
.col-md-6.col-md-offset-3
|
||||
+plan_switch('card')
|
||||
.col-md-2.text-right
|
||||
+currency_dropdown
|
||||
|
||||
div(ng-show="showPlans")
|
||||
.row
|
||||
.col-md-10.col-md-offset-1
|
||||
.row
|
||||
.card-group.text-centered(ng-if="ui.view == 'monthly' || ui.view == 'annual'")
|
||||
.col-md-4
|
||||
.card.card-first
|
||||
.card-header
|
||||
h2 #{translate("personal")}
|
||||
h5.tagline #{translate("tagline_personal")}
|
||||
.circle #{translate("free")}
|
||||
+features_free
|
||||
.col-md-4
|
||||
.card.card-highlighted
|
||||
.best-value
|
||||
strong #{translate('best_value')}
|
||||
.card-header
|
||||
h2 #{translate("collaborator")}
|
||||
h5.tagline #{translate("tagline_collaborator")}
|
||||
.circle
|
||||
+price_collaborator
|
||||
+features_collaborator
|
||||
.col-md-4
|
||||
.card.card-last
|
||||
.card-header
|
||||
h2 #{translate("professional")}
|
||||
h5.tagline #{translate("tagline_professional")}
|
||||
.circle
|
||||
+price_professional
|
||||
+features_professional
|
||||
|
||||
.card-group.text-centered(ng-if="ui.view == 'student'")
|
||||
.col-md-4
|
||||
.card.card-first
|
||||
.card-header
|
||||
h2 #{translate("personal")}
|
||||
h5.tagline #{translate("tagline_personal")}
|
||||
.circle #{translate("free")}
|
||||
+features_free
|
||||
|
||||
.col-md-4
|
||||
.card.card-highlighted
|
||||
+card_student_annual
|
||||
|
||||
.col-md-4
|
||||
.card.card-last
|
||||
+card_student_monthly
|
||||
|
||||
.row.row-spaced-large.text-centered
|
||||
i.fa.fa-cc-mastercard.fa-2x
|
||||
i.fa.fa-cc-visa.fa-2x
|
||||
i.fa.fa-cc-amex.fa-2x
|
||||
i.fa.fa-cc-paypal.fa-2x
|
||||
div.text-centered #{translate('change_plans_any_time')}<br/> #{translate('billed_after_x_days', {len:'{{trial_len}}'})}
|
||||
|
||||
.row.row-spaced-large
|
||||
.col-md-8.col-md-offset-2
|
||||
.card.text-centered
|
||||
.card-header
|
||||
h2 #{translate('looking_multiple_licenses')}
|
||||
span #{translate('reduce_costs_group_licenses')}
|
||||
br
|
||||
br
|
||||
a.btn.btn-info(href="/i/university/groups") #{translate('find_out_more')}
|
||||
|
||||
div
|
||||
.row.row-spaced-large
|
||||
.col-sm-12
|
||||
.page-header.plans-header.plans-subheader.text-centered
|
||||
h2 #{translate('compare_plan_features')}
|
||||
.row
|
||||
.col-md-6.col-md-offset-3
|
||||
+plan_switch('table')
|
||||
.col-md-3.text-right
|
||||
+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-{{plansVariant}}`)
|
||||
.col-sm-12(ng-if="ui.view != 'student'")
|
||||
+table_premium
|
||||
.col-sm-12(ng-if="ui.view == 'student'")
|
||||
+table_student
|
||||
|
||||
.row.row-spaced-large
|
||||
.col-md-12
|
||||
.page-header.plans-header.plans-subheader.text-centered
|
||||
h2 #{translate('in_good_company')}
|
||||
.row
|
||||
.col-md-6
|
||||
div
|
||||
.row
|
||||
.col-md-3
|
||||
.circle-img
|
||||
img(src=buildImgPath('advocates/erdogmus.jpg') alt="Professor Erdogmus")
|
||||
.col-md-9
|
||||
blockquote
|
||||
p The ability to track changes and the real-time collaborative nature is what sets ShareLaTeX apart.
|
||||
footer Professor Erdogmus, Northeastern University
|
||||
.col-md-6
|
||||
div
|
||||
.row
|
||||
.col-md-3
|
||||
.circle-img
|
||||
img(src=buildImgPath('advocates/henderson.jpg') alt="Rob Henderson")
|
||||
.col-md-9
|
||||
blockquote
|
||||
p ShareLaTeX has proven to be a powerful and robust collaboration tool that is widely used in our School.
|
||||
footer Rob Henderson, School Of Informatics And Computing - Indiana University
|
||||
|
||||
include _plans_faq
|
||||
|
||||
.row.row-spaced-large
|
||||
.col-md-12
|
||||
.plans-header.plans-subheader.text-centered
|
||||
h2 #{translate('still_have_questions')}
|
||||
button.btn.btn-info.btn-header.text-capitalize(ng-controller="ContactGeneralModal" ng-click="openModal()") #{translate('get_in_touch')}
|
||||
!= moduleIncludes("contactModalGeneral", locals)
|
||||
|
||||
.row.row-spaced
|
||||
|
||||
|
|
|
@ -87,10 +87,6 @@ define [
|
|||
}
|
||||
$scope.user = window.user
|
||||
|
||||
$scope.shouldABTestPlans = false
|
||||
if $scope.user.signUpDate >= '2018-06-06'
|
||||
$scope.shouldABTestPlans = true
|
||||
|
||||
$scope.settings = window.userSettings
|
||||
$scope.anonymous = window.anonymous
|
||||
$scope.isTokenMember = window.isTokenMember
|
||||
|
|
|
@ -4,21 +4,20 @@ define [
|
|||
"libs/recurly-4.8.5"
|
||||
], (App)->
|
||||
|
||||
App.controller "NewSubscriptionController", ($scope, MultiCurrencyPricing, abTestManager, $http, sixpack, event_tracking, ccUtils, ipCookie)->
|
||||
App.controller "NewSubscriptionController", ($scope, MultiCurrencyPricing, $http, event_tracking, ccUtils)->
|
||||
throw new Error("Recurly API Library Missing.") if typeof recurly is "undefined"
|
||||
|
||||
$scope.currencyCode = MultiCurrencyPricing.currencyCode
|
||||
$scope.plans = MultiCurrencyPricing.plans
|
||||
$scope.planCode = window.plan_code
|
||||
$scope.plansVariant = ipCookie('plansVariant')
|
||||
|
||||
$scope.switchToStudent = ()->
|
||||
currentPlanCode = window.plan_code
|
||||
planCode = currentPlanCode.replace('collaborator', 'student')
|
||||
event_tracking.sendMB 'subscription-form-switch-to-student', { plan: window.plan_code, variant: $scope.plansVariant }
|
||||
event_tracking.sendMB 'subscription-form-switch-to-student', { plan: window.plan_code }
|
||||
window.location = "/user/subscription/new?planCode=#{planCode}¤cy=#{$scope.currencyCode}&cc=#{$scope.data.coupon}"
|
||||
|
||||
event_tracking.sendMB "subscription-form", { plan : window.plan_code, variant: $scope.plansVariant }
|
||||
event_tracking.sendMB "subscription-form", { plan : window.plan_code }
|
||||
|
||||
$scope.paymentMethod =
|
||||
value: "credit_card"
|
||||
|
@ -144,14 +143,13 @@ define [
|
|||
currencyCode : postData.subscriptionDetails.currencyCode,
|
||||
plan_code : postData.subscriptionDetails.plan_code,
|
||||
coupon_code : postData.subscriptionDetails.coupon_code,
|
||||
isPaypal : postData.subscriptionDetails.isPaypal,
|
||||
variant : $scope.plansVariant
|
||||
isPaypal : postData.subscriptionDetails.isPaypal
|
||||
}
|
||||
|
||||
|
||||
$http.post("/user/subscription/create", postData)
|
||||
.then ()->
|
||||
event_tracking.sendMB "subscription-submission-success", { variant: $scope.plansVariant }
|
||||
event_tracking.sendMB "subscription-submission-success"
|
||||
window.location.href = "/user/subscription/thank-you"
|
||||
.catch ()->
|
||||
$scope.processing = false
|
||||
|
|
|
@ -145,21 +145,7 @@ define [
|
|||
}
|
||||
|
||||
|
||||
App.controller "PlansController", ($scope, $modal, event_tracking, abTestManager, MultiCurrencyPricing, $http, sixpack, $filter, ipCookie) ->
|
||||
|
||||
$scope.showPlans = false
|
||||
$scope.shouldABTestPlans = window.shouldABTestPlans
|
||||
|
||||
if $scope.shouldABTestPlans
|
||||
sixpack.participate 'plans-details', ['default', 'more-details'], (chosenVariation, rawResponse)->
|
||||
if rawResponse?.status != 'failed'
|
||||
$scope.plansVariant = chosenVariation
|
||||
expiration = new Date();
|
||||
expiration.setDate(expiration.getDate() + 5);
|
||||
ipCookie('plansVariant', chosenVariation, {expires: expiration})
|
||||
event_tracking.send 'subscription-funnel', 'plans-page-loaded', chosenVariation
|
||||
else
|
||||
$scope.timeout = true
|
||||
App.controller "PlansController", ($scope, $modal, event_tracking, MultiCurrencyPricing, $http, $filter, ipCookie) ->
|
||||
|
||||
$scope.showPlans = true
|
||||
|
||||
|
@ -190,10 +176,8 @@ define [
|
|||
if $scope.ui.view == "annual"
|
||||
plan = "#{plan}_annual"
|
||||
plan = eventLabel(plan, location)
|
||||
event_tracking.sendMB 'plans-page-start-trial', {plan, variant: $scope.plansVariant}
|
||||
event_tracking.sendMB 'plans-page-start-trial'
|
||||
event_tracking.send 'subscription-funnel', 'sign_up_now_button', plan
|
||||
if $scope.plansVariant
|
||||
sixpack.convert 'plans-details'
|
||||
|
||||
$scope.switchToMonthly = (e, location) ->
|
||||
uiView = 'monthly'
|
||||
|
@ -217,14 +201,9 @@ define [
|
|||
event_tracking.send 'subscription-funnel', 'plans-page', 'group-inquiry-potential'
|
||||
|
||||
eventLabel = (label, location) ->
|
||||
if $scope.plansVariant && location && $scope.plansVariant != 'default'
|
||||
label = label + '-' + location
|
||||
if $scope.plansVariant && $scope.plansVariant != 'default'
|
||||
label += '-exp-' + $scope.plansVariant
|
||||
label
|
||||
|
||||
switchEvent = (e, label, location) ->
|
||||
e.preventDefault()
|
||||
gaLabel = eventLabel(label, location)
|
||||
event_tracking.send 'subscription-funnel', 'plans-page', gaLabel
|
||||
|
||||
|
|
|
@ -3,6 +3,80 @@
|
|||
color: @gray-dark;
|
||||
margin-bottom: @line-height-computed;
|
||||
}
|
||||
.best-value {
|
||||
color: @red;
|
||||
line-height: @line-height-computed;
|
||||
}
|
||||
blockquote {
|
||||
footer{
|
||||
/* accessibility fix */
|
||||
color: @gray-med;
|
||||
}
|
||||
}
|
||||
.btn-header {
|
||||
font-family: @font-family-sans-serif;
|
||||
margin-left: 10px;
|
||||
margin-top: -10px;
|
||||
text-shadow: 0 0 0;
|
||||
}
|
||||
.card .btn { white-space:normal; }
|
||||
.card-group {
|
||||
.card-highlighted {
|
||||
padding-top: @line-height-computed * 2;
|
||||
padding-bottom: @line-height-computed * 2;
|
||||
}
|
||||
}
|
||||
.card-first, .card-last {
|
||||
background: @white-med;
|
||||
}
|
||||
.card-highlighted {
|
||||
border: @highlight-border solid @gray-lighter;
|
||||
padding-top: 10px!important;
|
||||
.best-value {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.card-header {
|
||||
padding-bottom: 22px; /* align hr with other plans */
|
||||
}
|
||||
}
|
||||
.card-header {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.circle {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
padding: 38px 18px;
|
||||
margin: 0 auto @line-height-computed;
|
||||
text-shadow: 0 -1px 1px darken(@link-color, 10%);
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
border-radius: 50%;
|
||||
background-color: @red;
|
||||
color: white;
|
||||
white-space: nowrap;
|
||||
span.small {
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
font-size: @font-size-base * .8;
|
||||
}
|
||||
}
|
||||
.circle-img {
|
||||
border-radius: 50%;
|
||||
float: right;
|
||||
height: 100px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
width: 100px;
|
||||
img {
|
||||
display: inline;
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
.faq {
|
||||
p {
|
||||
margin: 0
|
||||
}
|
||||
}
|
||||
.plans-header{
|
||||
h1, h2, p {
|
||||
text-shadow: 0 -1px 1px white;
|
||||
|
@ -17,37 +91,12 @@
|
|||
.plans-subheader {
|
||||
margin-bottom: @line-height-computed;
|
||||
}
|
||||
.card.features {
|
||||
margin-top: @line-height-computed;
|
||||
i {
|
||||
color: @red;
|
||||
}
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
.tagline {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.card-group {
|
||||
.card-highlighted {
|
||||
padding-top: @line-height-computed * 2;
|
||||
padding-bottom: @line-height-computed * 2;
|
||||
}
|
||||
}
|
||||
|
||||
.circle {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
padding: 38px 18px;
|
||||
margin: 0 auto @line-height-computed;
|
||||
text-shadow: 0 -1px 1px darken(@link-color, 10%);
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
border-radius: 50%;
|
||||
background-color: @red;
|
||||
color: white;
|
||||
white-space: nowrap;
|
||||
span.small {
|
||||
color: rgba(255, 255, 255, 0.75);
|
||||
font-size: @font-size-base * .8;
|
||||
.top-switch {
|
||||
.currency-dropdown {
|
||||
margin-right: -15px;
|
||||
}
|
||||
}
|
||||
ul.nav-pills {
|
||||
|
@ -61,14 +110,6 @@
|
|||
margin-left: @line-height-computed / 2;
|
||||
}
|
||||
}
|
||||
|
||||
.card .btn { white-space:normal; }
|
||||
|
||||
.top-switch {
|
||||
.currency-dropdown {
|
||||
margin-right: -15px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#changePlanSection {
|
||||
|
@ -98,41 +139,11 @@
|
|||
|
||||
}
|
||||
|
||||
.feature {
|
||||
margin-top: (@line-height-computed / 2);
|
||||
margin-bottom: (@line-height-computed / 1.5);
|
||||
}
|
||||
|
||||
.features-check,
|
||||
.features-copy {
|
||||
display: inline-block;
|
||||
width: 12%;
|
||||
line-height: 1.4;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.features-copy {
|
||||
width: 88%;
|
||||
}
|
||||
|
||||
|
||||
.plansPageStudentLink {
|
||||
margin-left: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
input.paymentTypeOption.ng-valid {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.totalPrice {
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
.pricingBreakdown {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/**
|
||||
Plans Test
|
||||
*/
|
||||
|
@ -141,74 +152,10 @@ input.paymentTypeOption.ng-valid {
|
|||
@highlight-color: #d3584b;
|
||||
@gray-med: #6d6d6d;
|
||||
@white-med: #fdfdfd;
|
||||
.more-details {
|
||||
.best-value {
|
||||
color: @red;
|
||||
line-height: @line-height-computed;
|
||||
}
|
||||
blockquote {
|
||||
footer{
|
||||
/* accessibility fix */
|
||||
color: @gray-med;
|
||||
}
|
||||
}
|
||||
.btn-header {
|
||||
font-family: @font-family-sans-serif;
|
||||
margin-left: 10px;
|
||||
margin-top: -10px;
|
||||
text-shadow: 0 0 0;
|
||||
}
|
||||
.card-first, .card-last {
|
||||
background: @white-med;
|
||||
}
|
||||
.card-highlighted {
|
||||
border: @highlight-border solid @gray-lighter;
|
||||
padding-top: 10px!important;
|
||||
.best-value {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.card-header {
|
||||
padding-bottom: 22px; /* align hr with other plans */
|
||||
}
|
||||
}
|
||||
.card-header {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.circle {
|
||||
/* accessibility fix */
|
||||
span.small {
|
||||
color: rgba(255, 255, 255, 0.85)
|
||||
}
|
||||
}
|
||||
.circle-img {
|
||||
border-radius: 50%;
|
||||
float: right;
|
||||
height: 100px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
width: 100px;
|
||||
img {
|
||||
display: inline;
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
.faq:last-child {
|
||||
p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
.questions-header {
|
||||
color: @red;
|
||||
line-height: 37px;
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
}
|
||||
.tagline {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
/* Media Queries */
|
||||
@media (max-width: @screen-md-min) {
|
||||
|
||||
/* Media Queries */
|
||||
@media (max-width: @screen-sm-max) {
|
||||
.plans {
|
||||
.card-highlighted {
|
||||
/*override style in cards.less */
|
||||
margin-top: @line-height-computed!important;
|
||||
|
@ -217,8 +164,10 @@ input.paymentTypeOption.ng-valid {
|
|||
float: left;
|
||||
margin: 0 15px;
|
||||
}
|
||||
}
|
||||
@media (min-width: @screen-md-min) {
|
||||
}
|
||||
}
|
||||
@media (min-width: @screen-md-min) {
|
||||
.plans {
|
||||
blockquote {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
@ -390,4 +339,4 @@ input.paymentTypeOption.ng-valid {
|
|||
.tooltip.in {
|
||||
min-width: 200px
|
||||
}
|
||||
}
|
||||
}
|
|
@ -100,14 +100,6 @@ describe "SubscriptionController", ->
|
|||
@UserGetter.getUser.callCount.should.equal 1
|
||||
done()
|
||||
|
||||
it 'should decide not to AB test the plans when signed up before 2018-06-06', (done) ->
|
||||
# Users before we introduce the test may have already seen the old variant,
|
||||
# and so may react positively to a change rather than the variant itself.
|
||||
# So it's more likely to skew in favour of the change
|
||||
# just because change makes things 'fresh'
|
||||
@res.renderedVariables.shouldABTestPlans.should.equal false
|
||||
done()
|
||||
|
||||
describe 'not dependant on logged in state', (done) ->
|
||||
# these could have been put in 'when user is not logged in' too
|
||||
it "should set the recommended currency from the geoiplookup", (done)->
|
||||
|
@ -115,7 +107,6 @@ describe "SubscriptionController", ->
|
|||
@GeoIpLookup.getCurrencyCode.calledWith(@req.ip).should.equal true
|
||||
done()
|
||||
it 'should include data for features table', (done) ->
|
||||
# this is part of AB test. If default wins test, then remove this test
|
||||
@res.renderedVariables.planFeatures.length.should.not.equal 0
|
||||
done()
|
||||
|
||||
|
@ -150,10 +141,6 @@ describe "SubscriptionController", ->
|
|||
@UserGetter.getUser.callCount.should.equal 0
|
||||
done()
|
||||
|
||||
it 'should decide to AB test', (done) ->
|
||||
@res.renderedVariables.shouldABTestPlans.should.equal true
|
||||
done()
|
||||
|
||||
describe "paymentPage", ->
|
||||
beforeEach ->
|
||||
@req.headers = {}
|
||||
|
|
Loading…
Reference in a new issue