Commit ac8247b46df8eb8c475436fc276a3648379ae7a0

Authored by Dmitriy Zaporozhets
1 parent f6c482c0

Improved search. added filters

app/assets/stylesheets/common.scss
1 html { 1 html {
2 - overflow-y: scroll; 2 + overflow-y: scroll;
3 } 3 }
4 4
5 /** LAYOUT **/ 5 /** LAYOUT **/
@@ -277,8 +277,20 @@ p.time { @@ -277,8 +277,20 @@ p.time {
277 } 277 }
278 } 278 }
279 279
  280 +.search-holder {
  281 + label, input {
  282 + height: 30px;
  283 + padding: 0;
  284 + font-size: 14px;
  285 + }
  286 + label {
  287 + line-height: 30px;
  288 + color: #666;
  289 + }
  290 +}
  291 +
280 .highlight_word { 292 .highlight_word {
281 - background: #EEDC94; 293 + border-bottom: 2px solid #F90;
282 } 294 }
283 295
284 .status_info { 296 .status_info {
app/controllers/search_controller.rb
1 class SearchController < ApplicationController 1 class SearchController < ApplicationController
2 def show 2 def show
3 - result = SearchContext.new(current_user.authorized_projects.map(&:id), params).execute 3 + project_id = params[:project_id]
  4 + group_id = params[:group_id]
  5 +
  6 + project_ids = current_user.authorized_projects.map(&:id)
  7 +
  8 + if group_id.present?
  9 + group_project_ids = Group.find(group_id).projects.map(&:id)
  10 + project_ids.select! { |id| group_project_ids.include?(id)}
  11 + elsif project_id.present?
  12 + project_ids.select! { |id| id == project_id.to_i}
  13 + end
  14 +
  15 + result = SearchContext.new(project_ids, params).execute
4 16
5 @projects = result[:projects] 17 @projects = result[:projects]
6 @merge_requests = result[:merge_requests] 18 @merge_requests = result[:merge_requests]
app/helpers/application_helper.rb
@@ -72,8 +72,8 @@ module ApplicationHelper @@ -72,8 +72,8 @@ module ApplicationHelper
72 end 72 end
73 73
74 def search_autocomplete_source 74 def search_autocomplete_source
75 - projects = current_user.authorized_projects.map { |p| { label: p.name_with_namespace, url: project_path(p) } }  
76 - groups = current_user.authorized_groups.map { |group| { label: "<group> #{group.name}", url: group_path(group) } } 75 + projects = current_user.authorized_projects.map { |p| { label: "project: #{p.name_with_namespace}", url: project_path(p) } }
  76 + groups = current_user.authorized_groups.map { |group| { label: "group: #{group.name}", url: group_path(group) } }
77 77
78 default_nav = [ 78 default_nav = [
79 { label: "My Profile", url: profile_path }, 79 { label: "My Profile", url: profile_path },
@@ -83,29 +83,29 @@ module ApplicationHelper @@ -83,29 +83,29 @@ module ApplicationHelper
83 ] 83 ]
84 84
85 help_nav = [ 85 help_nav = [
86 - { label: "API Help", url: help_api_path },  
87 - { label: "Markdown Help", url: help_markdown_path },  
88 - { label: "Permissions Help", url: help_permissions_path },  
89 - { label: "Public Access Help", url: help_public_access_path },  
90 - { label: "Rake Tasks Help", url: help_raketasks_path },  
91 - { label: "SSH Keys Help", url: help_ssh_path },  
92 - { label: "System Hooks Help", url: help_system_hooks_path },  
93 - { label: "Web Hooks Help", url: help_web_hooks_path },  
94 - { label: "Workflow Help", url: help_workflow_path }, 86 + { label: "help: API Help", url: help_api_path },
  87 + { label: "help: Markdown Help", url: help_markdown_path },
  88 + { label: "help: Permissions Help", url: help_permissions_path },
  89 + { label: "help: Public Access Help", url: help_public_access_path },
  90 + { label: "help: Rake Tasks Help", url: help_raketasks_path },
  91 + { label: "help: SSH Keys Help", url: help_ssh_path },
  92 + { label: "help: System Hooks Help", url: help_system_hooks_path },
  93 + { label: "help: Web Hooks Help", url: help_web_hooks_path },
  94 + { label: "help: Workflow Help", url: help_workflow_path },
95 ] 95 ]
96 96
97 project_nav = [] 97 project_nav = []
98 if @project && @project.repository && @project.repository.root_ref 98 if @project && @project.repository && @project.repository.root_ref
99 project_nav = [ 99 project_nav = [
100 - { label: "#{@project.name} Issues", url: project_issues_path(@project) },  
101 - { label: "#{@project.name} Commits", url: project_commits_path(@project, @ref || @project.repository.root_ref) },  
102 - { label: "#{@project.name} Merge Requests", url: project_merge_requests_path(@project) },  
103 - { label: "#{@project.name} Milestones", url: project_milestones_path(@project) },  
104 - { label: "#{@project.name} Snippets", url: project_snippets_path(@project) },  
105 - { label: "#{@project.name} Team", url: project_team_index_path(@project) },  
106 - { label: "#{@project.name} Tree", url: project_tree_path(@project, @ref || @project.repository.root_ref) },  
107 - { label: "#{@project.name} Wall", url: wall_project_path(@project) },  
108 - { label: "#{@project.name} Wiki", url: project_wikis_path(@project) }, 100 + { label: "#{@project.name_with_namespace} - Issues", url: project_issues_path(@project) },
  101 + { label: "#{@project.name_with_namespace} - Commits", url: project_commits_path(@project, @ref || @project.repository.root_ref) },
  102 + { label: "#{@project.name_with_namespace} - Merge Requests", url: project_merge_requests_path(@project) },
  103 + { label: "#{@project.name_with_namespace} - Milestones", url: project_milestones_path(@project) },
  104 + { label: "#{@project.name_with_namespace} - Snippets", url: project_snippets_path(@project) },
  105 + { label: "#{@project.name_with_namespace} - Team", url: project_team_index_path(@project) },
  106 + { label: "#{@project.name_with_namespace} - Tree", url: project_tree_path(@project, @ref || @project.repository.root_ref) },
  107 + { label: "#{@project.name_with_namespace} - Wall", url: wall_project_path(@project) },
  108 + { label: "#{@project.name_with_namespace} - Wiki", url: project_wikis_path(@project) },
109 ] 109 ]
110 end 110 end
111 111
app/views/layouts/_search.html.haml
1 .search 1 .search
2 = form_tag search_path, method: :get, class: 'navbar-form pull-left' do |f| 2 = form_tag search_path, method: :get, class: 'navbar-form pull-left' do |f|
3 = text_field_tag "search", nil, placeholder: "Search", class: "search-input" 3 = text_field_tag "search", nil, placeholder: "Search", class: "search-input"
  4 + = hidden_field_tag :group_id, @group.try(:id)
  5 + = hidden_field_tag :project_id, @project.try(:id)
4 6
5 :javascript 7 :javascript
6 $(function(){ 8 $(function(){
app/views/search/_filter.html.haml 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +%fieldset
  2 + %legend Groups:
  3 + %ul.nav.nav-pills.nav-stacked
  4 + %li{class: ("active" if params[:group_id].blank?)}
  5 + = link_to search_path(group_id: nil, search: params[:search]) do
  6 + Any
  7 + - current_user.authorized_groups.each do |group|
  8 + %li{class: ("active" if params[:group_id] == group.id.to_s)}
  9 + = link_to search_path(group_id: group.id, search: params[:search]) do
  10 + = group.name
  11 +
  12 +%fieldset
  13 + %legend Projects:
  14 + %ul.nav.nav-pills.nav-stacked
  15 + %li{class: ("active" if params[:project_id].blank?)}
  16 + = link_to search_path(project_id: nil, search: params[:search]) do
  17 + Any
  18 + - current_user.authorized_projects.each do |project|
  19 + %li{class: ("active" if params[:project_id] == project.id.to_s)}
  20 + = link_to search_path(project_id: project.id, search: params[:search]) do
  21 + = project.name_with_namespace
  22 +
  23 += hidden_field_tag :group_id, params[:group_id]
  24 += hidden_field_tag :project_id, params[:project_id]
app/views/search/_result.html.haml
1 -%br  
2 -%h3.page_title  
3 - Search results  
4 - %span.cgray (#{@projects.count + @merge_requests.count + @issues.count + @wiki_pages.count})  
5 -%hr 1 +%fieldset
  2 + %legend
  3 + Search results
  4 + %span.cgray (#{@projects.count + @merge_requests.count + @issues.count + @wiki_pages.count})
6 .search_results 5 .search_results
7 - .row  
8 - .span6  
9 - %table  
10 - %thead  
11 - %tr  
12 - %th Projects  
13 - %tbody  
14 - - @projects.each do |project|  
15 - %tr  
16 - %td  
17 - = link_to project do  
18 - %strong.term= project.name_with_namespace  
19 - %small.cgray  
20 - last activity at  
21 - = project.last_activity_date.stamp("Aug 25, 2011")  
22 - - if @projects.blank?  
23 - %tr  
24 - %td  
25 - %h4.nothing_here_message No Projects  
26 - %br  
27 - %table  
28 - %thead  
29 - %tr  
30 - %th Merge Requests  
31 - %tbody  
32 - - @merge_requests.each do |merge_request|  
33 - %tr  
34 - %td  
35 - = link_to [merge_request.project, merge_request] do  
36 - %span.badge.badge-info ##{merge_request.id}  
37 - &ndash;  
38 - %strong.term= truncate merge_request.title, length: 50  
39 - %strong.right  
40 - %span.label= merge_request.project.name  
41 - - if @merge_requests.blank?  
42 - %tr  
43 - %td  
44 - %h4.nothing_here_message No Merge Requests  
45 - .span6  
46 - %table  
47 - %thead  
48 - %tr  
49 - %th Issues  
50 - %tbody  
51 - - @issues.each do |issue|  
52 - %tr  
53 - %td  
54 - = link_to [issue.project, issue] do  
55 - %span.badge.badge-info ##{issue.id}  
56 - &ndash;  
57 - %strong.term= truncate issue.title, length: 40  
58 - %strong.right  
59 - %span.label= issue.project.name  
60 - - if @issues.blank?  
61 - %tr  
62 - %td  
63 - %h4.nothing_here_message No Issues  
64 - .span6  
65 - %table  
66 - %thead  
67 - %tr  
68 - %th Wiki  
69 - %tbody  
70 - - @wiki_pages.each do |wiki_page|  
71 - %tr  
72 - %td  
73 - = link_to project_wiki_path(wiki_page.project, wiki_page) do  
74 - %strong.term= truncate wiki_page.title, length: 40  
75 - %strong.right  
76 - %span.label= wiki_page.project.name  
77 - - if @wiki_pages.blank?  
78 - %tr  
79 - %td  
80 - %h4.nothing_here_message No wiki pages 6 + %ul.well-list
  7 + - @projects.each do |project|
  8 + %li
  9 + project:
  10 + = link_to project do
  11 + %strong.term= project.name_with_namespace
  12 + - @merge_requests.each do |merge_request|
  13 + %li
  14 + merge request:
  15 + = link_to [merge_request.project, merge_request] do
  16 + %span ##{merge_request.id}
  17 + %strong.term
  18 + = truncate merge_request.title, length: 50
  19 + %span.light (#{merge_request.project.name_with_namespace})
  20 + - @issues.each do |issue|
  21 + %li
  22 + issue:
  23 + = link_to [issue.project, issue] do
  24 + %span ##{issue.id}
  25 + %strong.term
  26 + = truncate issue.title, length: 50
  27 + %span.light (#{issue.project.name_with_namespace})
  28 + - @wiki_pages.each do |wiki_page|
  29 + %li
  30 + wiki:
  31 + = link_to project_wiki_path(wiki_page.project, wiki_page) do
  32 + %strong.term
  33 + = truncate wiki_page.title, length: 50
  34 + %span.light (#{wiki_page.project.name_with_namespace})
  35 +
81 :javascript 36 :javascript
82 $(function() { 37 $(function() {
83 $(".search_results .term").highlight("#{escape_javascript(params[:search])}"); 38 $(".search_results .term").highlight("#{escape_javascript(params[:search])}");
app/views/search/show.html.haml
1 = form_tag search_path, method: :get, class: 'form-inline' do |f| 1 = form_tag search_path, method: :get, class: 'form-inline' do |f|
2 - .padded 2 + .search-holder
3 = label_tag :search do 3 = label_tag :search do
4 - %strong Looking for 4 + %span Looking for
5 .input 5 .input
6 = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search" 6 = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
7 = submit_tag 'Search', class: "btn primary wide" 7 = submit_tag 'Search', class: "btn primary wide"
8 -- if params[:search].present?  
9 - = render 'search/result' 8 + .clearfix
  9 + .row
  10 + .span3
  11 + = render 'filter', f: f
  12 + .span9
  13 + .results
  14 + - if params[:search].present?
  15 + = render 'search/result'