summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValery Sizov <vsv2711@gmail.com>2015-04-21 13:21:57 +0300
committerValery Sizov <vsv2711@gmail.com>2015-04-21 19:31:34 +0300
commitb35b54e0bf4ca973966ede1add15d88327a013d2 (patch)
tree665f0a5cbfb24ab9453e687dccf152a8f6eb6e40
parentb3e2939aa2904c92aba0399d511cb05228bfc9be (diff)
downloadgitlab-ci-b35b54e0bf4ca973966ede1add15d88327a013d2.tar.gz
projects search on dashboard
-rw-r--r--app/assets/stylesheets/sections/projects.scss13
-rw-r--r--app/controllers/projects_controller.rb6
-rw-r--r--app/models/project.rb7
-rw-r--r--app/models/user.rb6
-rw-r--r--app/views/projects/_gitlab.html.haml9
-rw-r--r--app/views/projects/_search.html.haml14
-rw-r--r--app/views/projects/index.html.haml2
-rw-r--r--lib/api/projects.rb4
-rw-r--r--spec/controllers/projects_controller_spec.rb26
-rw-r--r--spec/features/projects_spec.rb1
10 files changed, 73 insertions, 15 deletions
diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss
index cef59c9..bc9da2f 100644
--- a/app/assets/stylesheets/sections/projects.scss
+++ b/app/assets/stylesheets/sections/projects.scss
@@ -42,3 +42,16 @@
border-radius: 0;
}
}
+
+.search{
+ width: 300px;
+
+ .search-input{
+ height: 35px;
+ }
+
+ form{
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+}
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 2fbf3f6..2e9a9b6 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -1,4 +1,6 @@
class ProjectsController < ApplicationController
+ PROJECTS_PER_PAGE = 100
+
before_filter :authenticate_user!, except: [:build, :badge, :index, :show]
before_filter :project, only: [:build, :integration, :show, :badge, :edit, :update, :destroy]
before_filter :authorize_access_project!, except: [:build, :gitlab, :badge, :index, :show, :new, :create]
@@ -16,8 +18,8 @@ class ProjectsController < ApplicationController
def gitlab
current_user.reset_cache if params[:reset_cache]
@page = (params[:page] || 1).to_i
- @per_page = 100
- @gl_projects = current_user.gitlab_projects(@page, @per_page)
+ @per_page = PROJECTS_PER_PAGE
+ @gl_projects = current_user.gitlab_projects(params[:search], @page, @per_page)
@projects = Project.where(gitlab_id: @gl_projects.map(&:id)).ordered_by_last_commit_date
@total_count = @gl_projects.size
@gl_projects.reject! { |gl_project| @projects.map(&:gitlab_id).include?(gl_project.id) }
diff --git a/app/models/project.rb b/app/models/project.rb
index 247824c..a3cb161 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -90,12 +90,11 @@ ls -la
project
end
- def from_gitlab(user, page, per_page, scope = :owned)
+ def from_gitlab(user, scope = :owned, options)
opts = { private_token: user.private_token }
- opts[:per_page] = per_page if per_page.present?
- opts[:page] = page if page.present?
+ opts.merge! options
- projects = Network.new.projects(user.url, opts, scope)
+ projects = Network.new.projects(user.url, opts.compact, scope)
if projects
projects.map { |pr| OpenStruct.new(pr) }
diff --git a/app/models/user.rb b/app/models/user.rb
index 129ddc1..71b0c19 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -8,9 +8,9 @@ class User
@attributes = hash
end
- def gitlab_projects(page = 1, per_page = 100)
- Rails.cache.fetch(cache_key(page, per_page)) do
- Project.from_gitlab(self, page, per_page, :authorized)
+ def gitlab_projects(search = nil, page = 1, per_page = 100)
+ Rails.cache.fetch(cache_key(page, per_page, search)) do
+ Project.from_gitlab(self, :authorized, { page: page, per_page: per_page, search: search })
end
end
diff --git a/app/views/projects/_gitlab.html.haml b/app/views/projects/_gitlab.html.haml
index d11d850..3dd759f 100644
--- a/app/views/projects/_gitlab.html.haml
+++ b/app/views/projects/_gitlab.html.haml
@@ -1,7 +1,10 @@
.clearfix.light
.pull-left.fetch-status
- Fetched from GitLab (#{link_to current_user.url, current_user.url, no_turbolink}) #{time_ago_in_words(current_user.sync_at)} ago.
- = link_to gitlab_projects_path(reset_cache: true), remote: true, class: 'sync-now btn btn-small btn-default' do
+ Fetched from GitLab (#{link_to current_user.url, current_user.url, no_turbolink})
+ - if params[:search].present?
+ by keyword: "#{params[:search]}",
+ #{time_ago_in_words(current_user.sync_at)} ago.
+ = link_to gitlab_projects_path(reset_cache: true, search: params[:search]), remote: true, class: 'sync-now btn btn-small btn-default' do
%i.icon-refresh
Sync now
%br
@@ -48,7 +51,7 @@
&nbsp;
- if @total_count == @per_page
%li
- = link_to gitlab_projects_path(page: @page + 1), class: 'btn', remote: true do
+ = link_to gitlab_projects_path(page: @page + 1, search: params[:search]), class: 'btn', remote: true do
Next
%i.icon-angle-right
diff --git a/app/views/projects/_search.html.haml b/app/views/projects/_search.html.haml
new file mode 100644
index 0000000..ad428a5
--- /dev/null
+++ b/app/views/projects/_search.html.haml
@@ -0,0 +1,14 @@
+.search
+ = form_tag "#", method: :get, class: 'navbar-form' do |f|
+ .form-group
+ .input-group
+ = search_field_tag "search", params[:search], placeholder: "Search", class: "search-input form-control"
+ .input-group-addon
+ %i.icon-search
+
+
+:coffeescript
+ $('.search .navbar-form').submit ->
+ query = $('.search .navbar-form .search-input').val()
+ $.get '#{gitlab_projects_path}' + '?search=' + query
+ false \ No newline at end of file
diff --git a/app/views/projects/index.html.haml b/app/views/projects/index.html.haml
index 9e45ec1..824ba80 100644
--- a/app/views/projects/index.html.haml
+++ b/app/views/projects/index.html.haml
@@ -2,6 +2,8 @@
= content_for :title do
%h3.project-title
Dashboard
+ .pull-right
+ = render "search"
.projects
%p.fetch-status.light
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index ea10a82..e61a944 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -108,7 +108,7 @@ module API
# GET /projects
get do
gitlab_projects = Project.from_gitlab(
- current_user, params[:page], params[:per_page], :authorized
+ current_user, :authorized, { page: params[:page], per_page: params[:per_page] }
)
ids = gitlab_projects.map { |project| project.id }
@@ -122,7 +122,7 @@ module API
# GET /projects/owned
get "owned" do
gitlab_projects = Project.from_gitlab(
- current_user, params[:page], params[:per_page], :owned
+ current_user, :owned, { page: params[:page], per_page: params[:per_page] }
)
ids = gitlab_projects.map { |project| project.id }
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 88aeb7a..dea35f6 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -42,7 +42,7 @@ describe ProjectsController do
end
end
- describe "POST /:projects" do
+ describe "POST /projects" do
let(:project_dump) { File.read(Rails.root.join('spec/support/gitlab_stubs/raw_project.yml')) }
let(:gitlab_url) { GitlabCi.config.gitlab_server.url }
@@ -66,4 +66,28 @@ describe ProjectsController do
expect(response.code).to eq('302')
end
end
+
+ describe "GET /gitlab" do
+ let(:gitlab_url) { GitlabCi.config.gitlab_server.url }
+
+ let (:user_data) do
+ data = JSON.parse File.read(Rails.root.join('spec/support/gitlab_stubs/user.json'))
+ data.merge("url" => gitlab_url)
+ end
+
+ let(:user) do
+ User.new(user_data)
+ end
+
+ it "searches projects" do
+ allow(controller).to receive(:reset_cache) { true }
+ allow(controller).to receive(:current_user) { user }
+ Network.any_instance.should_receive(:projects).with(anything(), hash_including(search: 'str'), :authorized)
+
+ xhr :get, :gitlab, { search: "str", format: "js" }.with_indifferent_access
+
+ expect(response).to be_success
+ expect(response.code).to eq('200')
+ end
+ end
end
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index 034dfc1..819919b 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -13,6 +13,7 @@ describe "Projects" do
end
it { page.should have_content "GitLab / gitlab-shell" }
+ it { page.should have_selector ".search input#search" }
end
describe "GET /projects/:id" do