Commit 1c6df8e075abf87c6911be7ca9a691d48b7d4009

Authored by Dmitriy Zaporozhets
1 parent fea64946

Improved profile & team member show

app/assets/stylesheets/common.scss
@@ -358,12 +358,15 @@ img.lil_av { @@ -358,12 +358,15 @@ img.lil_av {
358 top: 3px; 358 top: 3px;
359 } 359 }
360 360
361 -.media-grid {  
362 - h3, h2 , h4 {  
363 - &.media_h {  
364 - padding-left:10px;  
365 - float:left;  
366 - } 361 +.profile_avatar_holder {
  362 + float:left;
  363 + width:90px;
  364 + height:90px;
  365 + margin-right:20px;
  366 + img {
  367 + width:90px;
  368 + height:90px;
  369 + background:#eee;
367 } 370 }
368 } 371 }
369 372
app/models/user.rb
@@ -5,13 +5,19 @@ class User < ActiveRecord::Base @@ -5,13 +5,19 @@ class User < ActiveRecord::Base
5 :recoverable, :rememberable, :trackable, :validatable, :omniauthable 5 :recoverable, :rememberable, :trackable, :validatable, :omniauthable
6 6
7 # Setup accessible (or protected) attributes for your model 7 # Setup accessible (or protected) attributes for your model
8 - attr_accessible :email, :password, :password_confirmation, :remember_me, 8 + attr_accessible :email, :password, :password_confirmation, :remember_me, :bio,
9 :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme, :theme_id 9 :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme, :theme_id
10 10
11 has_many :users_projects, :dependent => :destroy 11 has_many :users_projects, :dependent => :destroy
12 has_many :projects, :through => :users_projects 12 has_many :projects, :through => :users_projects
13 has_many :my_own_projects, :class_name => "Project", :foreign_key => :owner_id 13 has_many :my_own_projects, :class_name => "Project", :foreign_key => :owner_id
14 has_many :keys, :dependent => :destroy 14 has_many :keys, :dependent => :destroy
  15 +
  16 + has_many :recent_events,
  17 + :class_name => "Event",
  18 + :foreign_key => :author_id,
  19 + :order => "id DESC"
  20 +
15 has_many :issues, 21 has_many :issues,
16 :foreign_key => :author_id, 22 :foreign_key => :author_id,
17 :dependent => :destroy 23 :dependent => :destroy
@@ -38,6 +44,7 @@ class User < ActiveRecord::Base @@ -38,6 +44,7 @@ class User < ActiveRecord::Base
38 :presence => true, 44 :presence => true,
39 :numericality => {:greater_than_or_equal_to => 0} 45 :numericality => {:greater_than_or_equal_to => 0}
40 46
  47 + validates :bio, :length => { :within => 0..255 }
41 48
42 before_create :ensure_authentication_token 49 before_create :ensure_authentication_token
43 alias_attribute :private_token, :authentication_token 50 alias_attribute :private_token, :authentication_token
app/views/dashboard/index.html.haml
@@ -34,6 +34,15 @@ @@ -34,6 +34,15 @@
34 %br 34 %br
35 = link_to new_project_path, :class => "btn" do 35 = link_to new_project_path, :class => "btn" do
36 New Project » 36 New Project »
  37 + - else
  38 + %hr
  39 + %div
  40 + You've reached project limit for your account.
  41 + You cannot create new projects.
  42 + .link_holder
  43 + %br
  44 + = link_to profile_path, :class => "btn" do
  45 + Your Profile »
37 .span10.left= render "dashboard/projects_feed", :projects => @active_projects 46 .span10.left= render "dashboard/projects_feed", :projects => @active_projects
38 - if @last_push 47 - if @last_push
39 .padded.prepend-top-20 48 .padded.prepend-top-20
app/views/devise/sessions/new.html.erb
@@ -9,6 +9,13 @@ @@ -9,6 +9,13 @@
9 <br/> 9 <br/>
10 <%= f.submit "Sign in", :class => "primary btn" %> 10 <%= f.submit "Sign in", :class => "primary btn" %>
11 <div class="right"> <%= render :partial => "devise/shared/links" %></div> 11 <div class="right"> <%= render :partial => "devise/shared/links" %></div>
  12 +
  13 + <%- if devise_mapping.omniauthable? %>
  14 + <%- resource_class.omniauth_providers.each do |provider| %>
  15 + <hr/>
  16 + <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider), :class => "btn primary" %><br />
  17 + <% end -%>
  18 + <% end -%>
12 <% if ldap_enable? -%> 19 <% if ldap_enable? -%>
13 <p><%= link_to "via LDAP", user_omniauth_authorize_path(:ldap)%></p> 20 <p><%= link_to "via LDAP", user_omniauth_authorize_path(:ldap)%></p>
14 <% end -%> 21 <% end -%>
app/views/devise/shared/_links.erb
@@ -17,9 +17,3 @@ @@ -17,9 +17,3 @@
17 <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> 17 <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18 <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br /> 18 <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
19 <% end -%> 19 <% end -%>
20 -  
21 -<%- if devise_mapping.omniauthable? %>  
22 - <%- resource_class.omniauth_providers.each do |provider| %>  
23 - <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br />  
24 - <% end -%>  
25 -<% end -%>  
app/views/profile/show.html.haml
1 -.media-grid  
2 - = link_to "#" do  
3 - = image_tag gravatar_icon(@user.email, 90), :class => "thumbnail"  
4 - %h3.media_h  
5 - = @user.name  
6 - %br  
7 - %small  
8 - = @user.email  
9 -  
10 - .right  
11 - %p.alert-message.block-message You can change your avatar at gravatar.com  
12 - 1 +.row
  2 + .span10
  3 + .profile_avatar_holder
  4 + = image_tag gravatar_icon(@user.email, 90), :class => "styled_image"
  5 + %h3
  6 + = @user.name
  7 + %br
  8 + %small
  9 + = @user.email
  10 +
  11 + .span6.right
  12 + %div
  13 + %div
  14 + %h5.cgray
  15 + Personal projects:
  16 + %span.right
  17 + %span= current_user.my_own_projects.count
  18 + of
  19 + %span= current_user.projects_limit
  20 + %h5.cgray
  21 + SSH public keys:
  22 + %span.right
  23 + %span= current_user.keys.count
13 %hr 24 %hr
14 25
15 = form_for @user, :url => profile_update_path, :method => :put do |f| 26 = form_for @user, :url => profile_update_path, :method => :put do |f|
@@ -18,23 +29,39 @@ @@ -18,23 +29,39 @@
18 %ul 29 %ul
19 - @user.errors.full_messages.each do |msg| 30 - @user.errors.full_messages.each do |msg|
20 %li= msg 31 %li= msg
21 -  
22 - .clearfix  
23 - = f.label :name  
24 - .input= f.text_field :name  
25 - .clearfix  
26 - = f.label :email  
27 - .input= f.text_field :email  
28 - .clearfix  
29 - = f.label :skype  
30 - .input= f.text_field :skype  
31 - .clearfix  
32 - = f.label :linkedin  
33 - .input= f.text_field :linkedin  
34 - .clearfix  
35 - = f.label :twitter  
36 - .input= f.text_field :twitter 32 + .row
  33 + .span9
  34 + .clearfix
  35 + = f.label :name
  36 + .input
  37 + = f.text_field :name, :class => "xlarge"
  38 + %span.help-block Enter youre name, so people you know can recognize you.
  39 + .clearfix
  40 + = f.label :email
  41 + .input
  42 + = f.text_field :email, :class => "xlarge"
  43 + %span.help-block We also use email for avatar detection
  44 + .clearfix
  45 + = f.label :skype
  46 + .input= f.text_field :skype, :class => "xlarge"
  47 + .clearfix
  48 + = f.label :linkedin
  49 + .input= f.text_field :linkedin, :class => "xlarge"
  50 + .clearfix
  51 + = f.label :twitter
  52 + .input= f.text_field :twitter, :class => "xlarge"
  53 + .clearfix
  54 + = f.label :bio
  55 + .input
  56 + = f.text_area :bio, :rows => 6, :class => "xlarge", :maxlength => 250
  57 + %span.help-block About yourself in fewer than 250 characters.
  58 + .span7.right
  59 + %p.alert-message.block-message
  60 + %strong Tip:
  61 + You can change your avatar at gravatar.com
37 62
38 .actions 63 .actions
39 = f.submit 'Save', :class => "primary btn" 64 = f.submit 'Save', :class => "primary btn"
40 65
  66 +-#= link_to "New project", new_project_path, :class => "btn small padded"
  67 +-#= link_to "New public key", new_key_path, :class => "btn small"
app/views/team_members/show.html.haml
1 - allow_admin = can? current_user, :admin_project, @project 1 - allow_admin = can? current_user, :admin_project, @project
2 - user = @team_member.user 2 - user = @team_member.user
3 -.media-grid  
4 - = link_to "#" do  
5 - = image_tag gravatar_icon(user.email, 60), :class => "thumbnail", :width => 60  
6 - %h3.media_h  
7 - = user.name  
8 - %br  
9 - %small= user.email  
10 -  
11 -.back_link  
12 - = link_to team_project_path(@project), :class => "" do  
13 - &larr; To team list  
14 3
15 -%br  
16 -%table.zebra-striped.borders  
17 - %tr  
18 - %td Name  
19 - %td= user.name 4 +.row
  5 + .span8
  6 + .profile_avatar_holder
  7 + = image_tag gravatar_icon(user.email, 90), :class => "styled_image"
  8 + %h3
  9 + = user.name
  10 + %br
  11 + %small
  12 + = user.email
  13 + %br
  14 + .back_link
  15 + %br
  16 + = link_to team_project_path(@project), :class => "" do
  17 + &larr; To team list
20 18
21 - %tr  
22 - %td Email  
23 - %td= user.email 19 + .span8.right
  20 + %div
  21 + %div
  22 + %h5.cgray
  23 + Member since:
  24 + %span.right
  25 + = @team_member.created_at.stamp("Aug 21, 2011")
  26 + %h5.cgray
  27 + Project Access:
  28 + %small (#{link_to "read more", help_permissions_path, :class => "vlink"})
  29 + %span.right
  30 + = form_for(@team_member, :as => :team_member, :url => project_team_member_path(@project, @team_member)) do |f|
  31 + = f.select :project_access, options_for_select(Project.access_options, @team_member.project_access), {}, :class => "project-access-select", :disabled => !allow_admin
24 32
25 - %tr  
26 - %td Member since  
27 - %td= @team_member.created_at.stamp("Aug 21, 2011")  
28 33
29 - %tr  
30 - %td  
31 - Project Access  
32 - (#{link_to "read more", help_permissions_path, :class => "vlink"})  
33 -  
34 - %td  
35 - = form_for(@team_member, :as => :team_member, :url => project_team_member_path(@project, @team_member)) do |f|  
36 - = f.select :project_access, options_for_select(Project.access_options, @team_member.project_access), {}, :class => "project-access-select", :disabled => !allow_admin  
37 34
  35 +%div.prepend-top-20
38 - unless user.skype.empty? 36 - unless user.skype.empty?
39 - %tr  
40 - %td Skype:  
41 - %td= user.skype 37 + %p
  38 + %b Skype:
  39 + = user.skype
42 40
43 - unless user.linkedin.empty? 41 - unless user.linkedin.empty?
44 - %tr  
45 - %td LinkedIn:  
46 - %td= user.linkedin 42 + %p
  43 + %b LinkedIn:
  44 + = user.linkedin
47 45
48 - unless user.twitter.empty? 46 - unless user.twitter.empty?
49 - %tr  
50 - %td Twitter:  
51 - %td= user.twitter 47 + %p
  48 + %b Twitter:
  49 + = user.twitter
  50 + - unless user.bio.empty?
  51 + %p
  52 + %b Bio:
  53 + = user.bio
  54 +
  55 += render user.recent_events.limit(3)
  56 +
52 57
53 - if can? current_user, :admin_project, @project 58 - if can? current_user, :admin_project, @project
54 .actions 59 .actions
db/migrate/20120323221339_add_bio_field_to_user.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +class AddBioFieldToUser < ActiveRecord::Migration
  2 + def change
  3 + add_column :users, :bio, :string, :null => true
  4 + end
  5 +end
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 # 11 #
12 # It's strongly recommended to check this file into your version control system. 12 # It's strongly recommended to check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(:version => 20120315132931) do 14 +ActiveRecord::Schema.define(:version => 20120323221339) do
15 15
16 create_table "events", :force => true do |t| 16 create_table "events", :force => true do |t|
17 t.string "target_type" 17 t.string "target_type"
@@ -155,6 +155,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120315132931) do @@ -155,6 +155,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120315132931) do
155 t.string "authentication_token" 155 t.string "authentication_token"
156 t.boolean "dark_scheme", :default => false, :null => false 156 t.boolean "dark_scheme", :default => false, :null => false
157 t.integer "theme_id", :default => 1, :null => false 157 t.integer "theme_id", :default => 1, :null => false
  158 + t.string "bio"
158 end 159 end
159 160
160 add_index "users", ["email"], :name => "index_users_on_email", :unique => true 161 add_index "users", ["email"], :name => "index_users_on_email", :unique => true