start on accounts using site context, improved settings page, clean up space representation

This commit is contained in:
Kyle Drake 2014-10-07 02:22:08 +02:00
parent 8a36f1c6f5
commit d3c1546d45
17 changed files with 243 additions and 105 deletions

49
app.rb
View file

@ -125,6 +125,23 @@ post '/site/:username/set_editor_theme' do
'ok' 'ok'
end end
post '/site/create_child' do
require_login
site = Site.new
site.parent_site_id = current_site.id
site.username = params[:username]
if site.valid?
site.save
flash[:success] = 'Your new site has been created!'
redirect '/settings#sites'
else
flash[:error] = site.errors.first.last.first
redirect '/settings#sites'
end
end
post '/site/:username/comment' do |username| post '/site/:username/comment' do |username|
require_login require_login
@ -547,7 +564,7 @@ post '/settings/profile' do
profile_comments_enabled: params[:site][:profile_comments_enabled] profile_comments_enabled: params[:site][:profile_comments_enabled]
) )
flash[:success] = 'Profile settings changed.' flash[:success] = 'Profile settings changed.'
redirect '/settings' redirect '/settings#profile'
end end
post '/settings/ssl' do post '/settings/ssl' do
@ -655,7 +672,7 @@ post '/signin' do
dashboard_if_signed_in dashboard_if_signed_in
if Site.valid_login? params[:username], params[:password] if Site.valid_login? params[:username], params[:password]
site = Site[username: params[:username]] site = Site.get_with_identifier params[:username]
if site.is_banned if site.is_banned
flash[:error] = 'Invalid login.' flash[:error] = 'Invalid login.'
@ -692,7 +709,7 @@ post '/change_password' do
if !Site.valid_login?(current_site.username, params[:current_password]) if !Site.valid_login?(current_site.username, params[:current_password])
current_site.errors.add :password, 'Your provided password does not match the current one.' current_site.errors.add :password, 'Your provided password does not match the current one.'
halt erb(:'settings') redirect '/settings#password'
end end
current_site.password = params[:new_password] current_site.password = params[:new_password]
@ -705,9 +722,10 @@ post '/change_password' do
if current_site.errors.empty? if current_site.errors.empty?
current_site.save_changes current_site.save_changes
flash[:success] = 'Successfully changed password.' flash[:success] = 'Successfully changed password.'
redirect '/settings' redirect '/settings#password'
else else
halt erb(:'settings') flash[:error] = current_site.errors.first.last.first
redirect '/settings#password'
end end
end end
@ -715,8 +733,8 @@ post '/change_email' do
require_login require_login
if params[:email] == current_site.email if params[:email] == current_site.email
current_site.errors.add :email, 'You are already using this email address for this account.' flash[:error] = 'You are already using this email address for this account.'
halt erb(:settings) redirect '/settings#email'
end end
current_site.email = params[:email] current_site.email = params[:email]
@ -727,11 +745,11 @@ post '/change_email' do
current_site.save_changes current_site.save_changes
send_confirmation_email send_confirmation_email
flash[:success] = 'Successfully changed email. We have sent a confirmation email, please use it to confirm your email address.' flash[:success] = 'Successfully changed email. We have sent a confirmation email, please use it to confirm your email address.'
redirect '/settings' redirect '/settings#email'
end end
current_site.reload flash[:error] = current_site.errors.first.last.first
erb :settings redirect '/settings#email'
end end
post '/change_name' do post '/change_name' do
@ -740,12 +758,12 @@ post '/change_name' do
if params[:name] == nil || params[:name] == '' if params[:name] == nil || params[:name] == ''
flash[:error] = 'Name cannot be blank.' flash[:error] = 'Name cannot be blank.'
redirect '/settings' redirect '/settings#username'
end end
if old_username == params[:name] if old_username == params[:name]
flash[:error] = 'You already have this name.' flash[:error] = 'You already have this name.'
redirect '/settings' redirect '/settings#username'
end end
old_host = current_site.host old_host = current_site.host
@ -764,9 +782,10 @@ post '/change_name' do
end end
flash[:success] = "Site/user name has been changed. You will need to use this name to login, <b>don't forget it</b>." flash[:success] = "Site/user name has been changed. You will need to use this name to login, <b>don't forget it</b>."
redirect '/settings' redirect '/settings#username'
else else
halt erb(:'settings') flash[:error] = current_site.errors.first.last.first
redirect '/settings#username'
end end
end end
@ -774,7 +793,7 @@ post '/change_nsfw' do
require_login require_login
current_site.update is_nsfw: params[:is_nsfw] current_site.update is_nsfw: params[:is_nsfw]
flash[:success] = current_site.is_nsfw ? 'Marked 18+' : 'Unmarked 18+' flash[:success] = current_site.is_nsfw ? 'Marked 18+' : 'Unmarked 18+'
redirect '/settings' redirect '/settings#nsfw'
end end
post '/site_files/create_page' do post '/site_files/create_page' do

View file

@ -1,5 +1,15 @@
class Numeric class Numeric
ONE_MEGABYTE = 1048576
def roundup(nearest=10) def roundup(nearest=10)
self % nearest == 0 ? self : self + nearest - (self % nearest) self % nearest == 0 ? self : self + nearest - (self % nearest)
end end
end
def to_mb
self/ONE_MEGABYTE.to_f
end
def to_space_pretty
"#{(self.to_f / ONE_MEGABYTE).round(2).to_s} MB"
end
end

View file

@ -0,0 +1,9 @@
Sequel.migration do
up {
DB.add_column :sites, :parent_site_id, :integer, index: true
}
down {
DB.drop_column :sites, :parent_site_id
}
end

View file

@ -34,11 +34,8 @@ class Site < Sequel::Model
geojson csv tsv mf ico pdf asc key pgp xml mid midi geojson csv tsv mf ico pdf asc key pgp xml mid midi
} }
ONE_MEGABYTE_IN_BYTES = 1048576 FREE_MAXIMUM = 20 * Numeric::ONE_MEGABYTE
FREE_MAXIMUM_IN_MEGABYTES = 20 SUPPORTER_MAXIMUM = 1000 * Numeric::ONE_MEGABYTE
SUPPORTER_MAXIMUM_IN_MEGABYTES = 1024
FREE_MAXIMUM_IN_BYTES = FREE_MAXIMUM_IN_MEGABYTES * ONE_MEGABYTE_IN_BYTES
SUPPORTER_MAXIMUM_IN_BYTES = SUPPORTER_MAXIMUM_IN_MEGABYTES * ONE_MEGABYTE_IN_BYTES
MINIMUM_PASSWORD_LENGTH = 5 MINIMUM_PASSWORD_LENGTH = 5
BAD_USERNAME_REGEX = /[^\w-]/i BAD_USERNAME_REGEX = /[^\w-]/i
@ -95,6 +92,7 @@ class Site < Sequel::Model
SUGGESTIONS_LIMIT = 32 SUGGESTIONS_LIMIT = 32
SUGGESTIONS_VIEWS_MIN = 500 SUGGESTIONS_VIEWS_MIN = 500
CHILD_SITES_MAX = 1000
PLAN_FEATURES[:catbus] = PLAN_FEATURES[:fatcat].merge( PLAN_FEATURES[:catbus] = PLAN_FEATURES[:fatcat].merge(
name: 'Cat Bus', name: 'Cat Bus',
@ -147,9 +145,33 @@ class Site < Sequel::Model
one_to_many :site_changes one_to_many :site_changes
many_to_one :parent, :key => :parent_site_id, :class => self
one_to_many :children, :key => :parent_site_id, :class => self
def account_sites
if parent?
sites = [self] + children
else
sites = [parent] + parent.children
end
sites.compact
end
def other_sites
if parent?
return children
else
sites = (parent + children)
sites.delete self
sites
end
end
class << self class << self
def valid_login?(username, plaintext) def valid_login?(username_or_email, plaintext)
site = self[username: username] site = get_with_identifier username_or_email
return false if site.nil? return false if site.nil?
site.valid_password? plaintext site.valid_password? plaintext
end end
@ -161,6 +183,14 @@ class Site < Sequel::Model
def bcrypt_cost=(cost) def bcrypt_cost=(cost)
@bcrypt_cost = cost @bcrypt_cost = cost
end end
def get_with_identifier(username_or_email)
if username_or_email =~ /@/
site = self.where(email: username_or_email).where(parent_site_id: nil).first
else
site = self[username: username_or_email]
end
end
end end
def self.banned_ip?(ip) def self.banned_ip?(ip)
@ -317,6 +347,12 @@ class Site < Sequel::Model
def commenting_allowed? def commenting_allowed?
return true if commenting_allowed return true if commenting_allowed
if supporter?
set commenting_allowed: true
save_changes validate: false
return true
end
if events_dataset.exclude(site_change_id: nil).count >= COMMENTING_ALLOWED_UPDATED_COUNT && if events_dataset.exclude(site_change_id: nil).count >= COMMENTING_ALLOWED_UPDATED_COUNT &&
created_at < Time.now - 604800 created_at < Time.now - 604800
set commenting_allowed: true set commenting_allowed: true
@ -554,6 +590,10 @@ class Site < Sequel::Model
super super
end end
def parent?
parent_site_id.nil?
end
# def after_destroy # def after_destroy
# FileUtils.rm_rf files_path # FileUtils.rm_rf files_path
# super # super
@ -576,7 +616,7 @@ class Site < Sequel::Model
end end
# Check that email has been provided # Check that email has been provided
if values[:email].empty? if parent? && values[:email].empty?
errors.add :email, 'An email address is required.' errors.add :email, 'An email address is required.'
end end
@ -586,12 +626,12 @@ class Site < Sequel::Model
email_check.exclude!(id: self.id) unless new? email_check.exclude!(id: self.id) unless new?
email_check = email_check.first email_check = email_check.first
if email_check && email_check.id != self.id if parent? && email_check && email_check.id != self.id
errors.add :email, 'This email address already exists on Neocities, please use your existing account instead of creating a new one.' errors.add :email, 'This email address already exists on Neocities, please use your existing account instead of creating a new one.'
end end
end end
unless values[:email] =~ EMAIL_SANITY_REGEX if parent? && (values[:email] =~ EMAIL_SANITY_REGEX).nil?
errors.add :email, 'A valid email address is required.' errors.add :email, 'A valid email address is required.'
end end
@ -604,7 +644,7 @@ class Site < Sequel::Model
end end
end end
if values[:password].nil? || (@password_length && @password_length < MINIMUM_PASSWORD_LENGTH) if parent? && (values[:password].nil? || (@password_length && @password_length < MINIMUM_PASSWORD_LENGTH))
errors.add :password, "Password must be at least #{MINIMUM_PASSWORD_LENGTH} characters." errors.add :password, "Password must be at least #{MINIMUM_PASSWORD_LENGTH} characters."
end end
@ -622,6 +662,10 @@ class Site < Sequel::Model
if !site.nil? && site.id != self.id if !site.nil? && site.id != self.id
errors.add :domain, "Domain provided is already being used by another site, please choose another." errors.add :domain, "Domain provided is already being used by another site, please choose another."
end end
if new? && !parent? && CHILD_SITE_MAX == children_dataset.count
errors.add :child_site_id, "Cannot add child site, exceeds #{CHILD_SITE_MAX} limit."
end
end end
if @new_tags_string if @new_tags_string
@ -715,39 +759,33 @@ class Site < Sequel::Model
list.select {|f| f[:is_directory] == false}.sort_by{|f| f[:name].downcase} list.select {|f| f[:is_directory] == false}.sort_by{|f| f[:name].downcase}
end end
def file_size_too_large?(size_in_bytes) def file_size_too_large?(size)
return true if size_in_bytes + used_space_in_bytes > maximum_space_in_bytes return true if size + used_space > maximum_space
false false
end end
def used_space_in_bytes def used_space
space = Dir.glob(File.join(files_path, '*')).collect {|p| File.size(p)}.inject {|sum,x| sum += x} space = Dir.glob(File.join(files_path, '*')).collect {|p| File.size(p)}.inject {|sum,x| sum += x}
space.nil? ? 0 : space space.nil? ? 0 : space
end end
def used_space_in_megabytes def total_used_space
(used_space_in_bytes.to_f / self.class::ONE_MEGABYTE_IN_BYTES).round(2) total = 0
account_sites.each {|s| total += s.used_space}
total
end end
def available_space_in_bytes def remaining_space
remaining = maximum_space_in_bytes - used_space_in_bytes remaining = maximum_space - total_used_space
remaining < 0 ? 0 : remaining remaining < 0 ? 0 : remaining
end end
def available_space_in_megabytes def maximum_space
(available_space_in_bytes.to_f / self.class::ONE_MEGABYTE_IN_BYTES).round(2) (parent? ? self : parent).supporter? ? SUPPORTER_MAXIMUM : FREE_MAXIMUM
end
def maximum_space_in_bytes
supporter? ? self.class::SUPPORTER_MAXIMUM_IN_BYTES : self.class::FREE_MAXIMUM_IN_BYTES
end
def maximum_space_in_megabytes
supporter? ? self.class::SUPPORTER_MAXIMUM_IN_MEGABYTES : self.class::FREE_MAXIMUM_IN_MEGABYTES
end end
def space_percentage_used def space_percentage_used
((used_space_in_bytes.to_f / maximum_space_in_bytes) * 100).round(1) ((total_used_space.to_f / maximum_space) * 100).round(1)
end end
# This returns true even if they end their support plan. # This returns true even if they end their support plan.

View file

@ -18,7 +18,7 @@ describe 'signin' do
Capybara.reset_sessions! Capybara.reset_sessions!
end end
it 'fails for invalid login' do it 'fails for invalid signin' do
visit '/' visit '/'
click_link 'Sign In' click_link 'Sign In'
page.must_have_content 'Welcome Back' page.must_have_content 'Welcome Back'
@ -27,7 +27,7 @@ describe 'signin' do
page.must_have_content 'Invalid login' page.must_have_content 'Invalid login'
end end
it 'fails for missing login' do it 'fails for missing signin' do
visit '/' visit '/'
click_link 'Sign In' click_link 'Sign In'
auth = {username: SecureRandom.hex, password: Faker::Internet.password} auth = {username: SecureRandom.hex, password: Faker::Internet.password}
@ -37,7 +37,7 @@ describe 'signin' do
page.must_have_content 'Invalid login' page.must_have_content 'Invalid login'
end end
it 'logs in with proper credentials' do it 'signs in with proper credentials' do
visit '/' visit '/'
click_button 'Create My Website' click_button 'Create My Website'
fill_in_valid_signup fill_in_valid_signup
@ -50,4 +50,18 @@ describe 'signin' do
click_button 'Sign In' click_button 'Sign In'
page.must_have_content 'Your Feed' page.must_have_content 'Your Feed'
end end
it 'signs in with email' do
visit '/'
click_button 'Create My Website'
fill_in_valid_signup
click_button 'Create Home Page'
Capybara.reset_sessions!
visit '/'
click_link 'Sign In'
fill_in 'username', with: @site[:email]
fill_in 'password', with: @site[:password]
click_button 'Sign In'
page.must_have_content 'Your Feed'
end
end end

View file

@ -33,15 +33,35 @@
<a href="/signin" class="sign-In" title="Sign into your account">Sign In</a> <a href="/signin" class="sign-In" title="Sign into your account">Sign In</a>
</li> </li>
<% else %> <% else %>
<li>
<a href="/dashboard" class="sign-In">Edit Site</a> <li class="dropdown">
</li> <a class="dropdown-toggle" data-toggle="dropdown" href="#">
<li> <%= current_site.username %> <b class="caret"></b>
<a href="/settings" class="sign-In">Settings</a> </a>
</li> <ul class="dropdown-menu pull-left">
<li> <li class="dropdown-submenu pull-left">
<a href="/signout" class="sign-In">Signout</a> <a tabindex="-1" href="#">Change Site</a>
<ul class="dropdown-menu">
<% current_site.other_sites.each do |site| %>
<li>
<a href="#"><%= site.username %></a><br>
</li>
<% end %>
</ul>
</li>
<li>
<a href="/dashboard" class="sign-In">Edit Site</a>
</li>
<li>
<a href="/settings" class="sign-In">Settings</a>
</li>
<li>
<a href="/signout" class="sign-In">Signout</a>
</li>
</ul>
</li> </li>
<% end %> <% end %>
</ul> </ul>

View file

@ -34,7 +34,7 @@
<% if current_site.updated_at %> <% if current_site.updated_at %>
<li>Last updated <%= current_site.updated_at.ago.downcase %></li> <li>Last updated <%= current_site.updated_at.ago.downcase %></li>
<% end %> <% end %>
<li>Using <strong><%= current_site.space_percentage_used %>% (<%= current_site.used_space_in_megabytes %>MB) of your <%= current_site.maximum_space_in_megabytes %> MB</strong>. <li>Using <strong><%= current_site.space_percentage_used %>% (<%= current_site.total_used_space.to_space_pretty %>) of your <%= current_site.maximum_space.to_space_pretty %></strong>.
<br> <br>
<% if !current_site.supporter? %>Need more space? <a href="/plan">Become a Supporter!</a><% end %></li> <% if !current_site.supporter? %>Need more space? <a href="/plan">Become a Supporter!</a><% end %></li>
<li><strong><%= current_site.hits.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse %></strong> hits</li> <li><strong><%= current_site.hits.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse %></strong> hits</li>
@ -222,7 +222,7 @@
Dropzone.options.uploads = { Dropzone.options.uploads = {
paramName: 'files', paramName: 'files',
maxFilesize: <%= current_site.available_space_in_megabytes %>, maxFilesize: <%= current_site.remaining_space.to_mb %>,
clickable: false, clickable: false,
addRemoveLinks: false, addRemoveLinks: false,
dictDefaultMessage: '', dictDefaultMessage: '',

View file

@ -123,7 +123,7 @@
<span class="intro-Icon"></span> <span class="intro-Icon"></span>
<h2 class="delta">Create your own free website</h2> <h2 class="delta">Create your own free website</h2>
<p class="tiny"> <p class="tiny">
You get <%= Site::FREE_MAXIMUM_IN_MEGABYTES %> MB of free web space to make whatever youd like! You get <%= Site::FREE_MAXIMUM.to_space_pretty %> of free web space to make whatever youd like!
</p> </p>
</li> </li>
<li class="intro-Social"> <li class="intro-Social">

View file

@ -73,17 +73,17 @@
<p><strong>The site you are creating will be free, forever.</strong> We will never charge you for your web site.</p> <p><strong>The site you are creating will be free, forever.</strong> We will never charge you for your web site.</p>
<p><a href="/donate" target="_blank">Neocities has to pay the bills though</a>, and we like the idea of being able to work on the site full-time someday. So if you would like to help us reach this goal, we have created the <strong>Supporter Plan</strong>! <p><a href="/donate" target="_blank">Neocities has to pay the bills though</a>, and we like the idea of being able to work on the site full-time someday. So if you would like to help us reach this goal, we have created the <strong>Supporter Plan</strong>!
<p>Right now, the <strong>Supporter Plan</strong> is the same as the free plan, except that <strong>Supporter Plan members get 200MB</strong> of web space. You will also be listed as a supporter on our contributors page, and on your site profile page.</p> <p>Right now, the <strong>Supporter Plan</strong> is the same as the free plan, except that <strong>Supporter Plan members get <%= Site::SUPPORTER_MAXIMUM.to_space_pretty %></strong> of web space. You will also be listed as a supporter on our contributors page, and on your site profile page.</p>
<p>The base plan is $12 ($1/month) billed once per year, which is the cost of <a href="/img/yafagrillmenu.jpg" target="_blank">a delicious Yafa Combo with a lousy tip</a>. If you ever decide to cancel, you get to keep the extra space. Thanks for helping us run this site!</p> <p>The base plan is $12 ($1/month) billed once per year, which is the cost of <a href="/img/yafagrillmenu.jpg" target="_blank">a delicious Yafa Combo with a lousy tip</a>. If you ever decide to cancel, you get to keep the extra space. Thanks for helping us run this site!</p>
<div> <div>
<input type="radio" name="plan" value="free" <%= params[:plan].nil? || params[:plan] == 'free' ? 'checked' : '' %>> <input type="radio" name="plan" value="free" <%= params[:plan].nil? || params[:plan] == 'free' ? 'checked' : '' %>>
<span><strong>Free Plan (<%= Site::FREE_MAXIMUM_IN_MEGABYTES %>MB)</strong></span> <span><strong>Free Plan (<%= Site::FREE_MAXIMUM.to_space_pretty %>)</strong></span>
</div> </div>
<a name="plan_error_link"></a> <a name="plan_error_link"></a>
<div> <div>
<input id="supporter" type="radio" name="plan" value="supporter" <%= params[:plan] == 'supporter' ? 'checked' : '' %>> <input id="supporter" type="radio" name="plan" value="supporter" <%= params[:plan] == 'supporter' ? 'checked' : '' %>>
<span><strong>Supporter Plan (<%= Site::SUPPORTER_MAXIMUM_IN_MEGABYTES %>MB)</strong></span> <span><strong>Supporter Plan (<%= Site::SUPPORTER_MAXIMUM.to_space_pretty %>)</strong></span>
</div> </div>
<div id="plan_container" style="margin-top:20px; display: none"> <div id="plan_container" style="margin-top:20px; display: none">

View file

@ -121,7 +121,7 @@
<div class="col col-50"> <div class="col col-50">
<h2 class="section-header">Introducing the New Neocities</h2> <h2 class="section-header">Introducing the New Neocities</h2>
<p class="intro-text">Nows a great time to join our community of over <%= @sites_count.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse %> websites! <p class="intro-text">Nows a great time to join our community of over <%= @sites_count.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse %> websites!
You get <%= Site::FREE_MAXIMUM_IN_MEGABYTES %> MB of free web space to make whatever youd like. </p> You get <%= Site::FREE_MAXIMUM.to_space_pretty %> of free web space to make whatever youd like. </p>
<ul class="intro-List"> <ul class="intro-List">
<li class="intro-Tools"> <li class="intro-Tools">
<span class="intro-Icon"></span> <span class="intro-Icon"></span>

View file

@ -12,7 +12,7 @@
<div class="content single-Col misc-page"> <div class="content single-Col misc-page">
<h3>Ending the Supporter Plan</h3> <h3>Ending the Supporter Plan</h3>
<p> <p>
You currently have the <strong><%= current_site.plan_name %> (<%= current_site.maximum_space_in_megabytes %>MB)</strong> - <%= @plan_name %>. You currently have the <strong><%= current_site.plan_name %> (<%= current_site.maximum_space.to_space_pretty %>)</strong> - <%= @plan_name %>.
</p> </p>
<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! 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!

View file

@ -19,7 +19,7 @@
<% if current_site && current_site.supporter? && !current_site.plan_ended %> <% if current_site && current_site.supporter? && !current_site.plan_ended %>
<p> <p>
You currently have the <strong><%= current_site.plan_name %> (<%= current_site.maximum_space_in_megabytes %>MB)</strong>. You currently have the <strong><%= current_site.plan_name %> (<%= current_site.maximum_space.to_space_pretty %>)</strong>.
</p> </p>
<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>. 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>.
@ -28,7 +28,7 @@
<a href="/plan/manage">Manage plan</a> <a href="/plan/manage">Manage plan</a>
<% else %> <% else %>
<% if current_site %> <% if current_site %>
<p>You currently have the <strong>Free Plan (<%= current_site.maximum_space_in_megabytes %>MB)</strong>. Need more space? Become a <strong>Neocities Supporter!</strong></p> <p>You currently have the <strong>Free Plan (<%= current_site.maximum_space.to_space_pretty %>)</strong>. Need more space? Become a <strong>Neocities Supporter!</strong></p>
<h3>Why upgrade?</h3> <h3>Why upgrade?</h3>
<% else %> <% else %>
@ -38,7 +38,7 @@
<% end %> <% end %>
<ul> <ul>
<li> <li>
<strong>You get more space!</strong> Right now supporter plans get up to <strong><%= Site::SUPPORTER_MAXIMUM_IN_MEGABYTES %>MB</strong> (more coming soon)</strong>. <strong>You get more space!</strong> Right now supporter plans get up to <strong><%= Site::SUPPORTER_MAXIMUM.to_space_pretty %></strong>.
</li> </li>
<li> <li>
<strong>It helps your site.</strong> Funding helps us make your site faster globally, and provide more features. <strong>It helps your site.</strong> Funding helps us make your site faster globally, and provide more features.

View file

@ -12,7 +12,7 @@
<div class="content single-Col misc-page"> <div class="content single-Col misc-page">
<h3>Change your Supporter Plan</h3> <h3>Change your Supporter Plan</h3>
<p> <p>
You currently have the <strong><%= current_site.plan_name %> (<%= current_site.maximum_space_in_megabytes %>MB)</strong> - <%= @plan_name %>. You currently have the <strong><%= current_site.plan_name %> (<%= current_site.maximum_space.to_space_pretty %>)</strong> - <%= @plan_name %>.
</p> </p>
<a href="/plan/end">End plan</a> <a href="/plan/end">End plan</a>

View file

@ -9,48 +9,22 @@
<article> <article>
<section> <section>
<div class="txt-Center"> <div class="txt-Center">
<% if !current_site.errors.empty? %>
<div class="alert alert-block alert-error" style="margin-top: 20px">
<% current_site.errors.each do |error| %>
<p><%== error.last.first %></p>
<% end %>
</div>
<% end %>
<% if flash[:success] %> <% if flash[:success] %>
<div class="alert alert-block alert-success" style="margin-top: 20px"> <div class="alert alert-block alert-success" style="margin-top: 20px">
<%== flash[:success] %> <%== flash[:success] %>
</div> </div>
<% end %> <% end %>
</div>
<!--
<ul class="nav nav-tabs">
<li class="active">
<a href="#">Plan</a>
</li>
<li>
<a href="#">Profile</a>
</li>
<li>
<a href="">Custom Domain</a>
</li>
<li>
<a href="">Password</a>
</li>
<li>
<a href="">Email</a>
</li>
<li>
<a href="">Username</a>
</li>
<li>
<a href="">18+</a>
</li>
</ul>
-->
<% if flash[:error] %>
<div class="alert alert-block alert-error" style="margin-top: 20px">
<%== flash[:error] %>
</div>
<% end %>
</div>
<div class="tabbable" style="margin-top: 20px"> <!-- Only required for left/right tabs --> <div class="tabbable" style="margin-top: 20px"> <!-- Only required for left/right tabs -->
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="active"><a href="#plan" data-toggle="tab">Plan</a></li> <li class="active"><a href="#plan" data-toggle="tab">Plan</a></li>
<li><a href="#sites" data-toggle="tab">Sites</a></li>
<li><a href="#profile" data-toggle="tab">Profile</a></li> <li><a href="#profile" data-toggle="tab">Profile</a></li>
<li><a href="#customdomain" data-toggle="tab">Custom Domain</a></li> <li><a href="#customdomain" data-toggle="tab">Custom Domain</a></li>
<li><a href="#password" data-toggle="tab">Password</a></li> <li><a href="#password" data-toggle="tab">Password</a></li>
@ -62,6 +36,9 @@
<div class="tab-pane active" id="plan"> <div class="tab-pane active" id="plan">
<%== erb :'settings/plan' %> <%== erb :'settings/plan' %>
</div> </div>
<div class="tab-pane" id="sites">
<%== erb :'settings/sites' %>
</div>
<div class="tab-pane" id="profile"> <div class="tab-pane" id="profile">
<%== erb :'settings/profile' %> <%== erb :'settings/profile' %>
</div> </div>
@ -116,4 +93,13 @@
<button type="submit" class="btn btn-Action">Permanently Delete Site</button> <button type="submit" class="btn btn-Action">Permanently Delete Site</button>
</div> </div>
</form> </form>
</div> </div>
<script>
$(document).ready(function() {
if (location.hash !== '') $('a[href="' + location.hash + '"]').tab('show');
return $('a[data-toggle="tab"]').on('shown', function(e) {
return location.hash = $(e.target).attr('href').substr(1);
});
});
</script>

View file

@ -1,11 +1,11 @@
<h2>Neocities Plan</h2> <h2>Neocities Plan</h2>
<% if current_site.supporter? && !current_site.plan_ended %> <% if current_site.supporter? && !current_site.plan_ended %>
<p class="tiny">You currently have the <strong>Supporter Plan (<%= current_site.maximum_space_in_megabytes %>MB)</strong>. Thank you! We love you. <p class="tiny">You currently have the <strong>Supporter Plan (<%= current_site.maximum_space.to_space_pretty %>)</strong>. Thank you! We love you.
</p> </p>
<a class="btn-Action" href="/plan">Manage Plan</a> <a class="btn-Action" href="/plan">Manage Plan</a>
<% else %> <% else %>
<p class="tiny"> <p class="tiny">
You currently have the <strong>Free Plan (<%= current_site.maximum_space_in_megabytes %>MB)</strong>.<br>Want to get more space and help Neocities? Become a supporter! You currently have the <strong>Free Plan (<%= current_site.maximum_space.to_space_pretty %>)</strong>.<br>Want to get more space and help Neocities? Become a supporter!
</p> </p>
<a class="btn-Action" href="/plan">Supporter Info</a> <a class="btn-Action" href="/plan">Supporter Info</a>
<% end %> <% end %>

42
views/settings/sites.erb Normal file
View file

@ -0,0 +1,42 @@
<h2>Your Sites</h2>
<% if current_site.children_dataset.count == 0 %>
<h6>No other sites are currently linked to this account.</h6>
<% else %>
<table class="table">
<tr>
<td>
<a href="//<%= current_site.host %>"><strong><%= current_site.title %></strong></a> (primary)
</td>
<td>
Manage this site
</td>
</tr>
<% current_site.children.each do |site| %>
<tr>
<td>
<a href="//<%= site.host %>" target="_blank"><%= site.title %></a>
</td>
<td>
<a href="#">Manage this site</a>
</td>
</tr>
<% end %>
</table>
<% end %>
<h3>Create New Site</h3>
<p>You can now create new sites that are linked to this account! Sites will share the free space you have available. You have <strong><%= Site::CHILD_SITES_MAX - current_site.children_dataset.count %></strong> new sites remaining.</p>
<form action="/site/create_child" method="POST">
<%== csrf_token_input_html %>
<p>Site Name:</p>
<input name="username" type="text">
<div>
<input class="btn-Action" type="submit" value="Create New Site">
</div>
</form>

View file

@ -1,6 +1,6 @@
Hi there! Hi there!
We just wanted to email you to confirm your supporter upgrade! You are on the <%= plan_name %> support tier. You now have <%= Site::SUPPORTER_MAXIMUM_IN_MEGABYTES %> MB of space (and we're likely to upgrade this even more soon). We're looking forward to seeing the awesome things you will do with it. We just wanted to email you to confirm your supporter upgrade! You are on the <%= plan_name %> support tier. You now have <%= Site::SUPPORTER_MAXIMUM.to_space_pretty %> of space (and we're likely to upgrade this even more soon). We're looking forward to seeing the awesome things you will do with it.
Thank you very, very much for supporting Neocities. It means a lot to us. It also helps us keep the free tier for others, so your support helps everyone. We'll try our hardest to keep improving the site and stick to our core values (NO MARKETING OR ADVERTISING, EVER). Thank you very, very much for supporting Neocities. It means a lot to us. It also helps us keep the free tier for others, so your support helps everyone. We'll try our hardest to keep improving the site and stick to our core values (NO MARKETING OR ADVERTISING, EVER).