diff --git a/Gemfile b/Gemfile
index a927c3e4e62d9396145513f5f2da6afaf92187ab..04985f9c000d68382180de6d0c39875af2d6b2ea 100644
--- a/Gemfile
+++ b/Gemfile
@@ -112,7 +112,7 @@ group :assets do
gem 'chosen-rails', "0.9.8"
gem 'select2-rails'
- gem 'jquery-atwho-rails', "0.1.7"
+ gem 'jquery-atwho-rails', "0.3.0"
gem "jquery-rails", "2.1.3"
gem "jquery-ui-rails", "2.0.2"
gem "modernizr", "2.6.2"
diff --git a/Gemfile.lock b/Gemfile.lock
index 3080651ba29ec4c35556ea20e28e52636f1fbdaa..77ff70faa55d70d60a2c243e7b5623ce6134bcce 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -231,7 +231,7 @@ GEM
httpauth (0.2.0)
i18n (0.6.1)
journey (1.0.4)
- jquery-atwho-rails (0.1.7)
+ jquery-atwho-rails (0.3.0)
jquery-rails (2.1.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
@@ -532,7 +532,7 @@ DEPENDENCIES
guard-spinach
haml-rails
httparty
- jquery-atwho-rails (= 0.1.7)
+ jquery-atwho-rails (= 0.3.0)
jquery-rails (= 2.1.3)
jquery-turbolinks
jquery-ui-rails (= 2.0.2)
diff --git a/app/assets/javascripts/gfm_auto_complete.js.coffee b/app/assets/javascripts/gfm_auto_complete.js.coffee
index 9ef194fbd2542d88966de3a55bb9ff4557816c19..c8c57b91e0329d4bef56fd8d99365602115ee1d7 100644
--- a/app/assets/javascripts/gfm_auto_complete.js.coffee
+++ b/app/assets/javascripts/gfm_auto_complete.js.coffee
@@ -2,37 +2,55 @@
window.GitLab ?= {}
GitLab.GfmAutoComplete =
+ # private_token: ''
+ dataSource: ''
# Emoji
Emoji:
- data: []
+ assetBase: ''
template: '
${name}
'
# Team Members
Members:
- data: []
- url: ''
- params:
- private_token: ''
template: '${username} ${name}'
+ Issues:
+ template: '${id} ${title} '
+
# Add GFM auto-completion to all input fields, that accept GFM input.
setup: ->
input = $('.js-gfm-input')
# Emoji
- input.atWho '(?:^|\\s):',
- data: @Emoji.data
+ input.atwho
+ at: ':'
tpl: @Emoji.template
+ callbacks:
+ before_save: (emojis) =>
+ $.map emojis, (em) => name: em, insert: em+ ':', image: "#{@Emoji.assetBase}/#{em}.png"
# Team Members
- input.atWho '@',
+ input.atwho
+ at: '@'
tpl: @Members.template
- callback: (query, callback) =>
- request_params = $.extend({}, @Members.params, query: query)
- $.getJSON(@Members.url, request_params).done (members) =>
- new_members_data = $.map(members, (m) ->
- username: m.username,
- name: m.name
- )
- callback(new_members_data)
+ search_key: 'search'
+ callbacks:
+ before_save: (members) =>
+ $.map members, (m) => name: m.name, username: m.username, search: "#{m.username} #{m.name}"
+
+ input.atwho
+ at: '#'
+ alias: 'issues'
+ search_key: 'search'
+ tpl: @Issues.template
+ callbacks:
+ before_save: (issues) ->
+ $.map issues, (i) -> id: i.id, title: i.title, search: "#{i.id} #{i.title}"
+ input.one "focus", =>
+ $.getJSON(@dataSource).done (data) ->
+ # load members
+ input.atwho 'load', "@", data.members
+ # load issues
+ input.atwho 'load', "issues", data.issues
+ # load emojis
+ input.atwho 'load', ":", data.emojis
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 255baba0ecb4e2291877af33de3373ffaa50f5c4..0e05213b79779216d468e3ed99e15ab1510dc859 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -93,4 +93,16 @@ class ProjectsController < ProjectResourceController
format.js
end
end
+
+ def autocomplete_sources
+ @suggestions = {
+ emojis: Emoji.names,
+ issues: @project.issues.select([:id, :title, :description]),
+ members: @project.users.select([:username, :name]).order(:username)
+ }
+
+ respond_to do |format|
+ format.json { render :json => @suggestions }
+ end
+ end
end
diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml
index b43650459d8b84db53e0bbde2b76630b31b03514..2ea6c3e46d93385130a2e171e141024281bf0a18 100644
--- a/app/views/layouts/_head_panel.html.haml
+++ b/app/views/layouts/_head_panel.html.haml
@@ -36,5 +36,3 @@
= link_to current_user, class: "profile-pic" do
= image_tag gravatar_icon(current_user.email, 26)
-
-= render "layouts/init_auto_complete"
diff --git a/app/views/layouts/_init_auto_complete.html.haml b/app/views/layouts/_init_auto_complete.html.haml
index 8f8c7d8885e793641d7e31ddbc06415095b420e8..3549794b90d102cb44e129d1b1a252e1ad9aa820 100644
--- a/app/views/layouts/_init_auto_complete.html.haml
+++ b/app/views/layouts/_init_auto_complete.html.haml
@@ -1,17 +1,6 @@
:javascript
$(function() {
- GitLab.GfmAutoComplete.Members.url = "#{ "/api/v3/projects/#{@project.id}/members" if @project }";
- GitLab.GfmAutoComplete.Members.params.private_token = "#{current_user.private_token}";
-
- GitLab.GfmAutoComplete.Emoji.data = #{raw emoji_autocomplete_source};
- // convert the list so that the items have the right format for completion
- GitLab.GfmAutoComplete.Emoji.data = $.map(GitLab.GfmAutoComplete.Emoji.data, function(value) {
- return {
- name: value,
- insert: value+':',
- image: '#{image_path("emoji")}/'+value+'.png'
- }
- });
-
+ GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_project_path(@project)}"
+ GitLab.GfmAutoComplete.Emoji.assetBase = '#{image_path("emoji")}'
GitLab.GfmAutoComplete.setup();
});
diff --git a/app/views/layouts/project_resource.html.haml b/app/views/layouts/project_resource.html.haml
index 1fc364106684ccb709f94d89ac2408c013c02cdd..6d8bf9b710b0fdca72c27e7500c9718fdf781f10 100644
--- a/app/views/layouts/project_resource.html.haml
+++ b/app/views/layouts/project_resource.html.haml
@@ -3,6 +3,7 @@
= render "layouts/head", title: @project.name_with_namespace
%body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id }
= render "layouts/head_panel", title: project_title(@project)
+ = render "layouts/init_auto_complete"
= render "layouts/flash"
- if can?(current_user, :download_code, @project)
= render 'shared/no_ssh'
diff --git a/config/routes.rb b/config/routes.rb
index a3258c91a8cc2f128725bf5c36d069d8a828a1ba..0e60aeb99842c0b52f0d089474abefd60e19e780 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -168,6 +168,7 @@ Gitlab::Application.routes.draw do
member do
put :transfer
post :fork
+ get :autocomplete_sources
end
resources :blob, only: [:show], constraints: {id: /.+/}
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index 613c4565755cadcf7cfb26894c6e4edc37d4ab77..f20a1ca51a44bb4ea4a25d2364368b6c06a5ba41 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -83,6 +83,10 @@ describe ProjectsController, "routing" do
get("/gitlabhq/edit").should route_to('projects#edit', id: 'gitlabhq')
end
+ it "to #autocomplete_sources" do
+ get('/gitlabhq/autocomplete_sources').should route_to('projects#autocomplete_sources', id: "gitlabhq")
+ end
+
it "to #show" do
get("/gitlabhq").should route_to('projects#show', id: 'gitlabhq')
end