Added public groups area to enhance searching and exploring of projects
fixed whitespaces and quotes fixed whitespaces fixed devise.html.haml fixed method parenthesis in app/models/group.rb removed links from header removed links from devise.html added tests
This commit is contained in:
parent
f3b0cb77fc
commit
1da2262efd
8 changed files with 149 additions and 0 deletions
14
app/controllers/public/groups_controller.rb
Normal file
14
app/controllers/public/groups_controller.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
class Public::GroupsController < ApplicationController
|
||||||
|
skip_before_filter :authenticate_user!,
|
||||||
|
:reject_blocked, :set_current_user_for_observers,
|
||||||
|
:add_abilities
|
||||||
|
|
||||||
|
layout "public_groups"
|
||||||
|
|
||||||
|
def index
|
||||||
|
@groups = GroupsFinder.new.execute(current_user)
|
||||||
|
@groups = @groups.search(params[:search]) if params[:search].present?
|
||||||
|
@groups = @groups.sort(@sort = params[:sort])
|
||||||
|
@groups = @groups.page(params[:page]).per(20)
|
||||||
|
end
|
||||||
|
end
|
|
@ -73,4 +73,20 @@ class Group < Namespace
|
||||||
def public_profile?
|
def public_profile?
|
||||||
projects.public_only.any?
|
projects.public_only.any?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def search(query)
|
||||||
|
where("LOWER(namespaces.name) LIKE :query", query: "%#{query.downcase}%")
|
||||||
|
end
|
||||||
|
|
||||||
|
def sort(method)
|
||||||
|
case method.to_s
|
||||||
|
when "newest" then reorder("namespaces.created_at DESC")
|
||||||
|
when "oldest" then reorder("namespaces.created_at ASC")
|
||||||
|
when "recently_updated" then reorder("namespaces.updated_at DESC")
|
||||||
|
when "last_updated" then reorder("namespaces.updated_at ASC")
|
||||||
|
else reorder("namespaces.path, namespaces.name ASC")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
11
app/views/layouts/public_groups.html.haml
Normal file
11
app/views/layouts/public_groups.html.haml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
!!! 5
|
||||||
|
%html{ lang: "en"}
|
||||||
|
= render "layouts/head", title: "Public Groups"
|
||||||
|
%body{class: "#{app_theme} application", :'data-page' => body_data_page}
|
||||||
|
= render "layouts/broadcast"
|
||||||
|
- if current_user
|
||||||
|
= render "layouts/head_panel", title: "Public Groups"
|
||||||
|
- else
|
||||||
|
= render "layouts/public_head_panel", title: "Public Groups"
|
||||||
|
.container.navless-container
|
||||||
|
.content= yield
|
59
app/views/public/groups/index.html.haml
Normal file
59
app/views/public/groups/index.html.haml
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
%h3.page-title
|
||||||
|
Groups (#{@groups.total_count})
|
||||||
|
|
||||||
|
%p.light
|
||||||
|
Group allows you to keep projects organized.
|
||||||
|
Use groups for uniting related projects.
|
||||||
|
|
||||||
|
%hr
|
||||||
|
.clearfix
|
||||||
|
.pull-left
|
||||||
|
= form_tag public_groups_path, method: :get, class: 'form-inline form-tiny' do |f|
|
||||||
|
.form-group
|
||||||
|
= search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input input-mn-300", id: "groups_search"
|
||||||
|
.form-group
|
||||||
|
= submit_tag 'Search', class: "btn btn-primary wide"
|
||||||
|
|
||||||
|
.pull-right
|
||||||
|
.dropdown.inline
|
||||||
|
%a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
|
||||||
|
%span.light sort:
|
||||||
|
- if @sort.present?
|
||||||
|
= @sort.humanize
|
||||||
|
- else
|
||||||
|
Name
|
||||||
|
%b.caret
|
||||||
|
%ul.dropdown-menu
|
||||||
|
%li
|
||||||
|
= link_to public_groups_path(sort: nil) do
|
||||||
|
Name
|
||||||
|
= link_to public_groups_path(sort: 'newest') do
|
||||||
|
Newest
|
||||||
|
= link_to public_groups_path(sort: 'oldest') do
|
||||||
|
Oldest
|
||||||
|
= link_to public_groups_path(sort: 'recently_updated') do
|
||||||
|
Recently updated
|
||||||
|
= link_to public_groups_path(sort: 'last_updated') do
|
||||||
|
Last updated
|
||||||
|
|
||||||
|
%hr
|
||||||
|
|
||||||
|
%ul.bordered-list
|
||||||
|
- @groups.each do |group|
|
||||||
|
%li
|
||||||
|
.clearfix
|
||||||
|
%h4
|
||||||
|
= link_to group_path(id: group.path) do
|
||||||
|
%i.icon-group
|
||||||
|
= group.name
|
||||||
|
.clearfix
|
||||||
|
%p
|
||||||
|
= truncate group.description, length: 150
|
||||||
|
.clearfix
|
||||||
|
%p.light
|
||||||
|
#{pluralize(group.members.size, 'member')}, #{pluralize(group.projects.count, 'project')}
|
||||||
|
- unless @groups.present?
|
||||||
|
.nothing-here-block No public groups
|
||||||
|
|
||||||
|
|
||||||
|
= paginate @groups, theme: "gitlab"
|
|
@ -51,6 +51,7 @@ Gitlab::Application.routes.draw do
|
||||||
#
|
#
|
||||||
namespace :public do
|
namespace :public do
|
||||||
resources :projects, only: [:index]
|
resources :projects, only: [:index]
|
||||||
|
resources :groups, only: [:index]
|
||||||
root to: "projects#index"
|
root to: "projects#index"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -117,3 +117,35 @@ Feature: Public Projects Feature
|
||||||
And I visit group "TestGroup" members page
|
And I visit group "TestGroup" members page
|
||||||
Then I should see group member "John Doe"
|
Then I should see group member "John Doe"
|
||||||
And I should not see member roles
|
And I should not see member roles
|
||||||
|
|
||||||
|
Scenario: I should see group with public project in public groups area
|
||||||
|
Given group "TestGroup" has public project "Community"
|
||||||
|
When I visit the public groups area
|
||||||
|
Then I should see group "TestGroup"
|
||||||
|
|
||||||
|
Scenario: I should not see group with internal project in public groups area
|
||||||
|
Given group "TestGroup" has internal project "Internal"
|
||||||
|
When I visit the public groups area
|
||||||
|
Then I should not see group "TestGroup"
|
||||||
|
|
||||||
|
Scenario: I should not see group with private project in public groups area
|
||||||
|
When I visit the public groups area
|
||||||
|
Then I should not see group "TestGroup"
|
||||||
|
|
||||||
|
Scenario: I should see group with public project in public groups area as user
|
||||||
|
Given group "TestGroup" has public project "Community"
|
||||||
|
When I sign in as a user
|
||||||
|
And I visit the public groups area
|
||||||
|
Then I should see group "TestGroup"
|
||||||
|
|
||||||
|
Scenario: I should see group with internal project in public groups area as user
|
||||||
|
Given group "TestGroup" has internal project "Internal"
|
||||||
|
When I sign in as a user
|
||||||
|
And I visit the public groups area
|
||||||
|
Then I should see group "TestGroup"
|
||||||
|
|
||||||
|
Scenario: I should not see group with private project in public groups area as user
|
||||||
|
When I sign in as a user
|
||||||
|
And I visit the public groups area
|
||||||
|
Then I should not see group "TestGroup"
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,14 @@ module SharedGroup
|
||||||
is_member_of("Mary Jane", "Guest", Gitlab::Access::GUEST)
|
is_member_of("Mary Jane", "Guest", Gitlab::Access::GUEST)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
step 'I should see group "TestGroup"' do
|
||||||
|
page.should have_content "TestGroup"
|
||||||
|
end
|
||||||
|
|
||||||
|
step 'I should not see group "TestGroup"' do
|
||||||
|
page.should_not have_content "TestGroup"
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def is_member_of(username, groupname, role)
|
def is_member_of(username, groupname, role)
|
||||||
|
|
|
@ -331,6 +331,14 @@ module SharedPaths
|
||||||
visit public_project_path(Project.find_by(name: "Community"))
|
visit public_project_path(Project.find_by(name: "Community"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# ----------------------------------------
|
||||||
|
# Public Groups
|
||||||
|
# ----------------------------------------
|
||||||
|
|
||||||
|
step 'I visit the public groups area' do
|
||||||
|
visit public_groups_path
|
||||||
|
end
|
||||||
|
|
||||||
# ----------------------------------------
|
# ----------------------------------------
|
||||||
# Snippets
|
# Snippets
|
||||||
# ----------------------------------------
|
# ----------------------------------------
|
||||||
|
|
Loading…
Reference in a new issue