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} ${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