diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 71338a61..93cf19b6 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -79,8 +79,17 @@ class IssuesController < ApplicationController end def search - @project = Project.find(params['project']) - @issues = @project.issues.where("title LIKE ? OR content LIKE ?", "%#{params['terms']}%", "%#{params['terms']}%") + terms = params['terms'] + + @project = Project.find(params['project']) + @issues = case params[:status].to_i + when 1 then @project.issues + when 2 then @project.issues.closed + when 3 then @project.issues.opened.assigned(current_user) + else @project.issues.opened + end + + @issues = @issues.where("title LIKE ? OR content LIKE ?", "%#{terms}%", "%#{terms}%") unless terms.blank? render :partial => 'issues' end diff --git a/app/views/issues/index.html.haml b/app/views/issues/index.html.haml index 53c4fe66..7e4694ef 100644 --- a/app/views/issues/index.html.haml +++ b/app/views/issues/index.html.haml @@ -2,37 +2,44 @@ - if can? current_user, :write_issue, @project .left = form_tag search_project_issues_path(@project), :method => :get, :remote => true do + = hidden_field_tag :project_id, @project.id, { :id => 'project_id' } = search_field_tag :issue_search, nil, { :placeholder => 'Search', :class => 'issue_search' } = link_to 'New Issue', new_project_issue_path(@project), :remote => true, :class => "lbutton vm" .right = form_tag project_issues_path(@project), :method => :get do .span-2 - = radio_button_tag :f, 0, (params[:f] || "0") == "0", :onclick => "this.form.submit()", :id => "open_issues" + = radio_button_tag :f, 0, (params[:f] || "0") == "0", :onclick => "this.form.submit()", :id => "open_issues", :class => "status" = label_tag "open_issues","Open" .span-2 - = radio_button_tag :f, 2, params[:f] == "2", :onclick => "this.form.submit()", :id => "closed_issues" + = radio_button_tag :f, 2, params[:f] == "2", :onclick => "this.form.submit()", :id => "closed_issues", :class => "status" = label_tag "closed_issues","Closed" .span-2 - = radio_button_tag :f, 3, params[:f] == "3", :onclick => "this.form.submit()", :id => "my_issues" + = radio_button_tag :f, 3, params[:f] == "3", :onclick => "this.form.submit()", :id => "my_issues", :class => "status" = label_tag "my_issues","To Me" - .span-2 - = radio_button_tag :f, 1, params[:f] == "1", :onclick => "this.form.submit()", :id => "all_issues" + = radio_button_tag :f, 1, params[:f] == "1", :onclick => "this.form.submit()", :id => "all_issues", :class => "status" = label_tag "all_issues","All" #issues-table-holder= render "issues" %br :javascript - $('.issue_search').keyup(function() { - var terms = $(this).val(); - var project_id = 1; + var href = $('.issue_search').parent().attr('action'); + var last_terms = ''; - if (terms.length >= 2) { - $.get($(this).parent().attr('action'), { 'terms': terms, project: project_id }, function(response) { - $('#issues-table').html(response); - setSortable(); - }); + $('.issue_search').keyup(function() { + var terms = $(this).val(); + var project_id = $('#project_id').val(); + var status = $('.status:checked').val(); + if (terms != last_terms) { + last_terms = terms; + + if (terms.length >= 2 || terms.length == 0) { + $.get(href, { 'status': status, 'terms': terms, project: project_id }, function(response) { + $('#issues-table').html(response); + setSortable(); + }); + } } }); diff --git a/spec/requests/issues_spec.rb b/spec/requests/issues_spec.rb index d3582d16..b7f4d411 100644 --- a/spec/requests/issues_spec.rb +++ b/spec/requests/issues_spec.rb @@ -149,21 +149,46 @@ describe "Issues" do before do ['foobar', 'foobar2', 'gitlab'].each do |title| @issue = Factory :issue, - :author => @user, + :author => @user, :assignee => @user, - :project => project, - :title => title + :project => project, + :title => title @issue.save end end - it "should search and return the correct results" do + it "should be able to search on different statuses" do + @issue = Issue.first + @issue.closed = true + @issue.save + visit project_issues_path(project) - fill_in "issue_search", :with => "foobar" + choose 'closed_issues' + fill_in 'issue_search', :with => 'foobar' + + page.should have_content 'foobar' + page.should_not have_content 'foobar2' + page.should_not have_content 'gitlab' + end + + it "should search for term and return the correct results" do + visit project_issues_path(project) + fill_in 'issue_search', :with => 'foobar' + page.should have_content 'foobar' page.should have_content 'foobar2' page.should_not have_content 'gitlab' end - end + it "should return all results if term has been cleared" do + visit project_issues_path(project) + fill_in "issue_search", :with => "foobar" + # Because fill_in, :with => "" triggers nothing we need to trigger a keyup event + page.execute_script("$('.issue_search').val('').keyup();"); + + page.should have_content 'foobar' + page.should have_content 'foobar2' + page.should have_content 'gitlab' + end + end end