Commit edd81a79c5c2a61e565664cfa787185c4e19729b
1 parent
9ef9c58f
Exists in
master
and in
4 other branches
Dashboard refactoring:
* dashboard should be in dashboard controller not project index * projects index removed
Showing
17 changed files
with
169 additions
and
186 deletions
Show diff stats
app/assets/stylesheets/common.scss
@@ -659,6 +659,10 @@ li.note { | @@ -659,6 +659,10 @@ li.note { | ||
659 | width:24px; | 659 | width:24px; |
660 | vertical-align:top; | 660 | vertical-align:top; |
661 | } | 661 | } |
662 | + | ||
663 | + strong { | ||
664 | + line-height:24px; | ||
665 | + } | ||
662 | } | 666 | } |
663 | 667 | ||
664 | .automerge_widget { | 668 | .automerge_widget { |
@@ -741,7 +745,7 @@ li.note { | @@ -741,7 +745,7 @@ li.note { | ||
741 | */ | 745 | */ |
742 | .event_lp { | 746 | .event_lp { |
743 | @extend .alert-info; | 747 | @extend .alert-info; |
744 | - margin-bottom:15px; | 748 | + margin-bottom:20px; |
745 | padding:8px; | 749 | padding:8px; |
746 | border-style: solid; | 750 | border-style: solid; |
747 | border-width: 1px; | 751 | border-width: 1px; |
app/controllers/dashboard_controller.rb
@@ -2,18 +2,17 @@ class DashboardController < ApplicationController | @@ -2,18 +2,17 @@ class DashboardController < ApplicationController | ||
2 | respond_to :html | 2 | respond_to :html |
3 | 3 | ||
4 | def index | 4 | def index |
5 | - @projects = current_user.projects.all | ||
6 | - | ||
7 | - @active_projects = @projects.select(&:last_activity_date).sort_by(&:last_activity_date).reverse | 5 | + @projects = current_user.projects.includes(:events).order("events.created_at DESC") |
6 | + @projects = @projects.page(params[:page]).per(40) | ||
8 | 7 | ||
9 | - @merge_requests = MergeRequest.where("author_id = :id or assignee_id = :id", :id => current_user.id).opened.order("created_at DESC").limit(5) | 8 | + @events = Event.where(:project_id => current_user.projects.map(&:id)).recent.limit(20) |
10 | 9 | ||
11 | - @user = current_user | ||
12 | - @issues = current_user.assigned_issues.opened.order("created_at DESC").limit(5) | ||
13 | - @issues = @issues.includes(:author, :project) | 10 | + @last_push = current_user.recent_push |
14 | 11 | ||
15 | - @events = Event.where(:project_id => @projects.map(&:id)).recent.limit(20) | ||
16 | - @last_push = Event.where(:project_id => @projects.map(&:id)).recent.code_push.limit(1).first | 12 | + respond_to do |format| |
13 | + format.html | ||
14 | + format.atom { render :layout => false } | ||
15 | + end | ||
17 | end | 16 | end |
18 | 17 | ||
19 | # Get authored or assigned open merge requests | 18 | # Get authored or assigned open merge requests |
app/helpers/application_helper.rb
@@ -60,8 +60,9 @@ module ApplicationHelper | @@ -60,8 +60,9 @@ module ApplicationHelper | ||
60 | def search_autocomplete_source | 60 | def search_autocomplete_source |
61 | projects = current_user.projects.map{ |p| { :label => p.name, :url => project_path(p) } } | 61 | projects = current_user.projects.map{ |p| { :label => p.name, :url => project_path(p) } } |
62 | default_nav = [ | 62 | default_nav = [ |
63 | + { :label => "Profile", :url => profile_path }, | ||
63 | { :label => "Keys", :url => keys_path }, | 64 | { :label => "Keys", :url => keys_path }, |
64 | - { :label => "Projects", :url => projects_path }, | 65 | + { :label => "Dashboard", :url => root_path }, |
65 | { :label => "Admin", :url => admin_root_path } | 66 | { :label => "Admin", :url => admin_root_path } |
66 | ] | 67 | ] |
67 | 68 |
@@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
1 | +xml.instruct! | ||
2 | +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do | ||
3 | + xml.title "Dashboard feed#{" - #{current_user.name}" if current_user.name.present?}" | ||
4 | + xml.link :href => projects_url(:atom), :rel => "self", :type => "application/atom+xml" | ||
5 | + xml.link :href => projects_url, :rel => "alternate", :type => "text/html" | ||
6 | + xml.id projects_url | ||
7 | + xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? | ||
8 | + | ||
9 | + @events.each do |event| | ||
10 | + if event.allowed? | ||
11 | + xml.entry do | ||
12 | + if event.issue? | ||
13 | + event_link = project_issue_url(event.project, event.issue) | ||
14 | + event_title = event.issue_title | ||
15 | + elsif event.merge_request? | ||
16 | + event_link = project_merge_request_url(event.project, event.merge_request) | ||
17 | + event_title = event.merge_request_title | ||
18 | + elsif event.push? | ||
19 | + event_link = project_commits_url(event.project, :ref => event.ref_name) | ||
20 | + event_title = event.ref_name | ||
21 | + end | ||
22 | + | ||
23 | + xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" | ||
24 | + xml.link :href => event_link | ||
25 | + xml.title truncate(event_title, :length => 80) | ||
26 | + xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") | ||
27 | + xml.media :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(event.author_email) | ||
28 | + xml.author do |author| | ||
29 | + xml.name event.author_name | ||
30 | + xml.email event.author_email | ||
31 | + end | ||
32 | + xml.summary event_title | ||
33 | + end | ||
34 | + end | ||
35 | + end | ||
36 | +end |
@@ -0,0 +1,56 @@ | @@ -0,0 +1,56 @@ | ||
1 | +- if @projects.any? | ||
2 | + .projects | ||
3 | + .activities.span8 | ||
4 | + - if current_user.require_ssh_key? | ||
5 | + .alert.alert-error.padded | ||
6 | + %span | ||
7 | + You wont be able to pull/push project code unless you | ||
8 | + %strong | ||
9 | + = link_to new_key_path, :class => "vlink" do | ||
10 | + add new key | ||
11 | + to your profile | ||
12 | + - if @events.any? | ||
13 | + = render @events | ||
14 | + - else | ||
15 | + %h4.nothing_here_message Projects activity will be displayed here | ||
16 | + .side | ||
17 | + = render "events/event_last_push", :event => @last_push | ||
18 | + .projects_box | ||
19 | + %h5 | ||
20 | + Projects | ||
21 | + %small | ||
22 | + (#{@projects.total_count}) | ||
23 | + - if current_user.can_create_project? | ||
24 | + %span.right | ||
25 | + = link_to new_project_path, :class => "btn very_small info" do | ||
26 | + %i.icon-plus | ||
27 | + New Project | ||
28 | + - @projects.each do |project| | ||
29 | + = link_to project_path(project), :class => dom_class(project) do | ||
30 | + %h4 | ||
31 | + %span.ico.project | ||
32 | + = truncate(project.name, :length => 25) | ||
33 | + %span.right | ||
34 | + → | ||
35 | + .bottom= paginate @projects, :theme => "gitlab" | ||
36 | + | ||
37 | + %hr | ||
38 | + %div | ||
39 | + %span.rss-icon | ||
40 | + = link_to dashboard_path(:atom, { :private_token => current_user.private_token }) do | ||
41 | + = image_tag "rss_ui.png", :title => "feed" | ||
42 | + %strong News Feed | ||
43 | + | ||
44 | +- else | ||
45 | + %h3.nothing_here_message There are no projects you have access to. | ||
46 | + %br | ||
47 | + %h4.nothing_here_message | ||
48 | + - if current_user.can_create_project? | ||
49 | + You can create up to | ||
50 | + = current_user.projects_limit | ||
51 | + projects. Click on button below to add a new one | ||
52 | + .link_holder | ||
53 | + = link_to new_project_path, :class => "btn primary" do | ||
54 | + New Project » | ||
55 | + - else | ||
56 | + If you will be added to project - it will be displayed here |
app/views/layouts/_app_menu.html.haml
1 | %nav.main_menu | 1 | %nav.main_menu |
2 | - = link_to "Home", root_path, :class => "home #{"current" if current_page?(projects_path) || current_page?(root_path)}", :title => "Home" | 2 | + = link_to "Home", root_path, :class => "home #{"current" if current_page?(dashboard_path) || current_page?(root_path)}", :title => "Home" |
3 | = link_to dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" do | 3 | = link_to dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" do |
4 | Issues | 4 | Issues |
5 | %span.count= current_user.assigned_issues.opened.count | 5 | %span.count= current_user.assigned_issues.opened.count |
app/views/projects/index.atom.builder
@@ -1,36 +0,0 @@ | @@ -1,36 +0,0 @@ | ||
1 | -xml.instruct! | ||
2 | -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do | ||
3 | - xml.title "Dashboard feed#{" - #{current_user.name}" if current_user.name.present?}" | ||
4 | - xml.link :href => projects_url(:atom), :rel => "self", :type => "application/atom+xml" | ||
5 | - xml.link :href => projects_url, :rel => "alternate", :type => "text/html" | ||
6 | - xml.id projects_url | ||
7 | - xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? | ||
8 | - | ||
9 | - @events.each do |event| | ||
10 | - if event.allowed? | ||
11 | - xml.entry do | ||
12 | - if event.issue? | ||
13 | - event_link = project_issue_url(event.project, event.issue) | ||
14 | - event_title = event.issue_title | ||
15 | - elsif event.merge_request? | ||
16 | - event_link = project_merge_request_url(event.project, event.merge_request) | ||
17 | - event_title = event.merge_request_title | ||
18 | - elsif event.push? | ||
19 | - event_link = project_commits_url(event.project, :ref => event.ref_name) | ||
20 | - event_title = event.ref_name | ||
21 | - end | ||
22 | - | ||
23 | - xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" | ||
24 | - xml.link :href => event_link | ||
25 | - xml.title truncate(event_title, :length => 80) | ||
26 | - xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") | ||
27 | - xml.media :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(event.author_email) | ||
28 | - xml.author do |author| | ||
29 | - xml.name event.author_name | ||
30 | - xml.email event.author_email | ||
31 | - end | ||
32 | - xml.summary event_title | ||
33 | - end | ||
34 | - end | ||
35 | - end | ||
36 | -end |
app/views/projects/index.html.haml
@@ -1,49 +0,0 @@ | @@ -1,49 +0,0 @@ | ||
1 | -- if @projects.any? | ||
2 | - .projects | ||
3 | - .activities.span8 | ||
4 | - - if current_user.require_ssh_key? | ||
5 | - .alert.alert-error.padded | ||
6 | - %span | ||
7 | - You wont be able to pull/push project code unless you | ||
8 | - %strong | ||
9 | - = link_to new_key_path, :class => "vlink" do | ||
10 | - add new key | ||
11 | - to your profile | ||
12 | - - if @events.any? | ||
13 | - = render @events | ||
14 | - - else | ||
15 | - %h4.nothing_here_message Projects activity will be displayed here | ||
16 | - .side | ||
17 | - = render "events/event_last_push", :event => @last_push | ||
18 | - .projects_box | ||
19 | - %h5 | ||
20 | - Projects | ||
21 | - %small | ||
22 | - (#{@projects.total_count}) | ||
23 | - - if current_user.can_create_project? | ||
24 | - %span.right | ||
25 | - = link_to new_project_path, :class => "btn very_small info" do | ||
26 | - %i.icon-plus | ||
27 | - New Project | ||
28 | - - @projects.each do |project| | ||
29 | - = link_to project_path(project), :class => dom_class(project) do | ||
30 | - %h4 | ||
31 | - %span.ico.project | ||
32 | - = truncate(project.name, :length => 25) | ||
33 | - %span.right | ||
34 | - → | ||
35 | - .bottom= paginate @projects, :theme => "gitlab" | ||
36 | - | ||
37 | -- else | ||
38 | - %h3.nothing_here_message There are no projects you have access to. | ||
39 | - %br | ||
40 | - %h4.nothing_here_message | ||
41 | - - if current_user.can_create_project? | ||
42 | - You can create up to | ||
43 | - = current_user.projects_limit | ||
44 | - projects. Click on button below to add a new one | ||
45 | - .link_holder | ||
46 | - = link_to new_project_path, :class => "btn primary" do | ||
47 | - New Project » | ||
48 | - - else | ||
49 | - If you will be added to project - it will be displayed here |
app/views/projects/index.js.haml
app/views/projects/show.html.haml
config/routes.rb
@@ -33,6 +33,10 @@ Gitlab::Application.routes.draw do | @@ -33,6 +33,10 @@ Gitlab::Application.routes.draw do | ||
33 | end | 33 | end |
34 | 34 | ||
35 | get "errors/githost" | 35 | get "errors/githost" |
36 | + | ||
37 | + # | ||
38 | + # Profile Area | ||
39 | + # | ||
36 | get "profile/password", :to => "profile#password" | 40 | get "profile/password", :to => "profile#password" |
37 | put "profile/password", :to => "profile#password_update" | 41 | put "profile/password", :to => "profile#password_update" |
38 | get "profile/token", :to => "profile#token" | 42 | get "profile/token", :to => "profile#token" |
@@ -41,10 +45,14 @@ Gitlab::Application.routes.draw do | @@ -41,10 +45,14 @@ Gitlab::Application.routes.draw do | ||
41 | get "profile/design", :to => "profile#design" | 45 | get "profile/design", :to => "profile#design" |
42 | put "profile/update", :to => "profile#update" | 46 | put "profile/update", :to => "profile#update" |
43 | 47 | ||
48 | + # | ||
49 | + # Dashboard Area | ||
50 | + # | ||
51 | + get "dashboard", :to => "dashboard#index" | ||
44 | get "dashboard/issues", :to => "dashboard#issues" | 52 | get "dashboard/issues", :to => "dashboard#issues" |
45 | get "dashboard/merge_requests", :to => "dashboard#merge_requests" | 53 | get "dashboard/merge_requests", :to => "dashboard#merge_requests" |
46 | 54 | ||
47 | - resources :projects, :constraints => { :id => /[^\/]+/ }, :only => [:new, :create, :index] | 55 | + resources :projects, :constraints => { :id => /[^\/]+/ }, :only => [:new, :create] |
48 | resources :keys | 56 | resources :keys |
49 | 57 | ||
50 | devise_for :users, :controllers => { :omniauth_callbacks => :omniauth_callbacks } | 58 | devise_for :users, :controllers => { :omniauth_callbacks => :omniauth_callbacks } |
@@ -145,5 +153,5 @@ Gitlab::Application.routes.draw do | @@ -145,5 +153,5 @@ Gitlab::Application.routes.draw do | ||
145 | end | 153 | end |
146 | resources :notes, :only => [:index, :create, :destroy] | 154 | resources :notes, :only => [:index, :create, :destroy] |
147 | end | 155 | end |
148 | - root :to => "projects#index" | 156 | + root :to => "dashboard#index" |
149 | end | 157 | end |
@@ -0,0 +1,39 @@ | @@ -0,0 +1,39 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "User Dashboard" do | ||
4 | + before { login_as :user } | ||
5 | + | ||
6 | + describe "GET /" do | ||
7 | + before do | ||
8 | + @project = Factory :project, :owner => @user | ||
9 | + @project.add_access(@user, :read) | ||
10 | + visit dashboard_path | ||
11 | + end | ||
12 | + | ||
13 | + it "should be on projects page" do | ||
14 | + current_path.should == dashboard_path | ||
15 | + end | ||
16 | + | ||
17 | + it "should have link to new project" do | ||
18 | + page.should have_content("New Project") | ||
19 | + end | ||
20 | + | ||
21 | + it "should have project" do | ||
22 | + page.should have_content(@project.name) | ||
23 | + end | ||
24 | + | ||
25 | + it "should render projects atom feed via private token" do | ||
26 | + logout | ||
27 | + | ||
28 | + visit dashboard_path(:atom, :private_token => @user.private_token) | ||
29 | + page.body.should have_selector("feed title") | ||
30 | + end | ||
31 | + | ||
32 | + it "should not render projects page via private token" do | ||
33 | + logout | ||
34 | + | ||
35 | + visit dashboard_path(:private_token => @user.private_token) | ||
36 | + current_path.should == new_user_session_path | ||
37 | + end | ||
38 | + end | ||
39 | +end |
spec/requests/last_push_widget_spec.rb
@@ -7,7 +7,7 @@ describe "Last Push widget" do | @@ -7,7 +7,7 @@ describe "Last Push widget" do | ||
7 | @project = Factory :project, :owner => @user | 7 | @project = Factory :project, :owner => @user |
8 | @project.add_access(@user, :read) | 8 | @project.add_access(@user, :read) |
9 | create_push_event | 9 | create_push_event |
10 | - visit projects_path | 10 | + visit dashboard_path |
11 | end | 11 | end |
12 | 12 | ||
13 | it "should display last push widget with link to merge request page" do | 13 | it "should display last push widget with link to merge request page" do |
spec/requests/projects_security_spec.rb
1 | require 'spec_helper' | 1 | require 'spec_helper' |
2 | 2 | ||
3 | -describe "Projects" do | ||
4 | - describe "GET /projects" do | ||
5 | - it { projects_path.should be_allowed_for :admin } | ||
6 | - it { projects_path.should be_allowed_for :user } | ||
7 | - it { projects_path.should be_denied_for :visitor } | 3 | +describe "Projects Security" do |
4 | + describe "GET /" do | ||
5 | + it { root_path.should be_allowed_for :admin } | ||
6 | + it { root_path.should be_allowed_for :user } | ||
7 | + it { root_path.should be_denied_for :visitor } | ||
8 | end | 8 | end |
9 | 9 | ||
10 | describe "GET /projects/new" do | 10 | describe "GET /projects/new" do |
11 | - it { projects_path.should be_allowed_for :admin } | ||
12 | - it { projects_path.should be_allowed_for :user } | ||
13 | - it { projects_path.should be_denied_for :visitor } | 11 | + it { new_project_path.should be_allowed_for :admin } |
12 | + it { new_project_path.should be_allowed_for :user } | ||
13 | + it { new_project_path.should be_denied_for :visitor } | ||
14 | end | 14 | end |
15 | 15 | ||
16 | describe "Project" do | 16 | describe "Project" do |
spec/requests/projects_spec.rb
@@ -3,43 +3,9 @@ require 'spec_helper' | @@ -3,43 +3,9 @@ require 'spec_helper' | ||
3 | describe "Projects" do | 3 | describe "Projects" do |
4 | before { login_as :user } | 4 | before { login_as :user } |
5 | 5 | ||
6 | - describe "GET /projects" do | ||
7 | - before do | ||
8 | - @project = Factory :project, :owner => @user | ||
9 | - @project.add_access(@user, :read) | ||
10 | - visit projects_path | ||
11 | - end | ||
12 | - | ||
13 | - it "should be on projects page" do | ||
14 | - current_path.should == projects_path | ||
15 | - end | ||
16 | - | ||
17 | - it "should have link to new project" do | ||
18 | - page.should have_content("New Project") | ||
19 | - end | ||
20 | - | ||
21 | - it "should have project" do | ||
22 | - page.should have_content(@project.name) | ||
23 | - end | ||
24 | - | ||
25 | - it "should render projects atom feed via private token" do | ||
26 | - logout | ||
27 | - | ||
28 | - visit projects_path(:atom, :private_token => @user.private_token) | ||
29 | - page.body.should have_selector("feed title") | ||
30 | - end | ||
31 | - | ||
32 | - it "should not render projects page via private token" do | ||
33 | - logout | ||
34 | - | ||
35 | - visit projects_path(:private_token => @user.private_token) | ||
36 | - current_path.should == new_user_session_path | ||
37 | - end | ||
38 | - end | ||
39 | - | ||
40 | describe "GET /projects/new" do | 6 | describe "GET /projects/new" do |
41 | before do | 7 | before do |
42 | - visit projects_path | 8 | + visit root_path |
43 | click_link "New Project" | 9 | click_link "New Project" |
44 | end | 10 | end |
45 | 11 |
spec/requests/top_panel_spec.rb
@@ -1,37 +0,0 @@ | @@ -1,37 +0,0 @@ | ||
1 | -__END__ | ||
2 | -require 'spec_helper' | ||
3 | - | ||
4 | -describe "Top Panel", :js => true do | ||
5 | - before { login_as :user } | ||
6 | - | ||
7 | - describe "Search autocomplete" do | ||
8 | - before do | ||
9 | - visit projects_path | ||
10 | - fill_in "search", :with => "Ke" | ||
11 | - within ".ui-autocomplete" do | ||
12 | - find(:xpath, "//a[.=\"Keys\"]").click | ||
13 | - end | ||
14 | - end | ||
15 | - | ||
16 | - it "should be on projects page" do | ||
17 | - current_path.should == keys_path | ||
18 | - end | ||
19 | - end | ||
20 | - | ||
21 | - describe "with project" do | ||
22 | - before do | ||
23 | - @project = Factory :project | ||
24 | - @project.add_access(@user, :read) | ||
25 | - visit project_path(@project) | ||
26 | - | ||
27 | - fill_in "search", :with => "Commi" | ||
28 | - within ".ui-autocomplete" do | ||
29 | - find(:xpath, "//a[.=\"#{@project.code} / Commits\"]").click | ||
30 | - end | ||
31 | - end | ||
32 | - | ||
33 | - it "should be on projects page" do | ||
34 | - current_path.should == project_commits_path(@project) | ||
35 | - end | ||
36 | - end | ||
37 | -end |