From dca50ac1d4a6da5724b66643bcb18a4a2e3f5558 Mon Sep 17 00:00:00 2001
From: Phil Hughes <me@iamphill.com>
Date: Tue, 22 Mar 2016 11:33:38 +0000
Subject: [PATCH] Project dropdown in header uses new dropdown

---
 app/assets/javascripts/gl_dropdown.js.coffee  |  4 ++-
 .../javascripts/project_select.js.coffee      | 32 +++++++++++++++++++
 app/assets/stylesheets/framework/header.scss  |  5 +++
 app/helpers/projects_helper.rb                | 14 ++------
 app/views/layouts/header/_default.html.haml   |  2 ++
 app/views/layouts/project.html.haml           |  7 ++++
 6 files changed, 51 insertions(+), 13 deletions(-)

diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee
index ee1d0fad289..2dc37257e22 100644
--- a/app/assets/javascripts/gl_dropdown.js.coffee
+++ b/app/assets/javascripts/gl_dropdown.js.coffee
@@ -122,7 +122,9 @@ class GitLabDropdown
   FILTER_INPUT = '.dropdown-input .dropdown-input-field'
 
   constructor: (@el, @options) ->
-    @dropdown = $(@el).parent()
+    self = @
+    selector = $(@el).data "target"
+    @dropdown = if selector? then $(selector) else $(@el).parent()
 
     # Set Defaults
     {
diff --git a/app/assets/javascripts/project_select.js.coffee b/app/assets/javascripts/project_select.js.coffee
index be8ab9b428d..704bd8dee53 100644
--- a/app/assets/javascripts/project_select.js.coffee
+++ b/app/assets/javascripts/project_select.js.coffee
@@ -1,5 +1,37 @@
 class @ProjectSelect
   constructor: ->
+    $('.js-projects-dropdown-toggle').each (i, dropdown) ->
+      $dropdown = $(dropdown)
+
+      $dropdown.glDropdown(
+        filterable: true
+        filterRemote: true
+        search:
+          fields: ['name_with_namespace']
+        data: (term, callback) ->
+          finalCallback = (projects) ->
+            callback projects
+
+          if @includeGroups
+            projectsCallback = (projects) ->
+              groupsCallback = (groups) ->
+                data = groups.concat(projects)
+                finalCallback(data)
+
+              Api.groups term, false, groupsCallback
+          else
+            projectsCallback = finalCallback
+
+          if @groupId
+            Api.groupProjects @groupId, term, projectsCallback
+          else
+            Api.projects term, @orderBy, projectsCallback
+        url: (project) ->
+          project.web_url
+        text: (project) ->
+          project.name_with_namespace
+      )
+
     $('.ajax-project-select').each (i, select) ->
       @groupId = $(select).data('group-id')
       @includeGroups = $(select).data('include-groups')
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index b3397d16016..3f015427d07 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -69,6 +69,7 @@ header {
   }
 
   .header-content {
+    position: relative;
     height: $header-height;
     padding-right: 20px;
 
@@ -76,6 +77,10 @@ header {
       padding-right: 0;
     }
 
+    .dropdown-menu {
+      margin-top: -5px;
+    }
+
     .title {
       margin: 0;
       font-size: 19px;
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 4e4c6e301d5..3621b943f3c 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -65,18 +65,8 @@ module ProjectsHelper
         link_to(simple_sanitize(owner.name), user_path(owner))
       end
 
-    project_link = link_to project_path(project), { class: "project-item-select-holder" } do
-      link_output = simple_sanitize(project.name)
-
-      if current_user
-        link_output += project_select_tag :project_path,
-          class: "project-item-select js-projects-dropdown",
-          data: { include_groups: false, order_by: 'last_activity_at' }
-      end
-
-      link_output
-    end
-    project_link += icon "chevron-down", class: "dropdown-toggle-caret js-projects-dropdown-toggle" if current_user
+    project_link = link_to simple_sanitize(project.name), project_path(project), { class: "project-item-select-holder"}
+    project_link += icon "chevron-down", class: "dropdown-toggle-caret js-projects-dropdown-toggle", data: { target: ".header-content", toggle: "dropdown" }  if current_user
 
     full_title = namespace_link + ' / ' + project_link
     full_title += ' &middot; '.html_safe + link_to(simple_sanitize(name), url) if name
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 0f3b8119379..44339293095 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -45,6 +45,8 @@
 
       %h1.title= title
 
+      = yield :header_content
+
 = render 'shared/outdated_browser'
 
 - if @project && !@project.empty_repo?
diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml
index a7ef31acd3d..35be616b174 100644
--- a/app/views/layouts/project.html.haml
+++ b/app/views/layouts/project.html.haml
@@ -17,4 +17,11 @@
 - content_for :scripts_body do
   = render "layouts/init_auto_complete" if current_user
 
+- content_for :header_content do
+  .dropdown-menu.dropdown-select
+    = dropdown_title("Go to a project")
+    = dropdown_filter("Search your projects")
+    = dropdown_content
+    = dropdown_loading
+
 = render template: "layouts/application"
-- 
GitLab