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 | 659 | width:24px; |
660 | 660 | vertical-align:top; |
661 | 661 | } |
662 | + | |
663 | + strong { | |
664 | + line-height:24px; | |
665 | + } | |
662 | 666 | } |
663 | 667 | |
664 | 668 | .automerge_widget { |
... | ... | @@ -741,7 +745,7 @@ li.note { |
741 | 745 | */ |
742 | 746 | .event_lp { |
743 | 747 | @extend .alert-info; |
744 | - margin-bottom:15px; | |
748 | + margin-bottom:20px; | |
745 | 749 | padding:8px; |
746 | 750 | border-style: solid; |
747 | 751 | border-width: 1px; | ... | ... |
app/controllers/dashboard_controller.rb
... | ... | @@ -2,18 +2,17 @@ class DashboardController < ApplicationController |
2 | 2 | respond_to :html |
3 | 3 | |
4 | 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 | 16 | end |
18 | 17 | |
19 | 18 | # Get authored or assigned open merge requests | ... | ... |
app/helpers/application_helper.rb
... | ... | @@ -60,8 +60,9 @@ module ApplicationHelper |
60 | 60 | def search_autocomplete_source |
61 | 61 | projects = current_user.projects.map{ |p| { :label => p.name, :url => project_path(p) } } |
62 | 62 | default_nav = [ |
63 | + { :label => "Profile", :url => profile_path }, | |
63 | 64 | { :label => "Keys", :url => keys_path }, |
64 | - { :label => "Projects", :url => projects_path }, | |
65 | + { :label => "Dashboard", :url => root_path }, | |
65 | 66 | { :label => "Admin", :url => admin_root_path } |
66 | 67 | ] |
67 | 68 | ... | ... |
... | ... | @@ -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 @@ |
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 | 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 | 3 | = link_to dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" do |
4 | 4 | Issues |
5 | 5 | %span.count= current_user.assigned_issues.opened.count | ... | ... |
app/views/projects/index.atom.builder
... | ... | @@ -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 | -- 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 | 33 | end |
34 | 34 | |
35 | 35 | get "errors/githost" |
36 | + | |
37 | + # | |
38 | + # Profile Area | |
39 | + # | |
36 | 40 | get "profile/password", :to => "profile#password" |
37 | 41 | put "profile/password", :to => "profile#password_update" |
38 | 42 | get "profile/token", :to => "profile#token" |
... | ... | @@ -41,10 +45,14 @@ Gitlab::Application.routes.draw do |
41 | 45 | get "profile/design", :to => "profile#design" |
42 | 46 | put "profile/update", :to => "profile#update" |
43 | 47 | |
48 | + # | |
49 | + # Dashboard Area | |
50 | + # | |
51 | + get "dashboard", :to => "dashboard#index" | |
44 | 52 | get "dashboard/issues", :to => "dashboard#issues" |
45 | 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 | 56 | resources :keys |
49 | 57 | |
50 | 58 | devise_for :users, :controllers => { :omniauth_callbacks => :omniauth_callbacks } |
... | ... | @@ -145,5 +153,5 @@ Gitlab::Application.routes.draw do |
145 | 153 | end |
146 | 154 | resources :notes, :only => [:index, :create, :destroy] |
147 | 155 | end |
148 | - root :to => "projects#index" | |
156 | + root :to => "dashboard#index" | |
149 | 157 | end | ... | ... |
... | ... | @@ -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 | @project = Factory :project, :owner => @user |
8 | 8 | @project.add_access(@user, :read) |
9 | 9 | create_push_event |
10 | - visit projects_path | |
10 | + visit dashboard_path | |
11 | 11 | end |
12 | 12 | |
13 | 13 | it "should display last push widget with link to merge request page" do | ... | ... |
spec/requests/projects_security_spec.rb
1 | 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 | 8 | end |
9 | 9 | |
10 | 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 | 14 | end |
15 | 15 | |
16 | 16 | describe "Project" do | ... | ... |
spec/requests/projects_spec.rb
... | ... | @@ -3,43 +3,9 @@ require 'spec_helper' |
3 | 3 | describe "Projects" do |
4 | 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 | 6 | describe "GET /projects/new" do |
41 | 7 | before do |
42 | - visit projects_path | |
8 | + visit root_path | |
43 | 9 | click_link "New Project" |
44 | 10 | end |
45 | 11 | ... | ... |
spec/requests/top_panel_spec.rb
... | ... | @@ -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 |