Merge pull request #2787 from gitlabhq/features/projects_page
Feature: Projects page
This commit is contained in:
commit
e3c3c67b25
17 changed files with 129 additions and 49 deletions
|
@ -1,26 +1,15 @@
|
||||||
class DashboardController < ApplicationController
|
class DashboardController < ApplicationController
|
||||||
respond_to :html
|
respond_to :html
|
||||||
|
|
||||||
before_filter :projects
|
before_filter :load_projects
|
||||||
before_filter :event_filter, only: :index
|
before_filter :event_filter, only: :show
|
||||||
|
|
||||||
def index
|
def show
|
||||||
@groups = current_user.authorized_groups
|
@groups = current_user.authorized_groups
|
||||||
|
|
||||||
@has_authorized_projects = @projects.count > 0
|
@has_authorized_projects = @projects.count > 0
|
||||||
|
|
||||||
@projects = case params[:scope]
|
|
||||||
when 'personal' then
|
|
||||||
@projects.personal(current_user)
|
|
||||||
when 'joined' then
|
|
||||||
@projects.joined(current_user)
|
|
||||||
else
|
|
||||||
@projects
|
|
||||||
end
|
|
||||||
|
|
||||||
@teams = current_user.authorized_teams
|
@teams = current_user.authorized_teams
|
||||||
|
@projects_count = @projects.count
|
||||||
@projects = @projects.page(params[:page]).per(30)
|
@projects = @projects.limit(20)
|
||||||
|
|
||||||
@events = Event.in_projects(current_user.authorized_projects.pluck(:id))
|
@events = Event.in_projects(current_user.authorized_projects.pluck(:id))
|
||||||
@events = @event_filter.apply_filter(@events)
|
@events = @event_filter.apply_filter(@events)
|
||||||
|
@ -35,6 +24,19 @@ class DashboardController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def projects
|
||||||
|
@projects = case params[:scope]
|
||||||
|
when 'personal' then
|
||||||
|
@projects.personal(current_user)
|
||||||
|
when 'joined' then
|
||||||
|
@projects.joined(current_user)
|
||||||
|
else
|
||||||
|
@projects
|
||||||
|
end
|
||||||
|
|
||||||
|
@projects = @projects.page(params[:page]).per(30)
|
||||||
|
end
|
||||||
|
|
||||||
# Get authored or assigned open merge requests
|
# Get authored or assigned open merge requests
|
||||||
def merge_requests
|
def merge_requests
|
||||||
@merge_requests = current_user.cared_merge_requests
|
@merge_requests = current_user.cared_merge_requests
|
||||||
|
@ -57,7 +59,7 @@ class DashboardController < ApplicationController
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def projects
|
def load_projects
|
||||||
@projects = current_user.authorized_projects.sorted_by_activity
|
@projects = current_user.authorized_projects.sorted_by_activity
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,9 @@ module DashboardHelper
|
||||||
|
|
||||||
case entity
|
case entity
|
||||||
when 'issue' then
|
when 'issue' then
|
||||||
dashboard_issues_path(options)
|
issues_dashboard_path(options)
|
||||||
when 'merge_request'
|
when 'merge_request'
|
||||||
dashboard_merge_requests_path(options)
|
merge_requests_dashboard_path(options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,9 @@ module ProjectsHelper
|
||||||
|
|
||||||
def project_title project
|
def project_title project
|
||||||
if project.group
|
if project.group
|
||||||
project.name_with_namespace
|
content_tag :span do
|
||||||
|
link_to(project.group.name, group_path(project.group)) + " / " + project.name
|
||||||
|
end
|
||||||
else
|
else
|
||||||
project.name
|
project.name
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,19 +2,12 @@
|
||||||
%h5.title
|
%h5.title
|
||||||
Projects
|
Projects
|
||||||
%small
|
%small
|
||||||
(#{projects.total_count})
|
(#{@projects_count})
|
||||||
- if current_user.can_create_project?
|
- if current_user.can_create_project?
|
||||||
%span.right
|
%span.right
|
||||||
= link_to new_project_path, class: "btn very_small info" do
|
= link_to new_project_path, class: "btn very_small info" do
|
||||||
%i.icon-plus
|
%i.icon-plus
|
||||||
New Project
|
New Project
|
||||||
%ul.nav.nav-projects-tabs
|
|
||||||
= nav_tab :scope, nil do
|
|
||||||
= link_to "All", dashboard_path
|
|
||||||
= nav_tab :scope, 'personal' do
|
|
||||||
= link_to "Personal", dashboard_path(scope: 'personal')
|
|
||||||
= nav_tab :scope, 'joined' do
|
|
||||||
= link_to "Joined", dashboard_path(scope: 'joined')
|
|
||||||
|
|
||||||
%ul.well-list
|
%ul.well-list
|
||||||
- projects.each do |project|
|
- projects.each do |project|
|
||||||
|
@ -33,4 +26,6 @@
|
||||||
- if projects.blank?
|
- if projects.blank?
|
||||||
%li
|
%li
|
||||||
%h3.nothing_here_message There are no projects here.
|
%h3.nothing_here_message There are no projects here.
|
||||||
.bottom= paginate projects, theme: "gitlab"
|
- if @projects_count > 20
|
||||||
|
%li.bottom
|
||||||
|
%strong= link_to "show all projects", projects_dashboard_path
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
xml.instruct!
|
xml.instruct!
|
||||||
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
|
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
|
||||||
xml.title "#{current_user.name} issues"
|
xml.title "#{current_user.name} issues"
|
||||||
xml.link :href => dashboard_issues_url(:atom, :private_token => current_user.private_token), :rel => "self", :type => "application/atom+xml"
|
xml.link :href => issues_dashboard_url(:atom, :private_token => current_user.private_token), :rel => "self", :type => "application/atom+xml"
|
||||||
xml.link :href => dashboard_issues_url(:private_token => current_user.private_token), :rel => "alternate", :type => "text/html"
|
xml.link :href => issues_dashboard_url(:private_token => current_user.private_token), :rel => "alternate", :type => "text/html"
|
||||||
xml.id dashboard_issues_url(:private_token => current_user.private_token)
|
xml.id issues_dashboard_url(:private_token => current_user.private_token)
|
||||||
xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any?
|
xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any?
|
||||||
|
|
||||||
@issues.each do |issue|
|
@issues.each do |issue|
|
||||||
|
|
56
app/views/dashboard/projects.html.haml
Normal file
56
app/views/dashboard/projects.html.haml
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
%h3.page_title
|
||||||
|
Projects
|
||||||
|
%span
|
||||||
|
(#{@projects.total_count})
|
||||||
|
- if current_user.can_create_project?
|
||||||
|
%span.right
|
||||||
|
= link_to new_project_path, class: "btn very_small info" do
|
||||||
|
%i.icon-plus
|
||||||
|
New Project
|
||||||
|
|
||||||
|
|
||||||
|
%hr
|
||||||
|
.row
|
||||||
|
.span3
|
||||||
|
%ul.nav.nav-pills.nav-stacked
|
||||||
|
= nav_tab :scope, nil do
|
||||||
|
= link_to "All", projects_dashboard_path
|
||||||
|
= nav_tab :scope, 'personal' do
|
||||||
|
= link_to "Personal", projects_dashboard_path(scope: 'personal')
|
||||||
|
= nav_tab :scope, 'joined' do
|
||||||
|
= link_to "Joined", projects_dashboard_path(scope: 'joined')
|
||||||
|
|
||||||
|
.span9
|
||||||
|
= form_tag projects_dashboard_path, method: 'get' do
|
||||||
|
%fieldset.dashboard-search-filter
|
||||||
|
= hidden_field_tag "scope", params[:scope]
|
||||||
|
= search_field_tag "search", params[:search], { placeholder: 'Search', class: 'left input-xxlarge' }
|
||||||
|
= button_tag type: 'submit', class: 'btn' do
|
||||||
|
%i.icon-search
|
||||||
|
|
||||||
|
%ul.well-list
|
||||||
|
- @projects.each do |project|
|
||||||
|
%li.clearfix
|
||||||
|
.left
|
||||||
|
= link_to project_path(project), class: dom_class(project) do
|
||||||
|
- if project.namespace
|
||||||
|
= project.namespace.human_name
|
||||||
|
\/
|
||||||
|
%strong.well-title
|
||||||
|
= truncate(project.name, length: 25)
|
||||||
|
%br
|
||||||
|
%small.light
|
||||||
|
%strong Last activity:
|
||||||
|
%span= project_last_activity(project)
|
||||||
|
.right.light
|
||||||
|
- if project.owner == current_user
|
||||||
|
%i.icon-wrench
|
||||||
|
- tm = project.team.get_tm(current_user.id)
|
||||||
|
- if tm
|
||||||
|
= tm.project_access_human
|
||||||
|
|
||||||
|
- if @projects.blank?
|
||||||
|
%li
|
||||||
|
%h3.nothing_here_message There are no projects here.
|
||||||
|
.bottom= paginate @projects, theme: "gitlab"
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
xml.instruct!
|
xml.instruct!
|
||||||
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
|
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
|
||||||
xml.title "#{@user.name} issues"
|
xml.title "#{@user.name} issues"
|
||||||
xml.link :href => dashboard_issues_url(:atom, :private_token => @user.private_token), :rel => "self", :type => "application/atom+xml"
|
xml.link :href => issues_dashboard_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.link :href => issues_dashboard_url(:private_token => @user.private_token), :rel => "alternate", :type => "text/html"
|
||||||
xml.id dashboard_issues_url(:private_token => @user.private_token)
|
xml.id issues_dashboard_url(:private_token => @user.private_token)
|
||||||
xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any?
|
xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any?
|
||||||
|
|
||||||
@issues.each do |issue|
|
@issues.each do |issue|
|
||||||
|
|
|
@ -6,14 +6,17 @@
|
||||||
= render "layouts/head_panel", title: "Dashboard"
|
= render "layouts/head_panel", title: "Dashboard"
|
||||||
.container
|
.container
|
||||||
%ul.main_menu
|
%ul.main_menu
|
||||||
= nav_link(path: 'dashboard#index', html_options: {class: 'home'}) do
|
= nav_link(path: 'dashboard#show', html_options: {class: 'home'}) do
|
||||||
= link_to "Home", root_path, title: "Home"
|
= link_to "Home", root_path, title: "Home"
|
||||||
|
= nav_link(path: 'dashboard#projects') do
|
||||||
|
= link_to projects_dashboard_path do
|
||||||
|
Projects
|
||||||
= nav_link(path: 'dashboard#issues') do
|
= nav_link(path: 'dashboard#issues') do
|
||||||
= link_to dashboard_issues_path do
|
= link_to issues_dashboard_path do
|
||||||
Issues
|
Issues
|
||||||
%span.count= current_user.assigned_issues.opened.count
|
%span.count= current_user.assigned_issues.opened.count
|
||||||
= nav_link(path: 'dashboard#merge_requests') do
|
= nav_link(path: 'dashboard#merge_requests') do
|
||||||
= link_to dashboard_merge_requests_path do
|
= link_to merge_requests_dashboard_path do
|
||||||
Merge Requests
|
Merge Requests
|
||||||
%span.count= current_user.cared_merge_requests.opened.count
|
%span.count= current_user.cared_merge_requests.opened.count
|
||||||
= nav_link(path: 'search#show') do
|
= nav_link(path: 'search#show') do
|
||||||
|
|
|
@ -118,9 +118,13 @@ Gitlab::Application.routes.draw do
|
||||||
#
|
#
|
||||||
# Dashboard Area
|
# Dashboard Area
|
||||||
#
|
#
|
||||||
get "dashboard" => "dashboard#index"
|
resource :dashboard, controller: "dashboard" do
|
||||||
get "dashboard/issues" => "dashboard#issues"
|
member do
|
||||||
get "dashboard/merge_requests" => "dashboard#merge_requests"
|
get :projects
|
||||||
|
get :issues
|
||||||
|
get :merge_requests
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# Groups Area
|
# Groups Area
|
||||||
|
@ -284,5 +288,5 @@ Gitlab::Application.routes.draw do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
root to: "dashboard#index"
|
root to: "dashboard#show"
|
||||||
end
|
end
|
||||||
|
|
8
features/dashboard/projects.feature
Normal file
8
features/dashboard/projects.feature
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
Feature: Dashboard
|
||||||
|
Background:
|
||||||
|
Given I sign in as a user
|
||||||
|
And I own project "Shop"
|
||||||
|
And I visit dashboard projects page
|
||||||
|
|
||||||
|
Scenario: I should see issues list
|
||||||
|
Then I should see projects list
|
|
@ -63,6 +63,12 @@ class Dashboard < Spinach::FeatureSteps
|
||||||
@project.team << [current_user, :master]
|
@project.team << [current_user, :master]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Then 'I should see projects list' do
|
||||||
|
@user.authorized_projects.all.each do |project|
|
||||||
|
page.should have_link project.name_with_namespace
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Then 'I should see groups list' do
|
Then 'I should see groups list' do
|
||||||
Group.all.each do |group|
|
Group.all.each do |group|
|
||||||
page.should have_link group.name
|
page.should have_link group.name
|
||||||
|
|
|
@ -33,12 +33,16 @@ module SharedPaths
|
||||||
visit dashboard_path
|
visit dashboard_path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Given 'I visit dashboard projects page' do
|
||||||
|
visit projects_dashboard_path
|
||||||
|
end
|
||||||
|
|
||||||
Given 'I visit dashboard issues page' do
|
Given 'I visit dashboard issues page' do
|
||||||
visit dashboard_issues_path
|
visit issues_dashboard_path
|
||||||
end
|
end
|
||||||
|
|
||||||
Given 'I visit dashboard merge requests page' do
|
Given 'I visit dashboard merge requests page' do
|
||||||
visit dashboard_merge_requests_path
|
visit merge_requests_dashboard_path
|
||||||
end
|
end
|
||||||
|
|
||||||
Given 'I visit dashboard search page' do
|
Given 'I visit dashboard search page' do
|
||||||
|
|
|
@ -10,7 +10,7 @@ describe "Dashboard Issues Feed" do
|
||||||
|
|
||||||
describe "atom feed" do
|
describe "atom feed" do
|
||||||
it "should render atom feed via private token" do
|
it "should render atom feed via private token" do
|
||||||
visit dashboard_issues_path(:atom, private_token: user.private_token)
|
visit issues_dashboard_path(:atom, private_token: user.private_token)
|
||||||
|
|
||||||
page.response_headers['Content-Type'].should have_content("application/atom+xml")
|
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("title", text: "#{user.name} issues")
|
||||||
|
|
|
@ -146,14 +146,14 @@ describe KeysController, "routing" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# dashboard GET /dashboard(.:format) dashboard#index
|
# dashboard GET /dashboard(.:format) dashboard#show
|
||||||
# dashboard_issues GET /dashboard/issues(.:format) dashboard#issues
|
# dashboard_issues GET /dashboard/issues(.:format) dashboard#issues
|
||||||
# dashboard_merge_requests GET /dashboard/merge_requests(.:format) dashboard#merge_requests
|
# dashboard_merge_requests GET /dashboard/merge_requests(.:format) dashboard#merge_requests
|
||||||
# root / dashboard#index
|
# root / dashboard#show
|
||||||
describe DashboardController, "routing" do
|
describe DashboardController, "routing" do
|
||||||
it "to #index" do
|
it "to #index" do
|
||||||
get("/dashboard").should route_to('dashboard#index')
|
get("/dashboard").should route_to('dashboard#show')
|
||||||
get("/").should route_to('dashboard#index')
|
get("/").should route_to('dashboard#show')
|
||||||
end
|
end
|
||||||
|
|
||||||
it "to #issues" do
|
it "to #issues" do
|
||||||
|
|
Loading…
Reference in a new issue