Adding paperclip for avatars, fixing design of the public pages

This commit is contained in:
Eugen Rochko 2016-02-28 00:02:59 +01:00
parent fa29ef3a41
commit 2c70f0ecaa
14 changed files with 116 additions and 74 deletions

View file

@ -21,6 +21,7 @@ gem 'grape-route-helpers'
gem 'grape-entity' gem 'grape-entity'
gem 'hashie-forbidden_attributes' gem 'hashie-forbidden_attributes'
gem 'paranoia', '~> 2.0' gem 'paranoia', '~> 2.0'
gem 'paperclip', '~> 4.3'
gem 'http' gem 'http'
gem 'addressable' gem 'addressable'

View file

@ -50,6 +50,10 @@ GEM
binding_of_caller (0.7.2) binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1) debug_inspector (>= 0.0.1)
builder (3.2.2) builder (3.2.2)
climate_control (0.0.3)
activesupport (>= 3.0)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
coderay (1.1.1) coderay (1.1.1)
coercible (1.0.0) coercible (1.0.0)
descendants_tracker (~> 0.0.1) descendants_tracker (~> 0.0.1)
@ -146,6 +150,7 @@ GEM
mime-types (>= 1.16, < 3) mime-types (>= 1.16, < 3)
method_source (0.8.2) method_source (0.8.2)
mime-types (2.99) mime-types (2.99)
mimemagic (0.3.0)
mini_portile2 (2.0.0) mini_portile2 (2.0.0)
minitest (5.8.4) minitest (5.8.4)
multi_json (1.11.2) multi_json (1.11.2)
@ -158,6 +163,12 @@ GEM
addressable (~> 2.4) addressable (~> 2.4)
http (~> 1.0) http (~> 1.0)
nokogiri (~> 1.6) nokogiri (~> 1.6)
paperclip (4.3.5)
activemodel (>= 3.2.0)
activesupport (>= 3.2.0)
cocaine (~> 0.5.5)
mime-types
mimemagic (= 0.3.0)
paranoia (2.1.5) paranoia (2.1.5)
activerecord (~> 4.0) activerecord (~> 4.0)
parser (2.3.0.6) parser (2.3.0.6)
@ -320,6 +331,7 @@ DEPENDENCIES
nokogiri nokogiri
nyan-cat-formatter nyan-cat-formatter
ostatus2 ostatus2
paperclip (~> 4.3)
paranoia (~> 2.0) paranoia (~> 2.0)
pg pg
pry-rails pry-rails

View file

@ -1,15 +0,0 @@
/*
* This is a manifest file that'll be compiled into application.css, which will include all the files
* listed below.
*
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
*
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
* compiled file so the styles you add here take precedence over styles defined in any styles
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
* file per style scope.
*
*= require_tree .
*= require_self
*/

View file

@ -0,0 +1,39 @@
$primary-color: #ff7473;
$secondary-color: #ffc952;
$tertiary-color: #47b8e0;
$quaternary-color: #34314c;
$background-color: #fff;
@import url("https://fonts.googleapis.com/css?family=Noto+Sans:400,700,400italic");
@import "font-awesome-sprockets";
@import "font-awesome";
body {
font-family: 'Noto Sans', sans-serif;
background: $secondary-color;
font-size: 13px;
line-height: 18px;
color: $quaternary-color;
}
.container {
width: 800px;
margin: 0 auto;
}
.footer {
text-align: center;
padding: 100px 0;
font-size: 12px;
color: lighten($quaternary-color, 15%);
.mastodon-link {
color: $quaternary-color;
text-decoration: none;
font-weight: bold;
}
}
@import 'home';
@import 'profile';

View file

@ -1,10 +0,0 @@
.footer {
text-align: center;
padding: 100px 0;
.mastodon-link {
color: #566270;
text-decoration: none;
font-size: 16px;
}
}

View file

@ -1,20 +1,3 @@
@import url(https://fonts.googleapis.com/css?family=Noto+Sans:400,700,400italic);
@import "font-awesome-sprockets";
@import "font-awesome";
body {
font-family: 'Noto Sans', sans-serif;
background: #E0E3DA;
font-size: 13px;
line-height: 18px;
}
.container {
width: 800px;
margin: 0 auto;
}
.card { .card {
padding-top: 20px; padding-top: 20px;
@ -25,7 +8,7 @@ body {
small { small {
display: block; display: block;
font-size: 14px; font-size: 14px;
color: #566270; color: lighten($quaternary-color, 15%);
} }
} }
@ -56,12 +39,12 @@ body {
box-shadow: 4px 3px 0 rgba(0, 0, 0, 0.1); box-shadow: 4px 3px 0 rgba(0, 0, 0, 0.1);
.entry { .entry {
border-bottom: 1px solid #E0E3DA; border-bottom: 1px solid darken($background-color, 10%);
background: #FFFFF3; background: $background-color;
border-left: 2px solid #A593E0; border-left: 2px solid $primary-color;
&.entry-reblog { &.entry-reblog {
border-left: 2px solid #566270; border-left: 2px solid $tertiary-color;
} }
&:last-child { &:last-child {
@ -77,10 +60,10 @@ body {
.name { .name {
text-decoration: none; text-decoration: none;
color: #566270; color: lighten($quaternary-color, 15%);
strong { strong {
color: #000; color: $quaternary-color;
} }
&:hover { &:hover {
@ -92,13 +75,13 @@ body {
} }
.pre-header { .pre-header {
border-bottom: 1px solid #E0E3DA; border-bottom: 1px solid darken($background-color, 10%);
color: #566270; color: $tertiary-color;
padding: 5px 10px; padding: 5px 10px;
padding-left: 8px; padding-left: 8px;
.name { .name {
color: #566270; color: $tertiary-color;
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
@ -116,7 +99,7 @@ body {
.time { .time {
text-decoration: none; text-decoration: none;
color: #566270; color: lighten($quaternary-color, 15%);
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
@ -125,7 +108,7 @@ body {
.counters { .counters {
margin-top: 15px; margin-top: 15px;
color: #566270; color: lighten($quaternary-color, 15%);
cursor: default; cursor: default;
padding: 10px; padding: 10px;
padding-top: 0; padding-top: 0;
@ -134,10 +117,11 @@ body {
.counter { .counter {
display: inline-block; display: inline-block;
margin-right: 10px; margin-right: 10px;
color: lighten($quaternary-color, 50%);
} }
.conversation-link { .conversation-link {
color: #A593E0; color: $primary-color;
text-decoration: underline; text-decoration: underline;
float: right; float: right;
} }

View file

@ -1,2 +1,13 @@
module ProfileHelper module ProfileHelper
def display_name(account)
account.display_name.blank? ? account.username : account.display_name
end
def profile_url(account)
account.local? ? super(name: account.username) : account.url
end
def status_url(status)
status.local? ? super(name: status.account.username, id: status.stream_entry.id) : status.url
end
end end

View file

@ -2,6 +2,10 @@ class Account < ActiveRecord::Base
# Local users # Local users
has_one :user, inverse_of: :account has_one :user, inverse_of: :account
# Avatar upload
has_attached_file :avatar, styles: { large: '300x300#', medium: '96x96#', small: '48x48#' }
validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/
# Timelines # Timelines
has_many :stream_entries, inverse_of: :account has_many :stream_entries, inverse_of: :account
has_many :statuses, inverse_of: :account has_many :statuses, inverse_of: :account

View file

@ -10,4 +10,5 @@
.container .container
= yield = yield
.footer .footer
Powered by
= link_to 'Mastodon', 'https://github.com/Gargron/mastodon', class: 'mastodon-link' = link_to 'Mastodon', 'https://github.com/Gargron/mastodon', class: 'mastodon-link'

View file

@ -3,7 +3,7 @@
.pre-header .pre-header
%i.fa.fa-retweet %i.fa.fa-retweet
Shared by Shared by
= link_to status.account.display_name.blank? ? status.account.username : status.account.display_name, (status.account.local? ? profile_url(name: status.account.username) : status.account.url), class: 'name' = link_to display_name(status.account), profile_url(status.account), class: 'name'
.header .header
= render partial: 'status_header', locals: { status: status.reblog? ? status.reblog : status } = render partial: 'status_header', locals: { status: status.reblog? ? status.reblog : status }
.content .content

View file

@ -1,4 +1,4 @@
.counter.counter-retweets .counter.counter-reblogs
%i.fa.fa-retweet %i.fa.fa-retweet
%span.num= status.reblogs.count %span.num= status.reblogs.count
@ -7,4 +7,4 @@
%span.num= status.favourites.count %span.num= status.favourites.count
- if status.reply? - if status.reply?
= link_to 'View conversation', status.thread.local? ? status_url(name: status.thread.account.username, id: status.thread.id) : status.thread.url, class: 'conversation-link' = link_to 'View conversation', status_url(status.thread), class: 'conversation-link'

View file

@ -1,8 +1,8 @@
= link_to (status.account.local? ? profile_url(name: status.account.username) : status.account.url), class: 'name' do = link_to profile_url(status.account), class: 'name' do
%strong= status.account.display_name.blank? ? status.account.username : status.account.display_name %strong= display_name(status.account)
= "@#{status.account.acct}" = "@#{status.account.acct}"
= link_to status.local? ? status_url(name: status.account.username, id: status.stream_entry.id) : status.url, class: 'time' do = link_to status_url(status), class: 'time' do
%span{ title: status.created_at } %span{ title: status.created_at }
= time_ago_in_words(status.created_at) = time_ago_in_words(status.created_at)
ago ago

View file

@ -0,0 +1,11 @@
class AddAttachmentAvatarToAccounts < ActiveRecord::Migration
def self.up
change_table :accounts do |t|
t.attachment :avatar
end
end
def self.down
remove_attachment :accounts, :avatar
end
end

View file

@ -11,27 +11,31 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160224223247) do ActiveRecord::Schema.define(version: 20160227230233) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
create_table "accounts", force: :cascade do |t| create_table "accounts", force: :cascade do |t|
t.string "username", default: "", null: false t.string "username", default: "", null: false
t.string "domain" t.string "domain"
t.string "verify_token", default: "", null: false t.string "verify_token", default: "", null: false
t.string "secret", default: "", null: false t.string "secret", default: "", null: false
t.text "private_key" t.text "private_key"
t.text "public_key", default: "", null: false t.text "public_key", default: "", null: false
t.string "remote_url", default: "", null: false t.string "remote_url", default: "", null: false
t.string "salmon_url", default: "", null: false t.string "salmon_url", default: "", null: false
t.string "hub_url", default: "", null: false t.string "hub_url", default: "", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.text "note", default: "", null: false t.text "note", default: "", null: false
t.string "display_name", default: "", null: false t.string "display_name", default: "", null: false
t.string "uri", default: "", null: false t.string "uri", default: "", null: false
t.string "url" t.string "url"
t.string "avatar_file_name"
t.string "avatar_content_type"
t.integer "avatar_file_size"
t.datetime "avatar_updated_at"
end end
add_index "accounts", ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree add_index "accounts", ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree