Clean up about page (#1282)
* Add InstancePresenter to expose site details * Clean up about controller, use instance presenter
This commit is contained in:
parent
53eb31f124
commit
e5282e4ec0
8 changed files with 175 additions and 55 deletions
|
@ -2,30 +2,25 @@
|
||||||
|
|
||||||
class AboutController < ApplicationController
|
class AboutController < ApplicationController
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
|
before_action :set_instance_presenter, only: [:show, :more]
|
||||||
|
|
||||||
def index
|
def show; end
|
||||||
@description = Setting.site_description
|
|
||||||
@open_registrations = Setting.open_registrations
|
|
||||||
@closed_registrations_message = Setting.closed_registrations_message
|
|
||||||
|
|
||||||
@user = User.new
|
def more; end
|
||||||
@user.build_account
|
|
||||||
end
|
|
||||||
|
|
||||||
def more
|
|
||||||
@description = Setting.site_description
|
|
||||||
@extended_description = Setting.site_extended_description
|
|
||||||
@contact_account = Account.find_local(Setting.site_contact_username)
|
|
||||||
@contact_email = Setting.site_contact_email
|
|
||||||
@user_count = Rails.cache.fetch('user_count') { User.count }
|
|
||||||
@status_count = Rails.cache.fetch('local_status_count') { Status.local.count }
|
|
||||||
@domain_count = Rails.cache.fetch('distinct_domain_count') { Account.distinct.count(:domain) }
|
|
||||||
end
|
|
||||||
|
|
||||||
def terms; end
|
def terms; end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def new_user
|
||||||
|
User.new.tap(&:build_account)
|
||||||
|
end
|
||||||
|
helper_method :new_user
|
||||||
|
|
||||||
|
def set_instance_presenter
|
||||||
|
@instance_presenter = InstancePresenter.new
|
||||||
|
end
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = 'about-body'
|
@body_classes = 'about-body'
|
||||||
end
|
end
|
||||||
|
|
28
app/presenters/instance_presenter.rb
Normal file
28
app/presenters/instance_presenter.rb
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class InstancePresenter
|
||||||
|
delegate(
|
||||||
|
:closed_registrations_message,
|
||||||
|
:contact_email,
|
||||||
|
:open_registrations,
|
||||||
|
:site_description,
|
||||||
|
:site_extended_description,
|
||||||
|
to: Setting
|
||||||
|
)
|
||||||
|
|
||||||
|
def contact_account
|
||||||
|
Account.find_local(Setting.site_contact_username)
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_count
|
||||||
|
Rails.cache.fetch('user_count') { User.count }
|
||||||
|
end
|
||||||
|
|
||||||
|
def status_count
|
||||||
|
Rails.cache.fetch('local_status_count') { Status.local.count }
|
||||||
|
end
|
||||||
|
|
||||||
|
def domain_count
|
||||||
|
Rails.cache.fetch('distinct_domain_count') { Account.distinct.count(:domain) }
|
||||||
|
end
|
||||||
|
end
|
30
app/views/about/_registration.html.haml
Normal file
30
app/views/about/_registration.html.haml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
= simple_form_for(new_user, url: user_registration_path) do |f|
|
||||||
|
= f.simple_fields_for :account do |account_fields|
|
||||||
|
= account_fields.input :username,
|
||||||
|
autofocus: true,
|
||||||
|
placeholder: t('simple_form.labels.defaults.username'),
|
||||||
|
required: true,
|
||||||
|
input_html: { 'aria-label' => t('simple_form.labels.defaults.username') }
|
||||||
|
|
||||||
|
= f.input :email,
|
||||||
|
placeholder: t('simple_form.labels.defaults.email'),
|
||||||
|
required: true,
|
||||||
|
input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }
|
||||||
|
= f.input :password,
|
||||||
|
autocomplete: "off",
|
||||||
|
placeholder: t('simple_form.labels.defaults.password'),
|
||||||
|
required: true,
|
||||||
|
input_html: { 'aria-label' => t('simple_form.labels.defaults.password') }
|
||||||
|
= f.input :password_confirmation,
|
||||||
|
autocomplete: "off",
|
||||||
|
placeholder: t('simple_form.labels.defaults.confirm_password'),
|
||||||
|
required: true,
|
||||||
|
input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password') }
|
||||||
|
|
||||||
|
.actions
|
||||||
|
= f.button :button, t('about.get_started'), type: :submit
|
||||||
|
|
||||||
|
.info
|
||||||
|
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
|
||||||
|
·
|
||||||
|
= link_to t('about.about_this'), about_more_path
|
|
@ -7,42 +7,42 @@
|
||||||
.panel
|
.panel
|
||||||
%h2= Rails.configuration.x.local_domain
|
%h2= Rails.configuration.x.local_domain
|
||||||
|
|
||||||
- unless @description.blank?
|
- unless @instance_presenter.site_description.blank?
|
||||||
%p= @description.html_safe
|
%p= @instance_presenter.site_description.html_safe
|
||||||
|
|
||||||
.information-board
|
.information-board
|
||||||
.section
|
.section
|
||||||
%span= t 'about.user_count_before'
|
%span= t 'about.user_count_before'
|
||||||
%strong= number_with_delimiter @user_count
|
%strong= number_with_delimiter @instance_presenter.user_count
|
||||||
%span= t 'about.user_count_after'
|
%span= t 'about.user_count_after'
|
||||||
.section
|
.section
|
||||||
%span= t 'about.status_count_before'
|
%span= t 'about.status_count_before'
|
||||||
%strong= number_with_delimiter @status_count
|
%strong= number_with_delimiter @instance_presenter.status_count
|
||||||
%span= t 'about.status_count_after'
|
%span= t 'about.status_count_after'
|
||||||
.section
|
.section
|
||||||
%span= t 'about.domain_count_before'
|
%span= t 'about.domain_count_before'
|
||||||
%strong= number_with_delimiter @domain_count
|
%strong= number_with_delimiter @instance_presenter.domain_count
|
||||||
%span= t 'about.domain_count_after'
|
%span= t 'about.domain_count_after'
|
||||||
|
|
||||||
- unless @extended_description.blank?
|
- unless @instance_presenter.site_extended_description.blank?
|
||||||
.panel= @extended_description.html_safe
|
.panel= @instance_presenter.site_extended_description.html_safe
|
||||||
|
|
||||||
.sidebar
|
.sidebar
|
||||||
.panel
|
.panel
|
||||||
.panel-header= t 'about.contact'
|
.panel-header= t 'about.contact'
|
||||||
.panel-body
|
.panel-body
|
||||||
- if @contact_account
|
- if @instance_presenter.contact_account
|
||||||
.owner
|
.owner
|
||||||
.avatar= image_tag @contact_account.avatar.url
|
.avatar= image_tag @instance_presenter.contact_account.avatar.url
|
||||||
.name
|
.name
|
||||||
= link_to TagManager.instance.url_for(@contact_account) do
|
= link_to TagManager.instance.url_for(@instance_presenter.contact_account) do
|
||||||
%span.display_name.emojify= display_name(@contact_account)
|
%span.display_name.emojify= display_name(@instance_presenter.contact_account)
|
||||||
%span.username= "@#{@contact_account.acct}"
|
%span.username= "@#{@instance_presenter.contact_account.acct}"
|
||||||
|
|
||||||
- unless @contact_email.blank?
|
- unless @instance_presenter.contact_email.blank?
|
||||||
.contact-email
|
.contact-email
|
||||||
= t 'about.business_email'
|
= t 'about.business_email'
|
||||||
%strong= @contact_email
|
%strong= @instance_presenter.contact_email
|
||||||
.panel
|
.panel
|
||||||
.panel-header= t 'about.links'
|
.panel-header= t 'about.links'
|
||||||
.panel-list
|
.panel-list
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
%meta{ property: 'og:site_name', content: site_title }/
|
%meta{ property: 'og:site_name', content: site_title }/
|
||||||
%meta{ property: 'og:type', content: 'website' }/
|
%meta{ property: 'og:type', content: 'website' }/
|
||||||
%meta{ property: 'og:title', content: Rails.configuration.x.local_domain }/
|
%meta{ property: 'og:title', content: Rails.configuration.x.local_domain }/
|
||||||
%meta{ property: 'og:description', content: @description.blank? ? "Mastodon is a free, open-source social network server. A decentralized alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Anyone can run Mastodon and participate in the social network seamlessly" : strip_tags(@description) }/
|
%meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.blank? ? t('about.about_mastodon') : @instance_presenter.site_description) }/
|
||||||
%meta{ property: 'og:image', content: asset_url('mastodon_small.jpg') }/
|
%meta{ property: 'og:image', content: asset_url('mastodon_small.jpg') }/
|
||||||
%meta{ property: 'og:image:width', content: '400' }/
|
%meta{ property: 'og:image:width', content: '400' }/
|
||||||
%meta{ property: 'og:image:height', content: '400' }/
|
%meta{ property: 'og:image:height', content: '400' }/
|
||||||
|
@ -24,28 +24,14 @@
|
||||||
.screenshot-with-signup
|
.screenshot-with-signup
|
||||||
.mascot= image_tag 'fluffy-elephant-friend.png'
|
.mascot= image_tag 'fluffy-elephant-friend.png'
|
||||||
|
|
||||||
- if @open_registrations
|
- if @instance_presenter.open_registrations
|
||||||
= simple_form_for(@user, url: user_registration_path) do |f|
|
= render 'registration'
|
||||||
= f.simple_fields_for :account do |ff|
|
|
||||||
= ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username') }
|
|
||||||
|
|
||||||
= f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }
|
|
||||||
= f.input :password, autocomplete: "off", placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password') }
|
|
||||||
= f.input :password_confirmation, autocomplete: "off", placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password') }
|
|
||||||
|
|
||||||
.actions
|
|
||||||
= f.button :button, t('about.get_started'), type: :submit
|
|
||||||
|
|
||||||
.info
|
|
||||||
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
|
|
||||||
·
|
|
||||||
= link_to t('about.about_this'), about_more_path
|
|
||||||
- else
|
- else
|
||||||
.closed-registrations-message
|
.closed-registrations-message
|
||||||
- if @closed_registrations_message.blank?
|
- if @instance_presenter.closed_registrations_message.blank?
|
||||||
%p= t('about.closed_registrations')
|
%p= t('about.closed_registrations')
|
||||||
- else
|
- else
|
||||||
= @closed_registrations_message.html_safe
|
= @instance_presenter.closed_registrations_message.html_safe
|
||||||
.info
|
.info
|
||||||
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
|
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
|
||||||
·
|
·
|
||||||
|
@ -85,9 +71,9 @@
|
||||||
= fa_icon('li check-square')
|
= fa_icon('li check-square')
|
||||||
= t 'about.features.api'
|
= t 'about.features.api'
|
||||||
|
|
||||||
- unless @description.blank?
|
- unless @instance_presenter.site_description.blank?
|
||||||
%h3= t('about.description_headline', domain: Rails.configuration.x.local_domain)
|
%h3= t('about.description_headline', domain: Rails.configuration.x.local_domain)
|
||||||
%p= @description.html_safe
|
%p= @instance_presenter.site_description.html_safe
|
||||||
|
|
||||||
.actions
|
.actions
|
||||||
.info
|
.info
|
|
@ -188,7 +188,7 @@ Rails.application.routes.draw do
|
||||||
|
|
||||||
get '/web/(*any)', to: 'home#index', as: :web
|
get '/web/(*any)', to: 'home#index', as: :web
|
||||||
|
|
||||||
get '/about', to: 'about#index'
|
get '/about', to: 'about#show'
|
||||||
get '/about/more', to: 'about#more'
|
get '/about/more', to: 'about#more'
|
||||||
get '/terms', to: 'about#terms'
|
get '/terms', to: 'about#terms'
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,16 @@ require 'rails_helper'
|
||||||
RSpec.describe AboutController, type: :controller do
|
RSpec.describe AboutController, type: :controller do
|
||||||
render_views
|
render_views
|
||||||
|
|
||||||
describe 'GET #index' do
|
describe 'GET #show' do
|
||||||
it 'returns http success' do
|
it 'returns http success' do
|
||||||
get :index
|
get :show
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'GET #more' do
|
||||||
|
it 'returns http success' do
|
||||||
|
get :more
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
74
spec/presenters/instance_presenter_spec.rb
Normal file
74
spec/presenters/instance_presenter_spec.rb
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe InstancePresenter do
|
||||||
|
let(:instance_presenter) { InstancePresenter.new }
|
||||||
|
|
||||||
|
it "delegates site_description to Setting" do
|
||||||
|
Setting.site_description = "Site desc"
|
||||||
|
|
||||||
|
expect(instance_presenter.site_description).to eq "Site desc"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "delegates site_extended_description to Setting" do
|
||||||
|
Setting.site_extended_description = "Extended desc"
|
||||||
|
|
||||||
|
expect(instance_presenter.site_extended_description).to eq "Extended desc"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "delegates open_registrations to Setting" do
|
||||||
|
Setting.open_registrations = false
|
||||||
|
|
||||||
|
expect(instance_presenter.open_registrations).to eq false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "delegates closed_registrations_message to Setting" do
|
||||||
|
Setting.closed_registrations_message = "Closed message"
|
||||||
|
|
||||||
|
expect(instance_presenter.closed_registrations_message).to eq "Closed message"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "delegates contact_email to Setting" do
|
||||||
|
Setting.contact_email = "admin@example.com"
|
||||||
|
|
||||||
|
expect(instance_presenter.contact_email).to eq "admin@example.com"
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "contact_account" do
|
||||||
|
it "returns the account for the site contact username" do
|
||||||
|
Setting.site_contact_username = "aaa"
|
||||||
|
account = Fabricate(:account, username: "aaa")
|
||||||
|
|
||||||
|
expect(instance_presenter.contact_account).to eq(account)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "user_count" do
|
||||||
|
it "returns the number of site users" do
|
||||||
|
cache = double
|
||||||
|
allow(Rails).to receive(:cache).and_return(cache)
|
||||||
|
allow(cache).to receive(:fetch).with("user_count").and_return(123)
|
||||||
|
|
||||||
|
expect(instance_presenter.user_count).to eq(123)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "status_count" do
|
||||||
|
it "returns the number of local statuses" do
|
||||||
|
cache = double
|
||||||
|
allow(Rails).to receive(:cache).and_return(cache)
|
||||||
|
allow(cache).to receive(:fetch).with("local_status_count").and_return(234)
|
||||||
|
|
||||||
|
expect(instance_presenter.status_count).to eq(234)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "domain_count" do
|
||||||
|
it "returns the number of known domains" do
|
||||||
|
cache = double
|
||||||
|
allow(Rails).to receive(:cache).and_return(cache)
|
||||||
|
allow(cache).to receive(:fetch).with("distinct_domain_count").and_return(345)
|
||||||
|
|
||||||
|
expect(instance_presenter.domain_count).to eq(345)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue