Commit 1da2262e authored by dreis's avatar dreis

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
parent f3b0cb77
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 ...@@ -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
!!! 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
%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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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
# ---------------------------------------- # ----------------------------------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment