Commit 439cd3ebd3613825fc426238770f522a9401d51e

Authored by ichord
1 parent ca244c35

autocomplete issues and preload autocomplete data.

update jquery-atwho-rails to v0.3.0

add autocomplete_source action to project for gfm autocomplete

move init_autocomplete layout from head_panel to project_resource
@@ -112,7 +112,7 @@ group :assets do @@ -112,7 +112,7 @@ group :assets do
112 112
113 gem 'chosen-rails', "0.9.8" 113 gem 'chosen-rails', "0.9.8"
114 gem 'select2-rails' 114 gem 'select2-rails'
115 - gem 'jquery-atwho-rails', "0.1.7" 115 + gem 'jquery-atwho-rails', "0.3.0"
116 gem "jquery-rails", "2.1.3" 116 gem "jquery-rails", "2.1.3"
117 gem "jquery-ui-rails", "2.0.2" 117 gem "jquery-ui-rails", "2.0.2"
118 gem "modernizr", "2.6.2" 118 gem "modernizr", "2.6.2"
@@ -231,7 +231,7 @@ GEM @@ -231,7 +231,7 @@ GEM
231 httpauth (0.2.0) 231 httpauth (0.2.0)
232 i18n (0.6.1) 232 i18n (0.6.1)
233 journey (1.0.4) 233 journey (1.0.4)
234 - jquery-atwho-rails (0.1.7) 234 + jquery-atwho-rails (0.3.0)
235 jquery-rails (2.1.3) 235 jquery-rails (2.1.3)
236 railties (>= 3.1.0, < 5.0) 236 railties (>= 3.1.0, < 5.0)
237 thor (~> 0.14) 237 thor (~> 0.14)
@@ -531,7 +531,7 @@ DEPENDENCIES @@ -531,7 +531,7 @@ DEPENDENCIES
531 guard-spinach 531 guard-spinach
532 haml-rails 532 haml-rails
533 httparty 533 httparty
534 - jquery-atwho-rails (= 0.1.7) 534 + jquery-atwho-rails (= 0.3.0)
535 jquery-rails (= 2.1.3) 535 jquery-rails (= 2.1.3)
536 jquery-turbolinks 536 jquery-turbolinks
537 jquery-ui-rails (= 2.0.2) 537 jquery-ui-rails (= 2.0.2)
app/assets/javascripts/gfm_auto_complete.js.coffee
@@ -2,37 +2,55 @@ @@ -2,37 +2,55 @@
2 2
3 window.GitLab ?= {} 3 window.GitLab ?= {}
4 GitLab.GfmAutoComplete = 4 GitLab.GfmAutoComplete =
  5 + # private_token: ''
  6 + dataSource: ''
5 # Emoji 7 # Emoji
6 Emoji: 8 Emoji:
7 - data: [] 9 + assetBase: ''
8 template: '<li data-value="${insert}">${name} <img alt="${name}" height="20" src="${image}" width="20" /></li>' 10 template: '<li data-value="${insert}">${name} <img alt="${name}" height="20" src="${image}" width="20" /></li>'
9 11
10 # Team Members 12 # Team Members
11 Members: 13 Members:
12 - data: []  
13 - url: ''  
14 - params:  
15 - private_token: ''  
16 template: '<li data-value="${username}">${username} <small>${name}</small></li>' 14 template: '<li data-value="${username}">${username} <small>${name}</small></li>'
17 15
  16 + Issues:
  17 + template: '<li data-value="${id}"><small>${id}</small> ${title} </li>'
  18 +
18 # Add GFM auto-completion to all input fields, that accept GFM input. 19 # Add GFM auto-completion to all input fields, that accept GFM input.
19 setup: -> 20 setup: ->
20 input = $('.js-gfm-input') 21 input = $('.js-gfm-input')
21 22
22 # Emoji 23 # Emoji
23 - input.atWho '(?:^|\\s):',  
24 - data: @Emoji.data 24 + input.atwho
  25 + at: ':'
25 tpl: @Emoji.template 26 tpl: @Emoji.template
  27 + callbacks:
  28 + before_save: (emojis) =>
  29 + $.map emojis, (em) => name: em, insert: em+ ':', image: "#{@Emoji.assetBase}/#{em}.png"
26 30
27 # Team Members 31 # Team Members
28 - input.atWho '@', 32 + input.atwho
  33 + at: '@'
29 tpl: @Members.template 34 tpl: @Members.template
30 - callback: (query, callback) =>  
31 - request_params = $.extend({}, @Members.params, query: query)  
32 - $.getJSON(@Members.url, request_params).done (members) =>  
33 - new_members_data = $.map(members, (m) ->  
34 - username: m.username,  
35 - name: m.name  
36 - )  
37 - callback(new_members_data) 35 + search_key: 'search'
  36 + callbacks:
  37 + before_save: (members) =>
  38 + $.map members, (m) => name: m.name, username: m.username, search: "#{m.username} #{m.name}"
  39 +
  40 + input.atwho
  41 + at: '#'
  42 + alias: 'issues'
  43 + search_key: 'search'
  44 + tpl: @Issues.template
  45 + callbacks:
  46 + before_save: (issues) ->
  47 + $.map issues, (i) -> id: i.id, title: i.title, search: "#{i.id} #{i.title}"
