Commit 1b6a3dfec9bdadb8c607bf57e4b6699c4ab3a80b
1 parent
f9eda9b3
Exists in
master
and in
4 other branches
Move all stuff to groups controller
Showing
16 changed files
with
339 additions
and
27 deletions
Show diff stats
app/assets/stylesheets/sections/projects.scss
app/controllers/dashboard_controller.rb
@@ -3,21 +3,14 @@ class DashboardController < ApplicationController | @@ -3,21 +3,14 @@ class DashboardController < ApplicationController | ||
3 | 3 | ||
4 | def index | 4 | def index |
5 | @groups = Group.where(id: current_user.projects.pluck(:group_id)) | 5 | @groups = Group.where(id: current_user.projects.pluck(:group_id)) |
6 | - | ||
7 | @projects = current_user.projects_with_events | 6 | @projects = current_user.projects_with_events |
8 | - | ||
9 | - if params[:group].present? | ||
10 | - @group = Group.find_by_code(params[:group]) | ||
11 | - @projects = @projects.where(group_id: @group.id) | ||
12 | - end | ||
13 | - | ||
14 | @projects = @projects.page(params[:page]).per(40) | 7 | @projects = @projects.page(params[:page]).per(40) |
15 | 8 | ||
16 | @events = Event.recent_for_user(current_user).limit(20).offset(params[:offset] || 0) | 9 | @events = Event.recent_for_user(current_user).limit(20).offset(params[:offset] || 0) |
17 | @last_push = current_user.recent_push | 10 | @last_push = current_user.recent_push |
18 | 11 | ||
19 | respond_to do |format| | 12 | respond_to do |format| |
20 | - format.html { render 'index', layout: determine_layout } | 13 | + format.html |
21 | format.js | 14 | format.js |
22 | format.atom { render layout: false } | 15 | format.atom { render layout: false } |
23 | end | 16 | end |
@@ -41,10 +34,4 @@ class DashboardController < ApplicationController | @@ -41,10 +34,4 @@ class DashboardController < ApplicationController | ||
41 | format.atom { render layout: false } | 34 | format.atom { render layout: false } |
42 | end | 35 | end |
43 | end | 36 | end |
44 | - | ||
45 | - protected | ||
46 | - | ||
47 | - def determine_layout | ||
48 | - @group ? 'group' : 'application' | ||
49 | - end | ||
50 | end | 37 | end |
@@ -0,0 +1,69 @@ | @@ -0,0 +1,69 @@ | ||
1 | +class GroupsController < ApplicationController | ||
2 | + respond_to :html | ||
3 | + layout 'group' | ||
4 | + | ||
5 | + before_filter :group | ||
6 | + before_filter :projects | ||
7 | + | ||
8 | + def show | ||
9 | + @events = Event.where(project_id: project_ids). | ||
10 | + order('id DESC'). | ||
11 | + limit(20).offset(params[:offset] || 0) | ||
12 | + | ||
13 | + @last_push = current_user.recent_push | ||
14 | + | ||
15 | + respond_to do |format| | ||
16 | + format.html | ||
17 | + format.js | ||
18 | + format.atom { render layout: false } | ||
19 | + end | ||
20 | + end | ||
21 | + | ||
22 | + # Get authored or assigned open merge requests | ||
23 | + def merge_requests | ||
24 | + @merge_requests = current_user.cared_merge_requests.order("created_at DESC").page(params[:page]).per(20) | ||
25 | + end | ||
26 | + | ||
27 | + # Get only assigned issues | ||
28 | + def issues | ||
29 | + @user = current_user | ||
30 | + @issues = current_user.assigned_issues.opened.order("created_at DESC").page(params[:page]).per(20) | ||
31 | + @issues = @issues.includes(:author, :project) | ||
32 | + | ||
33 | + respond_to do |format| | ||
34 | + format.html | ||
35 | + format.atom { render layout: false } | ||
36 | + end | ||
37 | + end | ||
38 | + | ||
39 | + def search | ||
40 | + query = params[:search] | ||
41 | + | ||
42 | + @merge_requests = [] | ||
43 | + @issues = [] | ||
44 | + | ||
45 | + if query.present? | ||
46 | + @projects = @projects.search(query).limit(10) | ||
47 | + @merge_requests = MergeRequest.where(project_id: project_ids).search(query).limit(10) | ||
48 | + @issues = Issue.where(project_id: project_ids).search(query).limit(10) | ||
49 | + end | ||
50 | + end | ||
51 | + | ||
52 | + def people | ||
53 | + @users = group.projects.map(&:users).flatten.uniq | ||
54 | + end | ||
55 | + | ||
56 | + protected | ||
57 | + | ||
58 | + def group | ||
59 | + @group ||= Group.find_by_code(params[:id]) | ||
60 | + end | ||
61 | + | ||
62 | + def projects | ||
63 | + @projects ||= current_user.projects_with_events.where(group_id: @group.id) | ||
64 | + end | ||
65 | + | ||
66 | + def project_ids | ||
67 | + projects.map(&:id) | ||
68 | + end | ||
69 | +end |
app/views/dashboard/_groups.html.haml
@@ -6,7 +6,7 @@ | @@ -6,7 +6,7 @@ | ||
6 | %ul.unstyled | 6 | %ul.unstyled |
7 | - groups.each do |group| | 7 | - groups.each do |group| |
8 | %li.wll | 8 | %li.wll |
9 | - = link_to dashboard_path(group: group), class: dom_class(group) do | 9 | + = link_to group_path(id: group.code), class: dom_class(group) do |
10 | %strong.group_name= truncate(group.name, length: 25) | 10 | %strong.group_name= truncate(group.name, length: 25) |
11 | %span.arrow | 11 | %span.arrow |
12 | → | 12 | → |
app/views/dashboard/index.html.haml
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | .loading.hide | 9 | .loading.hide |
10 | .side | 10 | .side |
11 | = render "events/event_last_push", event: @last_push | 11 | = render "events/event_last_push", event: @last_push |
12 | - - unless @group | 12 | + - if @groups.present? |
13 | = render "groups", groups: @groups | 13 | = render "groups", groups: @groups |
14 | = render "projects", projects: @projects | 14 | = render "projects", projects: @projects |
15 | %div | 15 | %div |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +.projects_box | ||
2 | + %h5 | ||
3 | + Projects | ||
4 | + %small | ||
5 | + (#{projects.count}) | ||
6 | + - if current_user.can_create_project? | ||
7 | + %span.right | ||
8 | + = link_to new_project_path, class: "btn very_small info" do | ||
9 | + %i.icon-plus | ||
10 | + New Project | ||
11 | + %ul.unstyled | ||
12 | + - projects.each do |project| | ||
13 | + %li.wll | ||
14 | + = link_to project_path(project), class: dom_class(project) do | ||
15 | + %strong.project_name= truncate(project.name, length: 25) | ||
16 | + %span.arrow | ||
17 | + → | ||
18 | + %span.last_activity | ||
19 | + %strong Last activity: | ||
20 | + %span= project_last_activity(project) |
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | +xml.instruct! | ||
2 | +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do | ||
3 | + xml.title "#{@user.name} issues" | ||
4 | + xml.link :href => dashboard_issues_url(:atom, :private_token => @user.private_token), :rel => "self", :type => "application/atom+xml" | ||
5 | + xml.link :href => dashboard_issues_url(:private_token => @user.private_token), :rel => "alternate", :type => "text/html" | ||
6 | + xml.id dashboard_issues_url(:private_token => @user.private_token) | ||
7 | + xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? | ||
8 | + | ||
9 | + @issues.each do |issue| | ||
10 | + xml.entry do | ||
11 | + xml.id project_issue_url(issue.project, issue) | ||
12 | + xml.link :href => project_issue_url(issue.project, issue) | ||
13 | + xml.title truncate(issue.title, :length => 80) | ||
14 | + xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") | ||
15 | + xml.media :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(issue.author_email) | ||
16 | + xml.author do |author| | ||
17 | + xml.name issue.author_name | ||
18 | + xml.email issue.author_email | ||
19 | + end | ||
20 | + xml.summary issue.title | ||
21 | + end | ||
22 | + end | ||
23 | +end | ||
24 | + |
@@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
1 | +%h3.page_title | ||
2 | + Issues | ||
3 | + %small (assigned to you) | ||
4 | + %small.right #{@issues.total_count} issues | ||
5 | + | ||
6 | +%br | ||
7 | +.clearfix | ||
8 | +- if @issues.any? | ||
9 | + - @issues.group_by(&:project).each do |group| | ||
10 | + %div.ui-box | ||
11 | + - @project = group[0] | ||
12 | + %h5= @project.name | ||
13 | + %ul.unstyled.issues_table | ||
14 | + - group[1].each do |issue| | ||
15 | + = render(partial: 'issues/show', locals: {issue: issue}) | ||
16 | + %hr | ||
17 | + = paginate @issues, theme: "gitlab" | ||
18 | +- else | ||
19 | + %h3.nothing_here_message Nothing to show here |
@@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
1 | +%h3.page_title | ||
2 | + Merge Requests | ||
3 | + %small (authored by or assigned to you) | ||
4 | + %small.right #{@merge_requests.total_count} merge requests | ||
5 | + | ||
6 | +%br | ||
7 | +- if @merge_requests.any? | ||
8 | + - @merge_requests.group_by(&:project).each do |group| | ||
9 | + %ul.unstyled.ui-box | ||
10 | + - @project = group[0] | ||
11 | + %h5= @project.name | ||
12 | + - group[1].each do |merge_request| | ||
13 | + = render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request}) | ||
14 | + %hr | ||
15 | + = paginate @merge_requests, theme: "gitlab" | ||
16 | + | ||
17 | +- else | ||
18 | + %h3.nothing_here_message Nothing to show here |
@@ -0,0 +1,75 @@ | @@ -0,0 +1,75 @@ | ||
1 | += form_tag search_group_path(@group), method: :get, class: 'form-inline' do |f| | ||
2 | + .padded | ||
3 | + = label_tag :search do | ||
4 | + %strong Looking for | ||
5 | + .input | ||
6 | + = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search" | ||
7 | + = submit_tag 'Search', class: "btn primary wide" | ||
8 | +- if params[:search].present? | ||
9 | + %br | ||
10 | + %h3 | ||
11 | + Search results | ||
12 | + %small (#{@projects.count + @merge_requests.count + @issues.count}) | ||
13 | + %hr | ||
14 | + .search_results | ||
15 | + .row | ||
16 | + .span6 | ||
17 | + %table | ||
18 | + %thead | ||
19 | + %tr | ||
20 | + %th Projects | ||
21 | + %tbody | ||
22 | + - @projects.each do |project| | ||
23 | + %tr | ||
24 | + %td | ||
25 | + = link_to project do | ||
26 | + %strong.term= project.name | ||
27 | + %small.cgray | ||
28 | + last activity at | ||
29 | + = project.last_activity_date.stamp("Aug 25, 2011") | ||
30 | + - if @projects.blank? | ||
31 | + %tr | ||
32 | + %td | ||
33 | + %h4.nothing_here_message No Projects | ||
34 | + %br | ||
35 | + %table | ||
36 | + %thead | ||
37 | + %tr | ||
38 | + %th Merge Requests | ||
39 | + %tbody | ||
40 | + - @merge_requests.each do |merge_request| | ||
41 | + %tr | ||
42 | + %td | ||
43 | + = link_to [merge_request.project, merge_request] do | ||
44 | + %span.badge.badge-info ##{merge_request.id} | ||
45 | + – | ||
46 | + %strong.term= truncate merge_request.title, length: 50 | ||
47 | + %strong.right | ||
48 | + %span.label= merge_request.project.name | ||
49 | + - if @merge_requests.blank? | ||
50 | + %tr | ||
51 | + %td | ||
52 | + %h4.nothing_here_message No Merge Requests | ||
53 | + .span6 | ||
54 | + %table | ||
55 | + %thead | ||
56 | + %tr | ||
57 | + %th Issues | ||
58 | + %tbody | ||
59 | + - @issues.each do |issue| | ||
60 | + %tr | ||
61 | + %td | ||
62 | + = link_to [issue.project, issue] do | ||
63 | + %span.badge.badge-info ##{issue.id} | ||
64 | + – | ||
65 | + %strong.term= truncate issue.title, length: 40 | ||
66 | + %strong.right | ||
67 | + %span.label= issue.project.name | ||
68 | + - if @issues.blank? | ||
69 | + %tr | ||
70 | + %td | ||
71 | + %h4.nothing_here_message No Issues | ||
72 | + :javascript | ||
73 | + $(function() { | ||
74 | + $(".search_results .term").highlight("#{params[:search]}"); | ||
75 | + }) |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
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 | + event = EventDecorator.decorate(event) | ||
12 | + xml.entry do | ||
13 | + event_link = event.feed_url | ||
14 | + event_title = event.feed_title | ||
15 | + | ||
16 | + xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" | ||
17 | + xml.link :href => event_link | ||
18 | + xml.title truncate(event_title, :length => 80) | ||
19 | + xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") | ||
20 | + xml.media :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(event.author_email) | ||
21 | + xml.author do |author| | ||
22 | + xml.name event.author_name | ||
23 | + xml.email event.author_email | ||
24 | + end | ||
25 | + xml.summary event_title | ||
26 | + end | ||
27 | + end | ||
28 | + end | ||
29 | +end |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
1 | +- if @projects.any? | ||
2 | + .projects | ||
3 | + .activities.span8 | ||
4 | + = render 'shared/no_ssh' | ||
5 | + - if @events.any? | ||
6 | + .content_list= render @events | ||
7 | + - else | ||
8 | + %h4.nothing_here_message Projects activity will be displayed here | ||
9 | + .loading.hide | ||
10 | + .side | ||
11 | + = render "events/event_last_push", event: @last_push | ||
12 | + = render "projects", projects: @projects | ||
13 | + %div | ||
14 | + %span.rss-icon | ||
15 | + = link_to dashboard_path(:atom, { private_token: current_user.private_token }) do | ||
16 | + = image_tag "rss_ui.png", title: "feed" | ||
17 | + %strong News Feed | ||
18 | + | ||
19 | + %hr | ||
20 | + .gitlab-promo | ||
21 | + = link_to "Homepage", "http://gitlabhq.com" | ||
22 | + = link_to "Blog", "http://blog.gitlabhq.com" | ||
23 | + = link_to "@gitlabhq", "https://twitter.com/gitlabhq" | ||
24 | + | ||
25 | + | ||
26 | +- else | ||
27 | + %h3.nothing_here_message There are no projects you have access to. | ||
28 | + %br | ||
29 | + %h4.nothing_here_message | ||
30 | + - if current_user.can_create_project? | ||
31 | + You can create up to | ||
32 | + = current_user.projects_limit | ||
33 | + projects. Click on button below to add a new one | ||
34 | + .link_holder | ||
35 | + = link_to new_project_path, class: "btn primary" do | ||
36 | + New Project » | ||
37 | + - else | ||
38 | + If you will be added to project - it will be displayed here | ||
39 | + | ||
40 | + | ||
41 | +:javascript | ||
42 | + $(function(){ Pager.init(20); }); |
app/views/layouts/group.html.haml
@@ -3,22 +3,22 @@ | @@ -3,22 +3,22 @@ | ||
3 | = render "layouts/head" | 3 | = render "layouts/head" |
4 | %body{class: "#{app_theme} application"} | 4 | %body{class: "#{app_theme} application"} |
5 | = render "layouts/flash" | 5 | = render "layouts/flash" |
6 | - = render "layouts/head_panel", title: "#{@group.name}:Dashboard" | 6 | + = render "layouts/head_panel", title: "#{@group.name}" |
7 | .container | 7 | .container |
8 | %ul.main_menu | 8 | %ul.main_menu |
9 | - = nav_link(path: 'dashboard#index', html_options: {class: 'home'}) do | ||
10 | - = link_to "Home", root_path, title: "Home" | ||
11 | - = nav_link(path: 'dashboard#issues') do | ||
12 | - = link_to dashboard_issues_path(group: @group) do | 9 | + = nav_link(path: 'groups#show', html_options: {class: 'home'}) do |
10 | + = link_to "Home", group_path(@group), title: "Home" | ||
11 | + = nav_link(path: 'groups#issues') do | ||
12 | + = link_to issues_group_path(@group) do | ||
13 | Issues | 13 | Issues |
14 | %span.count= current_user.assigned_issues.opened.count | 14 | %span.count= current_user.assigned_issues.opened.count |
15 | - = nav_link(path: 'dashboard#merge_requests') do | ||
16 | - = link_to dashboard_merge_requests_path(group: @group) do | 15 | + = nav_link(path: 'groups#merge_requests') do |
16 | + = link_to merge_requests_group_path(@group) do | ||
17 | Merge Requests | 17 | Merge Requests |
18 | %span.count= current_user.cared_merge_requests.count | 18 | %span.count= current_user.cared_merge_requests.count |
19 | - = nav_link(path: 'search#show') do | ||
20 | - = link_to "People", "#" | ||
21 | - = nav_link(path: 'help#index') do | ||
22 | - = link_to "Help", help_path | 19 | + = nav_link(path: 'groups#search') do |
20 | + = link_to "Search", search_group_path(@group) | ||
21 | + = nav_link(path: 'groups#people') do | ||
22 | + = link_to "People", people_group_path(@group) | ||
23 | 23 | ||
24 | .content= yield | 24 | .content= yield |
config/routes.rb
@@ -86,6 +86,19 @@ Gitlab::Application.routes.draw do | @@ -86,6 +86,19 @@ Gitlab::Application.routes.draw do | ||
86 | get "dashboard/issues" => "dashboard#issues" | 86 | get "dashboard/issues" => "dashboard#issues" |
87 | get "dashboard/merge_requests" => "dashboard#merge_requests" | 87 | get "dashboard/merge_requests" => "dashboard#merge_requests" |
88 | 88 | ||
89 | + | ||
90 | + # | ||
91 | + # Groups Area | ||
92 | + # | ||
93 | + resources :groups, constraints: { id: /[^\/]+/ }, only: [:show] do | ||
94 | + member do | ||
95 | + get :issues | ||
96 | + get :merge_requests | ||
97 | + get :search | ||
98 | + get :people | ||
99 | + end | ||
100 | + end | ||
101 | + | ||
89 | resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create] | 102 | resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create] |
90 | 103 | ||
91 | devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks } | 104 | devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks } |