dashboard v1
This commit is contained in:
parent
4107f2cc2e
commit
cd779e56e1
|
@ -1,6 +1,37 @@
|
|||
class DashboardController < ApplicationController
|
||||
respond_to :js, :html
|
||||
|
||||
def index
|
||||
@projects = current_user.projects.all
|
||||
@active_projects = @projects.select(&:last_activity_date).sort_by(&:last_activity_date).reverse
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.js { no_cache_headers }
|
||||
end
|
||||
end
|
||||
|
||||
def merge_requests
|
||||
@projects = current_user.projects.all
|
||||
@merge_requests = current_user.assigned_merge_requests.order("created_at DESC").limit(40)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.js { no_cache_headers }
|
||||
end
|
||||
end
|
||||
|
||||
def issues
|
||||
@projects = current_user.projects.all
|
||||
@user = current_user
|
||||
@issues = current_user.assigned_issues.opened.order("created_at DESC").limit(40)
|
||||
|
||||
@issues = @issues.includes(:author, :project)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.js { no_cache_headers }
|
||||
format.atom { render :layout => false }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
class UserIssuesController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
respond_to :js, :html
|
||||
|
||||
def index
|
||||
@projects = current_user.projects.all
|
||||
@user = current_user
|
||||
@issues = current_user.assigned_issues.opened
|
||||
|
||||
@issues = @issues.includes(:author, :project)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.js
|
||||
format.atom { render :layout => false }
|
||||
end
|
||||
end
|
||||
|
||||
end
|
|
@ -1,8 +0,0 @@
|
|||
class UserMergeRequestsController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
def index
|
||||
@projects = current_user.projects.all
|
||||
@merge_requests = current_user.assigned_merge_requests
|
||||
end
|
||||
end
|
|
@ -1,28 +1,31 @@
|
|||
#news-feed.news-feed
|
||||
%div
|
||||
= link_to dashboard_path, :class => "left" do
|
||||
.box-arrow
|
||||
←
|
||||
%h2{:style => "width:86%; text-align:center"}
|
||||
Issues
|
||||
= link_to merge_requests_path, :class => "right" do
|
||||
.box-arrow
|
||||
→
|
||||
%div
|
||||
= link_to dashboard_path, :remote => true, :class => "left" do
|
||||
.box-arrow
|
||||
←
|
||||
%h2{:style => "width:86%; text-align:center"}
|
||||
Issues
|
||||
= link_to dashboard_merge_requests_path, :remote => true, :class => "right" do
|
||||
.box-arrow
|
||||
→
|
||||
|
||||
|
||||
#feeds_content_holder
|
||||
.project-box.project-updates.ui-box.ui-box-small.ui-box-big
|
||||
.data
|
||||
- @issues.each do |update|
|
||||
%a.project-update{:href => dashboard_feed_path(update.project, update)}
|
||||
= image_tag gravatar_icon(update.author_email), :class => "left", :width => 40
|
||||
%span.update-title
|
||||
= dashboard_feed_title(update)
|
||||
= truncate update.title, :length => 50
|
||||
.right= update.project.name
|
||||
%span.update-author
|
||||
%strong= update.author_name
|
||||
authored
|
||||
= time_ago_in_words(update.created_at)
|
||||
ago
|
||||
.right
|
||||
- klass = update.class.to_s.split("::").last.downcase
|
||||
%span.tag{ :class => klass }= klass
|
||||
- if update.critical
|
||||
%span.tag.high critical
|
||||
- if update.today?
|
||||
%span.tag.today today
|
||||
|
||||
|
|
|
@ -1,27 +1,28 @@
|
|||
#news-feed.news-feed
|
||||
%div
|
||||
= link_to issues_path, :class => "left" do
|
||||
.box-arrow
|
||||
←
|
||||
%h2{:style => "width:86%; text-align:center"}
|
||||
Merge Requests
|
||||
= link_to dashboard_path, :class => "right" do
|
||||
.box-arrow
|
||||
→
|
||||
%div
|
||||
= link_to dashboard_issues_path, :remote => true, :class => "left" do
|
||||
.box-arrow
|
||||
←
|
||||
%h2{:style => "width:86%; text-align:center"}
|
||||
Merge Requests
|
||||
= link_to dashboard_path, :remote => true, :class => "right" do
|
||||
.box-arrow
|
||||
→
|
||||
|
||||
#feeds_content_holder
|
||||
.project-box.project-updates.ui-box.ui-box-small.ui-box-big
|
||||
.data
|
||||
- @merge_requests.each do |update|
|
||||
%a.project-update{:href => dashboard_feed_path(update.project, update)}
|
||||
%a.project-update{:href => project_merge_request_path(update.project, update)}
|
||||
= image_tag gravatar_icon(update.author_email), :class => "left", :width => 40
|
||||
%span.update-title
|
||||
= dashboard_feed_title(update)
|
||||
= truncate update.title, :length => 70
|
||||
.right= update.project.name
|
||||
%span.update-author
|
||||
%strong= update.author_name
|
||||
authored
|
||||
= time_ago_in_words(update.created_at)
|
||||
ago
|
||||
.right
|
||||
- klass = update.class.to_s.split("::").last.downcase
|
||||
%span.tag{ :class => klass }= klass
|
||||
|
||||
%span.tag.commit= update.source_branch
|
||||
→
|
||||
%span.tag.commit= update.target_branch
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
#news-feed.news-feed
|
||||
%div
|
||||
= link_to merge_requests_path, :class => "left" do
|
||||
.box-arrow
|
||||
←
|
||||
%h2{:style => "width:86%; text-align:center"}
|
||||
Activities
|
||||
= link_to issues_path, :class => "right" do
|
||||
.box-arrow
|
||||
→
|
||||
%div
|
||||
= link_to dashboard_merge_requests_path, :remote => true, :class => "left", :id => "merge_requests_slide" do
|
||||
.box-arrow
|
||||
←
|
||||
%h2{:style => "width:86%; text-align:center"}
|
||||
Activities
|
||||
= link_to dashboard_issues_path, :remote => true, :class => "right", :id => "issues_slide" do
|
||||
.box-arrow
|
||||
→
|
||||
|
||||
#feeds_content_holder
|
||||
- @active_projects.first(3).each do |project|
|
||||
.project-box.project-updates.ui-box.ui-box-small.ui-box-big
|
||||
= link_to project, do
|
||||
|
|
15
app/views/dashboard/_sidebar.html.haml
Normal file
15
app/views/dashboard/_sidebar.html.haml
Normal file
|
@ -0,0 +1,15 @@
|
|||
%aside
|
||||
%h4
|
||||
- if current_user.can_create_project?
|
||||
%a.button-small.button-green{:href => new_project_path} New Project
|
||||
Your Projects
|
||||
%ol.project-list
|
||||
- @projects.each do |project|
|
||||
%li
|
||||
%a{:href => project_path(project)}
|
||||
%span.arrow →
|
||||
%span.project-name= project.name
|
||||
%span.time
|
||||
%strong Last activity:
|
||||
= project.last_activity_date ? time_ago_in_words(project.last_activity_date) + " ago" : "Never"
|
||||
|
|
@ -1,18 +1,5 @@
|
|||
- content_for(:body_class, "dashboard-page")
|
||||
|
||||
#dashboard-content.dashboard-content.content
|
||||
%aside
|
||||
%h4
|
||||
- if current_user.can_create_project?
|
||||
%a.button-small.button-green{:href => new_project_path} New Project
|
||||
Your Projects
|
||||
%ol.project-list
|
||||
- @projects.each do |project|
|
||||
%li
|
||||
%a{:href => project_path(project)}
|
||||
%span.arrow →
|
||||
%span.project-name= project.name
|
||||
%span.time
|
||||
%strong Last activity:
|
||||
= project.last_activity_date ? time_ago_in_words(project.last_activity_date) + " ago" : "Never"
|
||||
= render "dashboard/projects_feed"
|
||||
= render "dashboard/sidebar"
|
||||
#news-feed.news-feed= render "dashboard/projects_feed"
|
||||
|
|
7
app/views/dashboard/index.js.haml
Normal file
7
app/views/dashboard/index.js.haml
Normal file
|
@ -0,0 +1,7 @@
|
|||
:plain
|
||||
$("#feeds_content_holder").hide("slide", { direction: "left" }, 150, function(){
|
||||
$("#news-feed").html("#{escape_javascript(render(:partial => "projects_feed"))}");
|
||||
$("#feeds_content_holder").show("slide", { direction: "right" }, 150);
|
||||
history.pushState({ path: this.path }, '', '#{dashboard_path}')
|
||||
});
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
xml.instruct!
|
||||
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
|
||||
xml.title "#{@user.name} issues"
|
||||
xml.link :href => issues_url(:atom, :private_token => @user.private_token), :rel => "self", :type => "application/atom+xml"
|
||||
xml.link :href => issues_url(:private_token => @user.private_token), :rel => "alternate", :type => "text/html"
|
||||
xml.id issues_url(:private_token => @user.private_token)
|
||||
xml.link :href => dashboard_issues_url(:atom, :private_token => @user.private_token), :rel => "self", :type => "application/atom+xml"
|
||||
xml.link :href => dashboard_issues_url(:private_token => @user.private_token), :rel => "alternate", :type => "text/html"
|
||||
xml.id dashboard_issues_url(:private_token => @user.private_token)
|
||||
xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any?
|
||||
|
||||
@issues.each do |issue|
|
5
app/views/dashboard/issues.html.haml
Normal file
5
app/views/dashboard/issues.html.haml
Normal file
|
@ -0,0 +1,5 @@
|
|||
- content_for(:body_class, "dashboard-page")
|
||||
|
||||
#dashboard-content.dashboard-content.content
|
||||
= render "dashboard/sidebar"
|
||||
#news-feed.news-feed= render "dashboard/issues_feed"
|
7
app/views/dashboard/issues.js.haml
Normal file
7
app/views/dashboard/issues.js.haml
Normal file
|
@ -0,0 +1,7 @@
|
|||
:plain
|
||||
$("#feeds_content_holder").hide("slide", { direction: "left" }, 150, function(){
|
||||
$("#news-feed").html("#{escape_javascript(render(:partial => "issues_feed"))}");
|
||||
$("#feeds_content_holder").show("slide", { direction: "right" }, 150);
|
||||
history.pushState({ path: this.path }, '', '#{dashboard_issues_path}')
|
||||
});
|
||||
|
5
app/views/dashboard/merge_requests.html.haml
Normal file
5
app/views/dashboard/merge_requests.html.haml
Normal file
|
@ -0,0 +1,5 @@
|
|||
- content_for(:body_class, "dashboard-page")
|
||||
|
||||
#dashboard-content.dashboard-content.content
|
||||
= render "dashboard/sidebar"
|
||||
#news-feed.news-feed= render "dashboard/merge_requests_feed"
|
7
app/views/dashboard/merge_requests.js.haml
Normal file
7
app/views/dashboard/merge_requests.js.haml
Normal file
|
@ -0,0 +1,7 @@
|
|||
:plain
|
||||
$("#feeds_content_holder").hide("slide", { direction: "left" }, 150, function(){
|
||||
$("#news-feed").html("#{escape_javascript(render(:partial => "merge_requests_feed"))}");
|
||||
$("#feeds_content_holder").show("slide", { direction: "right" }, 150);
|
||||
history.pushState({ path: this.path }, '', '#{dashboard_merge_requests_path}')
|
||||
});
|
||||
|
|
@ -3,9 +3,6 @@
|
|||
%span.update-title
|
||||
= merge_request.title
|
||||
%span.update-author
|
||||
- if not @project.present?
|
||||
%strong= merge_request.project.name
|
||||
= '-'
|
||||
%strong= merge_request.author_name
|
||||
authored
|
||||
= time_ago_in_words(merge_request.created_at)
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
- content_for(:body_class, "dashboard-page")
|
||||
|
||||
#dashboard-content.dashboard-content.content
|
||||
%aside
|
||||
%h4
|
||||
- if current_user.can_create_project?
|
||||
%a.button-small.button-green{:href => new_project_path} New Project
|
||||
Your Projects
|
||||
%ol.project-list
|
||||
- @projects.each do |project|
|
||||
%li
|
||||
%a{:href => project_path(project)}
|
||||
%span.arrow →
|
||||
%span.project-name= project.name
|
||||
%span.time
|
||||
%strong Last activity:
|
||||
= project.last_activity_date ? time_ago_in_words(project.last_activity_date) + " ago" : "Never"
|
||||
= render "dashboard/issues_feed"
|
|
@ -1,18 +0,0 @@
|
|||
- content_for(:body_class, "dashboard-page")
|
||||
|
||||
#dashboard-content.dashboard-content.content
|
||||
%aside
|
||||
%h4
|
||||
- if current_user.can_create_project?
|
||||
%a.button-small.button-green{:href => new_project_path} New Project
|
||||
Your Projects
|
||||
%ol.project-list
|
||||
- @projects.each do |project|
|
||||
%li
|
||||
%a{:href => project_path(project)}
|
||||
%span.arrow →
|
||||
%span.project-name= project.name
|
||||
%span.time
|
||||
%strong Last activity:
|
||||
= project.last_activity_date ? time_ago_in_words(project.last_activity_date) + " ago" : "Never"
|
||||
= render "dashboard/merge_requests_feed"
|
|
@ -1,6 +1,5 @@
|
|||
Gitlab::Application.routes.draw do
|
||||
|
||||
get "user_issues/index"
|
||||
|
||||
get 'tags'=> 'tags#index'
|
||||
get 'tags/:tag' => 'projects#index'
|
||||
|
@ -22,9 +21,10 @@ Gitlab::Application.routes.draw do
|
|||
put "profile/reset_private_token", :to => "profile#reset_private_token"
|
||||
put "profile/edit", :to => "profile#social_update"
|
||||
get "profile", :to => "profile#show"
|
||||
|
||||
get "dashboard", :to => "dashboard#index"
|
||||
get "issues", :to => "user_issues#index", :as => "issues"
|
||||
get "merge_requests", :to => "user_merge_requests#index", :as => "merge_requests"
|
||||
get "dashboard/issues", :to => "dashboard#issues"
|
||||
get "dashboard/merge_requests", :to => "dashboard#merge_requests"
|
||||
|
||||
#get "profile/:id", :to => "profile#show"
|
||||
|
||||
|
|
58
spec/requests/dashboard_issues_spec.rb
Normal file
58
spec/requests/dashboard_issues_spec.rb
Normal file
|
@ -0,0 +1,58 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe "User Issues Dashboard", :js => true do
|
||||
describe "GET /issues" do
|
||||
before do
|
||||
|
||||
login_as :user
|
||||
|
||||
@project1 = Factory :project,
|
||||
:path => "project1",
|
||||
:code => "TEST1"
|
||||
|
||||
@project2 = Factory :project,
|
||||
:path => "project2",
|
||||
:code => "TEST2"
|
||||
|
||||
@project1.add_access(@user, :read, :write)
|
||||
@project2.add_access(@user, :read, :write)
|
||||
|
||||
@issue1 = Factory :issue,
|
||||
:author => @user,
|
||||
:assignee => @user,
|
||||
:project => @project1
|
||||
|
||||
@issue2 = Factory :issue,
|
||||
:author => @user,
|
||||
:assignee => @user,
|
||||
:project => @project2
|
||||
|
||||
visit dashboard_path
|
||||
click_link "issues_slide"
|
||||
end
|
||||
|
||||
subject { page }
|
||||
|
||||
it { should have_content(@issue1.title[0..10]) }
|
||||
it { should have_content(@issue1.project.name) }
|
||||
it { should have_content(@issue1.assignee.name) }
|
||||
|
||||
it { should have_content(@issue2.title[0..10]) }
|
||||
it { should have_content(@issue2.project.name) }
|
||||
it { should have_content(@issue2.assignee.name) }
|
||||
|
||||
describe "atom feed", :js => false do
|
||||
it "should render atom feed via private token" do
|
||||
logout
|
||||
visit dashboard_issues_path(:atom, :private_token => @user.private_token)
|
||||
|
||||
page.response_headers['Content-Type'].should have_content("application/atom+xml")
|
||||
page.body.should have_selector("title", :text => "#{@user.name} issues")
|
||||
page.body.should have_selector("author email", :text => @issue1.author_email)
|
||||
page.body.should have_selector("entry summary", :text => @issue1.title)
|
||||
page.body.should have_selector("author email", :text => @issue2.author_email)
|
||||
page.body.should have_selector("entry summary", :text => @issue2.title)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,6 +1,6 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe "User MergeRequests" do
|
||||
describe "User MergeRequests", :js => true do
|
||||
describe "GET /issues" do
|
||||
before do
|
||||
|
||||
|
@ -27,7 +27,8 @@ describe "User MergeRequests" do
|
|||
:assignee => @user,
|
||||
:project => @project2
|
||||
|
||||
visit merge_requests_path
|
||||
visit dashboard_path
|
||||
click_link "merge_requests_slide"
|
||||
end
|
||||
|
||||
subject { page }
|
|
@ -23,7 +23,7 @@ describe "Issues" do
|
|||
|
||||
subject { page }
|
||||
|
||||
it { should have_content(@issue.title) }
|
||||
it { should have_content(@issue.title[0..20]) }
|
||||
it { should have_content(@issue.project.name) }
|
||||
it { should have_content(@issue.assignee.name) }
|
||||
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe "User Issues Dashboard" do
|
||||
describe "GET /issues" do
|
||||
before do
|
||||
|
||||
login_as :user
|
||||
|
||||
@project1 = Factory :project,
|
||||
:path => "project1",
|
||||
:code => "TEST1"
|
||||
|
||||
@project2 = Factory :project,
|
||||
:path => "project2",
|
||||
:code => "TEST2"
|
||||
|
||||
@project1.add_access(@user, :read, :write)
|
||||
@project2.add_access(@user, :read, :write)
|
||||
|
||||
@issue1 = Factory :issue,
|
||||
:author => @user,
|
||||
:assignee => @user,
|
||||
:project => @project1
|
||||
|
||||
@issue2 = Factory :issue,
|
||||
:author => @user,
|
||||
:assignee => @user,
|
||||
:project => @project2
|
||||
|
||||
visit issues_path
|
||||
end
|
||||
|
||||
subject { page }
|
||||
|
||||
it { should have_content(@issue1.title) }
|
||||
it { should have_content(@issue1.project.name) }
|
||||
it { should have_content(@issue1.assignee.name) }
|
||||
|
||||
it { should have_content(@issue2.title) }
|
||||
it { should have_content(@issue2.project.name) }
|
||||
it { should have_content(@issue2.assignee.name) }
|
||||
|
||||
it "should render atom feed via private token" do
|
||||
logout
|
||||
visit issues_path(:atom, :private_token => @user.private_token)
|
||||
|
||||
page.response_headers['Content-Type'].should have_content("application/atom+xml")
|
||||
page.body.should have_selector("title", :text => "#{@user.name} issues")
|
||||
page.body.should have_selector("author email", :text => @issue1.author_email)
|
||||
page.body.should have_selector("entry summary", :text => @issue1.title)
|
||||
page.body.should have_selector("author email", :text => @issue2.author_email)
|
||||
page.body.should have_selector("entry summary", :text => @issue2.title)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue