From 5ae54f9e364880e1350ddcc8251a23cf79ae55fc Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sun, 28 Feb 2016 00:51:05 +0100 Subject: [PATCH] Adding avatars to profile page and statuses --- .gitignore | 1 + app/assets/images/avatars/missing.png | Bin 0 -> 3890 bytes app/assets/stylesheets/application.scss | 13 +++++ app/assets/stylesheets/profile.scss | 60 +++++++++++++++++------- app/models/account.rb | 8 +++- app/views/profile/_status.html.haml | 16 ++++--- app/views/profile/show.html.haml | 12 +++-- 7 files changed, 80 insertions(+), 30 deletions(-) create mode 100644 app/assets/images/avatars/missing.png diff --git a/.gitignore b/.gitignore index 6d3b79652..b4a53fe1b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ !/log/.keep /tmp coverage +public/system diff --git a/app/assets/images/avatars/missing.png b/app/assets/images/avatars/missing.png new file mode 100644 index 0000000000000000000000000000000000000000..40353039fd4c94c018d765c97bcd935fd0307a88 GIT binary patch literal 3890 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 SMri;l3)0s$)+y0K;r|6j?Dc~H literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 91b0d12fe..068480994 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -14,11 +14,24 @@ body { font-size: 13px; line-height: 18px; color: $quaternary-color; + + &::before { + display: block; + content: ""; + position: absolute; + background: $secondary-color; + width: 100%; + height: 200px; + z-index: -1; + top: 0; + left: 0; + } } .container { width: 800px; margin: 0 auto; + z-index: 2; } .footer { diff --git a/app/assets/stylesheets/profile.scss b/app/assets/stylesheets/profile.scss index 5508b8424..e2b59268a 100644 --- a/app/assets/stylesheets/profile.scss +++ b/app/assets/stylesheets/profile.scss @@ -1,5 +1,13 @@ .card { - padding-top: 20px; + margin-top: 40px; + display: flex; + background: darken($background-color, 10%); + border-bottom: 1px solid darken($background-color, 15%); + box-shadow: 4px 3px 0 rgba(0, 0, 0, 0.1); + + .bio { + flex-grow: 1; + } .name { font-size: 24px; @@ -12,24 +20,18 @@ } } - .bio { - - } - - .counter { - display: block; + .avatar { + width: 96px; float: left; - width: 100px; - text-align: center; - border: 1px solid #A593E0; - color: #A593E0; - border-radius: 5px; - padding: 3px 0; - margin-right: 3px; + margin-right: 10px; + padding: 10px; + margin-top: -30px; - .num { + img { + width: 94px; + height: 94px; display: block; - font-size: 24px; + border: 2px solid $background-color; } } } @@ -52,11 +54,33 @@ } } + .entry-container { + display: flex; + } + + .avatar { + width: 48px; + padding: 10px; + padding-left: 8px; + padding-right: 0; + padding-top: 12px; + + img { + width: 48px; + height: 48px; + display: block; + box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.1); + } + } + + .container { + flex-grow: 1; + } + .header { margin-bottom: 10px; padding: 10px; padding-bottom: 0; - padding-left: 8px; .name { text-decoration: none; @@ -79,6 +103,7 @@ color: $tertiary-color; padding: 5px 10px; padding-left: 8px; + clear: both; .name { color: $tertiary-color; @@ -112,7 +137,6 @@ cursor: default; padding: 10px; padding-top: 0; - padding-left: 8px; .counter { display: inline-block; diff --git a/app/models/account.rb b/app/models/account.rb index 0940118dc..f1ac6fdd7 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -3,7 +3,8 @@ class Account < ActiveRecord::Base has_one :user, inverse_of: :account # Avatar upload - has_attached_file :avatar, styles: { large: '300x300#', medium: '96x96#', small: '48x48#' } + attr_reader :avatar_remote_url + has_attached_file :avatar, styles: { large: '300x300#', medium: '96x96#', small: '48x48#' }, default_url: 'avatars/missing.png' validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ # Timelines @@ -64,6 +65,11 @@ class Account < ActiveRecord::Base @subscription ||= OStatus2::Subscription.new(self.remote_url, secret: self.secret, token: self.verify_token, webhook: webhook_url, hub: self.hub_url) end + def avatar_remote_url=(url) + self.avatar = URI.parse(url) + @avatar_remote_url = url + end + before_create do if local? keypair = OpenSSL::PKey::RSA.new(Rails.env.test? ? 48 : 2048) diff --git a/app/views/profile/_status.html.haml b/app/views/profile/_status.html.haml index 44c58b84e..c2033b4f7 100644 --- a/app/views/profile/_status.html.haml +++ b/app/views/profile/_status.html.haml @@ -4,9 +4,13 @@ %i.fa.fa-retweet Shared by = link_to display_name(status.account), profile_url(status.account), class: 'name' - .header - = render partial: 'status_header', locals: { status: status.reblog? ? status.reblog : status } - .content - = status.content - .counters - = render partial: 'status_footer', locals: { status: status.reblog? ? status.reblog : status } + .entry-container + .avatar + = image_tag status.reblog? ? status.reblog.account.avatar.url(:small) : status.account.avatar.url(:small) + .container + .header + = render partial: 'status_header', locals: { status: status.reblog? ? status.reblog : status } + .content + = status.content + .counters + = render partial: 'status_footer', locals: { status: status.reblog? ? status.reblog : status } diff --git a/app/views/profile/show.html.haml b/app/views/profile/show.html.haml index c84cb7e81..b93791734 100644 --- a/app/views/profile/show.html.haml +++ b/app/views/profile/show.html.haml @@ -1,8 +1,10 @@ -%div.card - %h1.name - = @account.display_name.blank? ? @account.username : @account.display_name - %small= "@#{@account.username}" +.card + .avatar= image_tag @account.avatar.url(:medium) + .bio + %h1.name + = @account.display_name.blank? ? @account.username : @account.display_name + %small= "@#{@account.username}" -%div.activity-stream +.activity-stream - @account.statuses.order('id desc').each do |status| = render partial: 'status', locals: { status: status }