diff --git a/app/controllers/public/groups_controller.rb b/app/controllers/public/groups_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..7eb159c577dd3860249f477107e0b287d4f2d264 --- /dev/null +++ b/app/controllers/public/groups_controller.rb @@ -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 diff --git a/app/models/group.rb b/app/models/group.rb index 3a5c5e113547798b4968c39275340f3d652439e9..66239f7fe6f233320a65059247fa489de11f259a 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -73,4 +73,20 @@ class Group < Namespace def public_profile? projects.public_only.any? 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 diff --git a/app/views/layouts/public_groups.html.haml b/app/views/layouts/public_groups.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..bfa37b067b94ceaad1a42e2aeecbc23a07a9fde5 --- /dev/null +++ b/app/views/layouts/public_groups.html.haml @@ -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 diff --git a/app/views/public/groups/index.html.haml b/app/views/public/groups/index.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..7a2e57378045c4e052631a391b624e6ff372d5a6 --- /dev/null +++ b/app/views/public/groups/index.html.haml @@ -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" diff --git a/config/routes.rb b/config/routes.rb index f73fd7a87fae2d3b386178956ececb4d928fe82a..7babab3438a4d0f47c1bdc372ce648be10d72d7b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -51,6 +51,7 @@ Gitlab::Application.routes.draw do # namespace :public do resources :projects, only: [:index] + resources :groups, only: [:index] root to: "projects#index" end diff --git a/features/public/public_groups.feature b/features/public/public_groups.feature index 8bbda8cb6d4a80a90e23be0c364f28e467a2c7bf..ff3e1e3e9550a96fef1a4f918a61ff0009d3fa18 100644 --- a/features/public/public_groups.feature +++ b/features/public/public_groups.feature @@ -117,3 +117,35 @@ Feature: Public Projects Feature And I visit group "TestGroup" members page Then I should see group member "John Doe" 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" + diff --git a/features/steps/shared/group.rb b/features/steps/shared/group.rb index 6b4c47312a7a40717a9eb5d623c725c76e6c2222..1b225dd61a6f111a024c5447d379a35a03c53e63 100644 --- a/features/steps/shared/group.rb +++ b/features/steps/shared/group.rb @@ -21,6 +21,14 @@ module SharedGroup is_member_of("Mary Jane", "Guest", Gitlab::Access::GUEST) 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 def is_member_of(username, groupname, role) diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index 2090b64205934412ad5e08116914c9d81d008b39..d92c70c952e0f43f144b210a75a202691498db5f 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -331,6 +331,14 @@ module SharedPaths visit public_project_path(Project.find_by(name: "Community")) end + # ---------------------------------------- + # Public Groups + # ---------------------------------------- + + step 'I visit the public groups area' do + visit public_groups_path + end + # ---------------------------------------- # Snippets # ----------------------------------------