diff --git a/static/styles/landing-page.scss b/static/styles/landing-page.scss index fc5c89c8d6..746466420f 100644 --- a/static/styles/landing-page.scss +++ b/static/styles/landing-page.scss @@ -3036,6 +3036,61 @@ nav ul li.active::after { background-color: #3ca08d; } +// Billing & Upgrade +.billing-upgrade-page { + font-family: Source Sans Pro, Helvetica, Arial, sans-serif; + background: #fafafa; + height: 100vh; + + .hero { + background: #69b190; + color: #69b190; + position: absolute; + top: 0; + width: 100%; + } + + .small-hero { + padding: 120px 50px 0; + } + + .main { + width: 800px; + max-width: 90%; + margin: 0 auto; + } + + h1 { + margin: 30px 0; + font-weight: bold; + } + + .nav { + margin-bottom: 0; + } + + .nav-tabs { + border-bottom: 0; + font-size: 1.2em; + a { + font-weight: bold; + } + } + + .tab-content { + border: 1px solid #ddd; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + padding: 20px; + background: #fefefe; + font-size: 1.1em; + } + + .support-link { + margin: 10px 20px; + } +} + @keyframes box-shadow-pulse { 0% { box-shadow: 0px 0px 0px rgba(106, 201, 185, 0); @@ -3648,6 +3703,13 @@ nav ul li.active::after { padding: 0px 20px; } + .billing-upgrade-page { + .nav-tabs, + .tab-content { + font-size: 1em; + } + } + } @media (max-width: 686px) { diff --git a/templates/zerver/billing_nav.html b/templates/zerver/billing_nav.html new file mode 100644 index 0000000000..26ab6f4d88 --- /dev/null +++ b/templates/zerver/billing_nav.html @@ -0,0 +1,13 @@ + diff --git a/templates/zilencer/billing.html b/templates/zilencer/billing.html index 2596b7ff10..bd61e9f44a 100644 --- a/templates/zilencer/billing.html +++ b/templates/zilencer/billing.html @@ -1,4 +1,4 @@ -{% extends "zerver/base.html" %} +{% extends "zerver/portico.html" %} {% block customhead %} @@ -6,33 +6,60 @@ {% endblock %} {% block content %} +
+ {% include 'zerver/billing_nav.html' %} + {{ render_bundle('translations') }} -
-

{{ _("Billing") }}

- {% if admin_access %} - Plan
- {{ plan_name }}
-
- You are paying for {{ seat_count }} users.
- Your plan will renew on {{ renewal_date }} for ${{ renewal_amount }}.
- {% if prorated_charges %} - You have ${{ prorated_charges }} in prorated charges that will be - added to your next bill. - {% elif prorated_credits %} - You have ${{ prorated_credits }} in prorated credits that will be - automatically applied to your next bill. - {% endif %} -
-
- Payment method: {{ payment_method }}.
-
- Contact support@zulipchat.com for billing history or to make changes to your subscription. - {% else %} - You must be an organization administrator or a billing administrator to view this page. - {% endif %} +
+
+ +
+
+ +

{{ _("Billing") }}

+ {% if admin_access %} + + +
+
+

Your current plan is {{ plan_name }}

+

You are paying for {{ seat_count }} users.

+

Your plan will renew on {{ renewal_date }} for ${{ renewal_amount }}.

+ {% if prorated_charges %} +

You have ${{ prorated_charges }} in prorated charges that will be added to your next bill.

+ {% elif prorated_credits %} +

You have ${{ prorated_credits }} in prorated credits that will be automatically applied to your next bill.

+ {% endif %} +
+
+

Your current payment method is {{ payment_method }}.

+
+
+ + + + + {% else %} +

+ You must be an organization administrator or a + billing administrator to view this page. +

+ {% endif %} +
+
{% endblock %} diff --git a/tools/linter_lib/custom_check.py b/tools/linter_lib/custom_check.py index a2a1c67946..061db0ac89 100644 --- a/tools/linter_lib/custom_check.py +++ b/tools/linter_lib/custom_check.py @@ -694,6 +694,7 @@ def build_custom_checkers(by_lang): # Inline styling for an svg; could be moved to CSS files? 'templates/zerver/landing_nav.html', + 'templates/zerver/billing_nav.html', 'templates/zerver/app/home.html', 'templates/zerver/features.html', 'templates/zerver/portico-header.html', diff --git a/zilencer/tests/test_stripe.py b/zilencer/tests/test_stripe.py index f2d35ff554..f4698d7217 100644 --- a/zilencer/tests/test_stripe.py +++ b/zilencer/tests/test_stripe.py @@ -150,11 +150,11 @@ class StripeTest(ZulipTestCase): 'plan': Plan.CLOUD_ANNUAL}) # Check that the non-admin hamlet can still access /billing response = self.client_get("/billing/") - self.assert_in_success_response(["Contact support@zulipchat.com for billing"], response) + self.assert_in_success_response(["for billing history or to make changes"], response) # Check admins can access billing, even though they are not the billing_user self.login(self.example_email('iago')) response = self.client_get("/billing/") - self.assert_in_success_response(["Contact support@zulipchat.com for billing"], response) + self.assert_in_success_response(["for billing history or to make changes"], response) # Check that non-admin, non-billing_user does not have access self.login(self.example_email("cordelia")) response = self.client_get("/billing/") @@ -214,7 +214,7 @@ class StripeTest(ZulipTestCase): realm=self.realm, stripe_customer_id=self.stripe_customer_id, billing_user=self.user) response = self.client_get("/billing/") self.assert_not_in_success_response(['We can also bill by invoice'], response) - for substring in ['Your plan will renew on', 'for $%s.00' % (80 * self.quantity,), + for substring in ['Your plan will renew on', '$%s.00' % (80 * self.quantity,), 'Card ending in 4242']: self.assert_in_response(substring, response)