fix fields for validate

This commit is contained in:
Kyle Drake 2014-10-24 16:43:24 -07:00
parent 58131f4964
commit f2180b1385
7 changed files with 156 additions and 244 deletions

2
.gitignore vendored
View file

@ -30,4 +30,4 @@ files/map.txt
.sass-cache/* .sass-cache/*
files/sslsites.zip files/sslsites.zip
.tm_properties .tm_properties
black_box.rb ./black_box.rb

8
app.rb
View file

@ -267,10 +267,6 @@ get '/plan/?' do
erb :'plan/index' erb :'plan/index'
end end
get '/plan/create' do
erb :''
end
=begin =begin
get '/plan/?' do get '/plan/?' do
@title = 'Supporter' @title = 'Supporter'
@ -510,7 +506,7 @@ end
post '/create_validate_all' do post '/create_validate_all' do
content_type :json content_type :json
fields = params.select {|p| p.match /username|password|email|new_tags_string/} fields = params.select {|p| p.match /^username$|^password$|^email$|^new_tags_string$/}
site = Site.new fields site = Site.new fields
return [].to_json if site.valid? return [].to_json if site.valid?
@ -520,7 +516,7 @@ end
post '/create_validate' do post '/create_validate' do
content_type :json content_type :json
if !params[:field].match /username|password|email|new_tags_string/ if !params[:field].match /^username$|^password$|^email$|^new_tags_string$/
return {error: 'not a valid field'}.to_json return {error: 'not a valid field'}.to_json
end end

View file

@ -75,22 +75,6 @@ class Site < Sequel::Model
COMMENTING_ALLOWED_UPDATED_COUNT = 2 COMMENTING_ALLOWED_UPDATED_COUNT = 2
PLAN_FEATURES = {
fatcat: {
name: 'Fat Cat',
space: Filesize.from('50GB').to_i,
bandwidth: Filesize.from('3TB').to_i,
price: 10,
custom_domains: true,
custom_ssl_certificates: true,
global_cdn: true,
ddos_mitigation: true,
unlimited_site_creation: true,
site_mounting: true,
no_file_restrictions: true
}
}
SUGGESTIONS_LIMIT = 30 SUGGESTIONS_LIMIT = 30
SUGGESTIONS_VIEWS_MIN = 500 SUGGESTIONS_VIEWS_MIN = 500
CHILD_SITES_MAX = 100 CHILD_SITES_MAX = 100
@ -98,11 +82,23 @@ class Site < Sequel::Model
IP_CREATE_LIMIT = 50 IP_CREATE_LIMIT = 50
TOTAL_IP_CREATE_LIMIT = 300 TOTAL_IP_CREATE_LIMIT = 300
PLAN_FEATURES = {
fatcat: {
name: 'Fat Cat',
space: Filesize.from('20GB').to_i,
bandwidth: Filesize.from('3TB').to_i,
price: 10,
unlimited_site_creation: true,
custom_ssl_certificates: true,
no_file_restrictions: true
}
}
PLAN_FEATURES[:catbus] = PLAN_FEATURES[:fatcat].merge( PLAN_FEATURES[:catbus] = PLAN_FEATURES[:fatcat].merge(
name: 'Cat Bus', name: 'Cat Bus',
space: Filesize.from('10GB').to_i, space: Filesize.from('5GB').to_i,
bandwidth: Filesize.from('1TB').to_i, bandwidth: Filesize.from('1TB').to_i,
price: 5 price: 5,
) )
PLAN_FEATURES[:supporter] = PLAN_FEATURES[:catbus].merge( PLAN_FEATURES[:supporter] = PLAN_FEATURES[:catbus].merge(
@ -110,20 +106,16 @@ class Site < Sequel::Model
space: Filesize.from('1GB').to_i, space: Filesize.from('1GB').to_i,
bandwidth: Filesize.from('0.5TB').to_i, bandwidth: Filesize.from('0.5TB').to_i,
price: 2, price: 2,
unlimited_site_creation: false,
custom_ssl_certificates: false, custom_ssl_certificates: false,
no_file_restrictions: false no_file_restrictions: false
) )
PLAN_FEATURES[:free] = PLAN_FEATURES[:supporter].merge( PLAN_FEATURES[:free] = PLAN_FEATURES[:supporter].merge(
name: 'Free', name: 'Free',
space: Filesize.from('20MB').to_i, space: Filesize.from('30MB').to_i,
bandwidth: Filesize.from('100GB').to_i, bandwidth: Filesize.from('100GB').to_i,
price: 0, price: 0,
custom_domains: false, unlimited_site_creation: false
global_cdn: false,
ddos_mitigation: false,
site_mounting: false
) )
many_to_many :tags many_to_many :tags

View file

@ -1,6 +1,25 @@
<%
def plan_pricing_button(plan_type)
plan_type = plan_type.to_s
if !parent_site
%{<a href="/#new" class="btn-Action">Sign Up</a>}
elsif parent_site && parent_site.plan_type == plan_type
%{<p style="padding-top: 15px; padding-bottom: 14px"><strong>Current Plan</strong></p>}
else
if plan_type == 'supporter'
plan_price = "$#{Site::PLAN_FEATURES[plan_type.to_sym][:price]*12}, once per year"
else
plan_price = "$#{Site::PLAN_FEATURES[plan_type.to_sym][:price]}, monthly"
end
%{<a data-plan_name="#{Site::PLAN_FEATURES[plan_type.to_sym][:name]}" data-plan_type="#{plan_type}" data-plan_price="#{plan_price}" onclick="return false" class="btn-Action planPricingButton">Choose</a>}
end
end
%>
<section class="section plans"> <section class="section plans">
<h2>Need more power? Weve got you covered.<br>Upgrading gives you more space, bandwidth, features, <strong>and helps us keep the free sites free, forever.</strong></h2> <h2>Need more power? Weve got you covered.<br>Upgrading gives you more space, bandwidth, features, <strong>and helps us stay independent and keep the free sites free.</strong></h2>
<div class="plan-overview"> <div class="plan-overview">
<div class="header"> <div class="header">
<div class="col col-25 personal"> <div class="col col-25 personal">
@ -10,7 +29,7 @@
Supporter Supporter
</div> </div>
</div> </div>
<div class="body"> <div class="body">
<div class="col col-25 free"> <div class="col col-25 free">
<div class="plan-image free" data-original-title="Pick me!"> <div class="plan-image free" data-original-title="Pick me!">
@ -18,7 +37,7 @@
<h3>Free</h3> <h3>Free</h3>
<div class="price">$<%= Site::PLAN_FEATURES[:free][:price] %></div> <div class="price">$<%= Site::PLAN_FEATURES[:free][:price] %></div>
<div class="interval">per month</div> <div class="interval">per month</div>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :free %>
<ul> <ul>
<li><strong><%= Site::PLAN_FEATURES[:free][:space].to_space_pretty %></strong> storage</li> <li><strong><%= Site::PLAN_FEATURES[:free][:space].to_space_pretty %></strong> storage</li>
<li><strong><%= Site::PLAN_FEATURES[:free][:bandwidth].to_space_pretty %></strong> bandwidth</li> <li><strong><%= Site::PLAN_FEATURES[:free][:bandwidth].to_space_pretty %></strong> bandwidth</li>
@ -26,13 +45,13 @@
<ul> <ul>
</ul> </ul>
</div> </div>
<div class="col col-25 supporter"> <div class="col col-25 supporter">
<div class="plan-image" data-original-title="No no, pick me!"></div> <div class="plan-image" data-original-title="No no, pick me!"></div>
<h3>Supporter</h3> <h3>Supporter</h3>
<div class="price">$<%= Site::PLAN_FEATURES[:supporter][:price] %></div> <div class="price">$<%= Site::PLAN_FEATURES[:supporter][:price] %></div>
<div class="interval">per month, billed annually</div> <div class="interval">per month, billed annually</div>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :supporter %>
<ul> <ul>
<li><strong><%= Site::PLAN_FEATURES[:supporter][:space].to_space_pretty %></strong> storage</li> <li><strong><%= Site::PLAN_FEATURES[:supporter][:space].to_space_pretty %></strong> storage</li>
<li><strong><%= Site::PLAN_FEATURES[:supporter][:bandwidth].to_space_pretty %></strong> bandwidth</li> <li><strong><%= Site::PLAN_FEATURES[:supporter][:bandwidth].to_space_pretty %></strong> bandwidth</li>
@ -42,14 +61,14 @@
<li>More space</li> <li>More space</li>
</ul> </ul>
</div> </div>
<div class="col col-25 catbus"> <div class="col col-25 catbus">
<div class="plan-image" data-original-title="VROOOOOOM!"></div> <div class="plan-image" data-original-title="VROOOOOOM!"></div>
<h3>Cat Bus</h3> <h3>Cat Bus</h3>
<div class="price">$<%= Site::PLAN_FEATURES[:catbus][:price] %></div> <div class="price">$<%= Site::PLAN_FEATURES[:catbus][:price] %></div>
<div class="interval">per month</div> <div class="interval">per month</div>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :catbus %>
<ul> <ul>
<li><strong><%= Site::PLAN_FEATURES[:catbus][:space].to_space_pretty %></strong> storage</li> <li><strong><%= Site::PLAN_FEATURES[:catbus][:space].to_space_pretty %></strong> storage</li>
<li><strong><%= Site::PLAN_FEATURES[:catbus][:bandwidth].to_space_pretty %></strong> bandwidth</li> <li><strong><%= Site::PLAN_FEATURES[:catbus][:bandwidth].to_space_pretty %></strong> bandwidth</li>
@ -61,13 +80,13 @@
<li>Even more space</li> <li>Even more space</li>
</ul> </ul>
</div> </div>
<div class="col col-25 fatcat"> <div class="col col-25 fatcat">
<div class="plan-image" data-original-title="Jolly good."></div> <div class="plan-image" data-original-title="Jolly good."></div>
<h3>Fat Cat</h3> <h3>Fat Cat</h3>
<div class="price">$<%= Site::PLAN_FEATURES[:fatcat][:price] %></div> <div class="price">$<%= Site::PLAN_FEATURES[:fatcat][:price] %></div>
<div class="interval">per month</div> <div class="interval">per month</div>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :fatcat %>
<ul> <ul>
<li><strong><%= Site::PLAN_FEATURES[:fatcat][:space].to_space_pretty %></strong> storage</li> <li><strong><%= Site::PLAN_FEATURES[:fatcat][:space].to_space_pretty %></strong> storage</li>
<li><strong><%= Site::PLAN_FEATURES[:fatcat][:bandwidth].to_space_pretty %></strong> bandwidth</li> <li><strong><%= Site::PLAN_FEATURES[:fatcat][:bandwidth].to_space_pretty %></strong> bandwidth</li>
@ -79,11 +98,9 @@
<li>A lot more space!</li> <li>A lot more space!</li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
<!-- <h2><a href="">Compare Plans <i class="fa fa-caret-down"></i></a></h2> --> <!-- <h2><a href="">Compare Plans <i class="fa fa-caret-down"></i></a></h2> -->
<h2 style="margin-top: 2em">Compare Plans</h2> <h2 style="margin-top: 2em">Compare Plans</h2>
<table class="plan-chart"> <table class="plan-chart">
@ -92,22 +109,22 @@
<th> <th>
<h3>Free</h3> <h3>Free</h3>
<p>$<%= Site::PLAN_FEATURES[:free][:price] %>/mo</p> <p>$<%= Site::PLAN_FEATURES[:free][:price] %>/mo</p>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :free %>
</th> </th>
<th class="professional"> <th class="professional">
<h3>Supporter</h3> <h3>Supporter</h3>
<p>$<%= Site::PLAN_FEATURES[:supporter][:price] %>/mo</p> <p>$<%= Site::PLAN_FEATURES[:supporter][:price] %>/mo</p>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :supporter %>
</th> </th>
<th class="professional"> <th class="professional">
<h3>Cat Bus</h3> <h3>Cat Bus</h3>
<p>$<%= Site::PLAN_FEATURES[:catbus][:price] %>/mo</p> <p>$<%= Site::PLAN_FEATURES[:catbus][:price] %>/mo</p>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :catbus %>
</th> </th>
<th class="professional"> <th class="professional">
<h3>Fat Cat</h3> <h3>Fat Cat</h3>
<p>$<%= Site::PLAN_FEATURES[:fatcat][:price] %>/mo</p> <p>$<%= Site::PLAN_FEATURES[:fatcat][:price] %>/mo</p>
<a href="/" class="btn-Action">Choose</a> <%== plan_pricing_button :fatcat %>
</th> </th>
</tr> </tr>
<tr> <tr>
@ -264,6 +281,57 @@
<td><i class="fa fa-check"></i></td> <td><i class="fa fa-check"></i></td>
</tr> </tr>
</table> </table>
<% if request.path.match /\/plan/ %>
<div class="row" style="margin-top: 50px; margin-bottom: 0px;">
<div class="col-50" style="margin-left: auto; margin-right: auto">
<h2>Why get the Supporter Plan?</h2>
</div>
</div>
<div class="row" style="margin-top: 0px">
<div class="col-75" style="margin-left: auto; margin-right: auto;">
<h3 style="margin-top: 0px">
The Neocities Supporter Plans are a way to help sustain the site. When you join the Supporter Plan, you are directly helping our quest to bring back the creative, independent web, and to continue to improve Neocities for everyone.
</h3>
</div>
</div>
<div class="row">
<div class="col-60" style="margin-left: auto; margin-right: auto">
<ul>
<li>
<strong>You get more space!</strong> Right now supporter plans get up to <strong><%= Site::SUPPORTER_MAXIMUM.to_space_pretty %></strong>.
</li>
<li>
<strong>It helps your site.</strong> Funding helps us make your site faster globally, and provide more features.
</li>
<li>
<strong>It helps us build.</strong> It allows us to work on Neocities full-time, without worrying about bills.
</li>
<li>
<strong>It helps the web.</strong> The web needs more independent, creative sites. Neocities is leading the way.
</li>
<li>
<strong>It's Open Source.</strong> Neocities is <a href="https://github.com/neocities" target="_blank">completely open source</a>, and we share code with the community.
</li>
<li>
<strong>No lock-in.</strong> Redirecting your site is easy, free site downloads, and support for custom domains.
</li>
<li><strong>No ads, ever.</strong> We'll never put ads or watermarks on sites, and we don't sell user data.</li>
<li>
<strong>It's safe.</strong> We use <a href="https://stripe.com" target="_blank">Stripe</a> for payments, and never store your credit card information directly.
</li>
<li>
<strong>It's affordable.</strong> As low as <strong>$<%= Site::PLAN_FEATURES[:supporter][:price] %>/month</strong> (billed once every year). Higher tiers are optional (and appreciated!)
</li>
<li>
<strong>You can cancel anytime.</strong>
</li>
</ul>
</div>
</div>
<% end %>
</section> </section>
<script> <script>
@ -276,4 +344,54 @@
placement: 'top' placement: 'top'
}) })
}) })
</script>
$(".planPricingButton").on('click', function(obj) {
$('#upgradePlanType').val($(obj.target).attr('data-plan_type'))
$('#upgradeFormPlanName').text($(obj.target).attr('data-plan_name'))
$('#upgradeFormPlanPrice').text($(obj.target).attr('data-plan_price'))
$('#planSignup').modal()
})
</script>
<div class="modal hide fade" id="planSignup" tabindex="-1" role="dialog" aria-labelledby="planSignupLabel" aria-hidden="true">
<div class="modal-header">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true">x</button>
<h3 id="planSignupLabel">Upgrade</h3>
</div>
<div class="modal-body">
<form>
<input type="hidden" value="<%= csrf_token %>" name="csrf_token">
<input type="hidden" value="" name="plan_type" id="upgradePlanType">
<div>
You are upgrading to the <strong><span id="upgradeFormPlanName"></span> Plan</strong>. You will be charged <span id="upgradeFormPlanPrice"></span>.
</div>
<input id="stripe_token" name="stripe_token" type="hidden" value="<%= params[:stripe_token] %>">
<div style="margin-top: 30px">
<div id="plan_error" class="alert alert-block alert-error" style="display:none"></div>
<% if params[:stripe_token] %>
<p>Billing information has been saved, thank you!</p>
<% else %>
<p>
Card Number: <input type="text" size="20" data-stripe="number" placeholder="XXXX-XXXX-XXXX-XXXX">
CVC: <input type="text" size="4" maxlength="4" data-stripe="cvc" style="width: 60px" placeholder="123">
</p>
<p>
Expiration:
<input type="text" size="2" data-stripe="exp-month" placeholder="MM" maxlength="2" style="width: 50px">
<input type="text" size="4" data-stripe="exp-year" placeholder="YYYY" maxlength="4" style="width: 60px">
</p>
<% end %>
</div>
<p><strong>We accept alternative ways to send money.</strong> If you would prefer to use Bitcoin or Paypal, <a href="/donate" target="_blank">click here</a>.</p>
</form>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
<button type="submit" class="btn btn-Action">Upgrade</button>
</div>
</div>

View file

@ -1,34 +0,0 @@
<div class="header-Outro">
<div class="row content single-Col">
<div class="col col-40">
<h2 class="beta">End Plan</h2>
</div>
<div class="txt-Right">
<img src="/img/support-us.png" width="55">
</div>
</div>
</div>
<div class="content single-Col misc-page">
<h3>Ending the Supporter Plan</h3>
<p>
You currently have the <strong><%= parent_site.plan_name %> (<%= parent_site.maximum_space.to_space_pretty %>)</strong> - <%= @plan_name %>.
</p>
<p>
If you need to end the plan, you can do that here. We'll be sorry to see you go. If there's a reason you're ending that we can help with, please <a href="/contact">contact us</a> and we'll see if we can help you with your issue. Regardless, we'll let you keep your site and the extra space. We hope you'll decide to become a supporter again in the future!
</p>
<% if @error %>
<div class="alert alert-block alert-error">
<p><%= @error %></p>
</div>
<% end %>
<form method="POST" action="/plan/end">
<input name="csrf_token" type="hidden" value="<%= csrf_token %>">
<div class="recaptcha">
<%== recaptcha_tag :challenge, ssl: request.ssl? %>
</div>
<input class="btn" type="submit" value="End plan">
</form>
</div>

View file

@ -1,142 +1 @@
<script type="text/javascript" src="https://js.stripe.com/v2/"></script> <%== erb :'plan/_pricing' %>
<script type="text/javascript">
Stripe.setPublishableKey('<%= $config['stripe_publishable_key'] %>');
</script>
<div class="header-Outro">
<div class="row content single-Col">
<div class="col col-50">
<h1>Support Neocities</h1>
</div>
<div class="txt-Right">
<img src="/img/support-us.png" width="55">
</div>
</div>
</div>
<div class="content single-Col misc-page">
<h3></h3>
<% if parent_site && parent_site.supporter? && !parent_site.plan_ended %>
<p>
You currently have the <strong><%= parent_site.plan_name %> (<%= parent_site.maximum_space.to_space_pretty %>)</strong>.
</p>
<p>
Your support means a lot to us. On behalf of Penelope the cat and everyone at Neocities, thank you. If there's anything we can do to make your experience even better, please don't hesitate to <a href="/contact">contact us</a>.
</p>
<a href="/plan/manage">Manage plan</a>
<% else %>
<% if parent_site %>
<p>You currently have the <strong>Free Plan (<%= parent_site.maximum_space.to_space_pretty %>)</strong>. Need more space? Become a <strong>Neocities Supporter!</strong></p>
<h3>Why upgrade?</h3>
<% else %>
<p>The Neocities Supporter Plan is a way to help sustain the site. When you join the Supporter Plan, you are directly helping our quest to bring back the creative, independent web, and to continue to improve Neocities for everyone.
</p>
<h3>Why get the Supporter Plan?</h3>
<% end %>
<ul>
<li>
<strong>You get more space!</strong> Right now supporter plans get up to <strong><%= Site::SUPPORTER_MAXIMUM.to_space_pretty %></strong>.
</li>
<li>
<strong>It helps your site.</strong> Funding helps us make your site faster globally, and provide more features.
</li>
<li>
<strong>It helps us build.</strong> It allows us to work on Neocities full-time, without worrying about bills.
</li>
<li>
<strong>It helps the web.</strong> The web needs more independent, creative sites. Neocities is leading the way.
</li>
<li>
<strong>It's Open Source.</strong> Neocities is <a href="https://github.com/neocities" target="_blank">completely open source</a>, and we share code with the community.
</li>
<li>
<strong>No lock-in.</strong> Redirecting your site is easy, free site downloads, and support for custom domains.
</li>
<li><strong>No ads, ever.</strong> We'll never put ads or watermarks on sites, and we don't sell user data.</li>
<li>
<strong>It's safe.</strong> We use <a href="https://stripe.com" target="_blank">Stripe</a> for payments, and never store your credit card information directly.
</li>
<li>
<strong>It's affordable.</strong> As low as <strong>$1/month</strong> (billed once every year). Higher tiers are optional (and appreciated!)
</li>
<li>
<strong>You can cancel anytime.</strong> And if you do, you can keep the extra space!
</li>
</ul>
<% if !current_site %>
<h2 class="txt-Center">Become a Supporter</h2>
<p>If you would like to become a Neocities Supporter, <a href="/signin">Sign In</a> and click the <strong>Settings</strong> link. If you haven't created a site yet, <a href="/new">create your web site now</a>! We would love if you became a Supporter, but base sites on Neocities will always be free.</p>
<% else %>
<h2 class="txt-Center">Become a Supporter Now</h2>
<div id="plan_container" style="margin-top:20px" class="txt-Center">
<form method="post" action="/plan/create" id="planform">
<input type="hidden" name="csrf_token" value="<%= csrf_token %>">
<input id="stripe_token" name="stripe_token" type="hidden" value="<%= params[:stripe_token] %>">
<div id="plan_error" class="alert alert-block alert-error" style="display:none"></div>
<p class="tiny">
Supporter Tier:
<select name="selected_plan" style="width: 200px">
<option value="plan_one">$12/year ($1/month)</option>
<option value="plan_two" <%= params[:selected_plan].nil? ? 'selected' : '' %>>$24/year ($2/month)</option>
<option value="plan_three">$36/year ($3/month)</option>
<option value="plan_four">$48/year ($4/month)</option>
<option value="plan_five">$60/year ($5/month)</option>
</select>
</p>
<p class="tiny">
Card Number: <input type="text" size="20" data-stripe="number">
CVC: <input type="text" size="4" maxlength="4" data-stripe="cvc" style="width: 60px">
</p>
<p class="tiny">
Expiration:
<input type="text" size="2" data-stripe="exp-month" placeholder="MM" maxlength="2" style="width: 50px">
<input type="text" size="4" data-stripe="exp-year" placeholder="YYYY" maxlength="4" style="width: 60px">
</p>
<input class="btn-Action" type="submit" value="Upgrade!">
</form>
</div>
<% end %>
<% end %>
<h2 class="txt-Center">One-Time Donations</h2>
<p>
Prefer to not use a credit card? Neocities has many other ways to become a supporter! <a href="/donate">Click here</a> to learn about other ways to contribute. We accept <a href="/donate">PayPal, Bitcoin and Gittip</a>, and will be happy to upgrade your account for you if you contribute and <a href="/contact">contact us with your site username</a>.
</p>
</div>
<script>
window.onload = function() {
$('#planform').find(':submit').prop('disabled', false)
$('#planform').submit(function(event) {
if($('#stripe_token').val() != '')
return true
var planError = $('#plan_error')
planError.css('display', 'none')
var planform = $(this)
planform.find(':submit').prop('disabled', true)
Stripe.card.createToken(planform, function(status, response) {
if(response.error) {
planError.text(response.error.message)
planError.css('display', 'block')
planform.find(':submit').prop('disabled', false)
return false
} else {
$('#stripe_token').val(response.id)
planform.submit()
}
})
return false
})
}
</script>

View file

@ -1,19 +0,0 @@
<div class="header-Outro">
<div class="row content single-Col">
<div class="col col-50">
<h2 class="beta">Manage Supporter Plan</h2>
</div>
<div class="txt-Right">
<img src="/img/support-us.png" width="55">
</div>
</div>
</div>
<div class="content single-Col misc-page">
<h3>Change your Supporter Plan</h3>
<p>
You currently have the <strong><%= parent_site.plan_name %> (<%= parent_site.maximum_space.to_space_pretty %>)</strong> - <%= @plan_name %>.
</p>
<a href="/plan/end">End plan</a>
</div>