38 48
  49 + input.one "focus", =>
  50 + $.getJSON(@dataSource).done (data) ->
  51 + # load members
  52 + input.atwho 'load', "@", data.members
  53 + # load issues
  54 + input.atwho 'load', "issues", data.issues
  55 + # load emojis
  56 + input.atwho 'load', ":", data.emojis
app/controllers/projects_controller.rb
@@ -93,4 +93,16 @@ class ProjectsController &lt; ProjectResourceController @@ -93,4 +93,16 @@ class ProjectsController &lt; ProjectResourceController
93 format.js 93 format.js
94 end 94 end
95 end 95 end
  96 +
  97 + def autocomplete_sources
  98 + @suggestions = {
  99 + emojis: Emoji.names,
  100 + issues: @project.issues.select([:id, :title, :description]),
  101 + members: @project.users.select([:username, :name]).order(:username)
  102 + }
  103 +
  104 + respond_to do |format|
  105 + format.json { render :json => @suggestions }
  106 + end
  107 + end
96 end 108 end
app/views/layouts/_head_panel.html.haml
@@ -36,5 +36,3 @@ @@ -36,5 +36,3 @@
36 = link_to current_user, class: "profile-pic" do 36 = link_to current_user, class: "profile-pic" do
37 = image_tag gravatar_icon(current_user.email, 26) 37 = image_tag gravatar_icon(current_user.email, 26)
38 38
39 -  
40 -= render "layouts/init_auto_complete"  
app/views/layouts/_init_auto_complete.html.haml
1 :javascript 1 :javascript
2 $(function() { 2 $(function() {
3 - GitLab.GfmAutoComplete.Members.url = "#{ "/api/v3/projects/#{@project.id}/members" if @project }";  
4 - GitLab.GfmAutoComplete.Members.params.private_token = "#{current_user.private_token}";  
5 -  
6 - GitLab.GfmAutoComplete.Emoji.data = #{raw emoji_autocomplete_source};  
7 - // convert the list so that the items have the right format for completion  
8 - GitLab.GfmAutoComplete.Emoji.data = $.map(GitLab.GfmAutoComplete.Emoji.data, function(value) {  
9 - return {  
10 - name: value,  
11 - insert: value+':',  
12 - image: '#{image_path("emoji")}/'+value+'.png'  
13 - }  
14 - });  
15 - 3 + GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_project_path(@project)}"
  4 + GitLab.GfmAutoComplete.Emoji.assetBase = '#{image_path("emoji")}'
16 GitLab.GfmAutoComplete.setup(); 5 GitLab.GfmAutoComplete.setup();
17 }); 6 });
app/views/layouts/project_resource.html.haml
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 = render "layouts/head", title: @project.name_with_namespace 3 = render "layouts/head", title: @project.name_with_namespace
4 %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } 4 %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id }
5 = render "layouts/head_panel", title: project_title(@project) 5 = render "layouts/head_panel", title: project_title(@project)
  6 + = render "layouts/init_auto_complete"
6 = render "layouts/flash" 7 = render "layouts/flash"
7 - if can?(current_user, :download_code, @project) 8 - if can?(current_user, :download_code, @project)
8 = render 'shared/no_ssh' 9 = render 'shared/no_ssh'
config/routes.rb
@@ -168,6 +168,7 @@ Gitlab::Application.routes.draw do @@ -168,6 +168,7 @@ Gitlab::Application.routes.draw do
168 member do 168 member do
169 put :transfer 169 put :transfer
170 post :fork 170 post :fork
  171 + get :autocomplete_sources
171 end 172 end
172 173
173 resources :blob, only: [:show], constraints: {id: /.+/} 174 resources :blob, only: [:show], constraints: {id: /.+/}
spec/routing/project_routing_spec.rb
@@ -83,6 +83,10 @@ describe ProjectsController, &quot;routing&quot; do @@ -83,6 +83,10 @@ describe ProjectsController, &quot;routing&quot; do
83 get("/gitlabhq/edit").should route_to('projects#edit', id: 'gitlabhq') 83 get("/gitlabhq/edit").should route_to('projects#edit', id: 'gitlabhq')
84 end 84 end
85 85
  86 + it "to #autocomplete_sources" do
  87 + get('/gitlabhq/autocomplete_sources').should route_to('projects#autocomplete_sources', id: "gitlabhq")
  88 + end
  89 +
86 it "to #show" do 90 it "to #show" do
87 get("/gitlabhq").should route_to('projects#show', id: 'gitlabhq') 91 get("/gitlabhq").should route_to('projects#show', id: 'gitlabhq')
88 end 92 end