Commit d2be7577c12766618fd8f57c8328fd847cfa8264

Authored by Riyad Preukschas
2 parents 645afc38 a5861b8f

Merge pull request #2243 from jouve/fix_gfm_username_autocomplete

fix gfm autocomplete for usernames
app/assets/javascripts/gfm_auto_complete.js.coffee
1 # Creates the variables for setting up GFM auto-completion 1 # Creates the variables for setting up GFM auto-completion
2 2
3 window.GitLab ?= {} 3 window.GitLab ?= {}
4 -GitLab.GfmAutoComplete ?= {}  
5 -  
6 -# Emoji  
7 -data = []  
8 -template = "<li data-value='${insert}'>${name} <img alt='${name}' height='20' src='${image}' width='20' /></li>"  
9 -GitLab.GfmAutoComplete.Emoji = {data, template}  
10 -  
11 -# Team Members  
12 -data = []  
13 -url = '';  
14 -params = {private_token: '', page: 1}  
15 -GitLab.GfmAutoComplete.Members = {data, url, params}  
16 -  
17 -# Add GFM auto-completion to all input fields, that accept GFM input.  
18 -GitLab.GfmAutoComplete.setup = ->  
19 - input = $('.js-gfm-input')  
20 - 4 +GitLab.GfmAutoComplete =
21 # Emoji 5 # Emoji
22 - input.atWho ':',  
23 - data: GitLab.GfmAutoComplete.Emoji.data,  
24 - tpl: GitLab.GfmAutoComplete.Emoji.template 6 + Emoji:
  7 + data: []
  8 + template: '<li data-value="${insert}">${name} <img alt="${name}" height="20" src="${image}" width="20" /></li>'
25 9
26 # Team Members 10 # Team Members
27 - input.atWho '@', (query, callback) ->  
28 - (getMoreMembers = ->  
29 - $.getJSON(GitLab.GfmAutoComplete.Members.url, GitLab.GfmAutoComplete.Members.params)  
30 - .success (members) ->  
31 - # pick the data we need  
32 - newMembersData = $.map(members, (m) -> m.name )  
33 -  
34 - # add the new page of data to the rest  
35 - $.merge(GitLab.GfmAutoComplete.Members.data, newMembersData)  
36 -  
37 - # show the pop-up with a copy of the current data  
38 - callback(GitLab.GfmAutoComplete.Members.data[..])  
39 -  
40 - # are we past the last page?  
41 - if newMembersData.length is 0  
42 - # set static data and stop callbacks  
43 - input.atWho '@',  
44 - data: GitLab.GfmAutoComplete.Members.data  
45 - callback: null  
46 - else  
47 - # get next page  
48 - getMoreMembers()  
49 -  
50 - # so the next request gets the next page  
51 - GitLab.GfmAutoComplete.Members.params.page += 1  
52 - ).call() 11 + Members:
  12 + data: []
  13 + url: ''
  14 + params:
  15 + private_token: ''
  16 + page: 1
  17 + template: '<li data-value="${username}">${username} <small>${name}</small></li>'
  18 +
  19 + # Add GFM auto-completion to all input fields, that accept GFM input.
  20 + setup: ->
  21 + input = $('.js-gfm-input')
  22 +
  23 + # Emoji
  24 + input.atWho ':',
  25 + data: @Emoji.data
  26 + tpl: @Emoji.template
  27 +
  28 + # Team Members
  29 + input.atWho '@',
  30 + tpl: @Members.template
  31 + callback: (query, callback) =>
  32 + (getMoreMembers = =>
  33 + $.getJSON(@Members.url, @Members.params).done (members) =>
  34 + # pick the data we need
  35 + newMembersData = $.map(members, (m) ->
  36 + username: m.username
  37 + name: m.name
  38 + )
  39 +
  40 + # add the new page of data to the rest
  41 + $.merge(@Members.data, newMembersData)
  42 +
  43 + # show the pop-up with a copy of the current data
  44 + callback(@Members.data[..])
  45 +
  46 + # are we past the last page?
  47 + if newMembersData.length is 0
  48 + # set static data and stop callbacks
  49 + input.atWho '@',
  50 + data: @Members.data
  51 + callback: null
  52 + else
  53 + # get next page
  54 + getMoreMembers()
  55 +
  56 + # so the next callback requests the next page
  57 + @Members.params.page += 1
  58 + ).call()
doc/api/issues.md
@@ -18,6 +18,7 @@ GET /issues @@ -18,6 +18,7 @@ GET /issues
18 "assignee": null, 18 "assignee": null,
19 "author": { 19 "author": {
20 "id": 1, 20 "id": 1,
  21 + "username": "john_smith",
21 "email": "john@example.com", 22 "email": "john@example.com",
22 "name": "John Smith", 23 "name": "John Smith",
23 "blocked": false, 24 "blocked": false,
@@ -46,6 +47,7 @@ GET /issues @@ -46,6 +47,7 @@ GET /issues
46 }, 47 },
47 "assignee": { 48 "assignee": {
48 "id": 2, 49 "id": 2,
  50 + "username": "jack_smith",
49 "email": "jack@example.com", 51 "email": "jack@example.com",
50 "name": "Jack Smith", 52 "name": "Jack Smith",
51 "blocked": false, 53 "blocked": false,
@@ -53,6 +55,7 @@ GET /issues @@ -53,6 +55,7 @@ GET /issues
53 }, 55 },
54 "author": { 56 "author": {
55 "id": 1, 57 "id": 1,
  58 + "username": "john_smith",
56 "email": "john@example.com", 59 "email": "john@example.com",
57 "name": "John Smith", 60 "name": "John Smith",
58 "blocked": false, 61 "blocked": false,
@@ -110,6 +113,7 @@ Parameters: @@ -110,6 +113,7 @@ Parameters:
110 }, 113 },
111 "assignee": { 114 "assignee": {
112 "id": 2, 115 "id": 2,
  116 + "username": "jack_smith",
113 "email": "jack@example.com", 117 "email": "jack@example.com",
114 "name": "Jack Smith", 118 "name": "Jack Smith",
115 "blocked": false, 119 "blocked": false,
@@ -117,6 +121,7 @@ Parameters: @@ -117,6 +121,7 @@ Parameters:
117 }, 121 },
118 "author": { 122 "author": {
119 "id": 1, 123 "id": 1,
  124 + "username": "john_smith",
120 "email": "john@example.com", 125 "email": "john@example.com",
121 "name": "John Smith", 126 "name": "John Smith",
122 "blocked": false, 127 "blocked": false,
doc/api/merge_requests.md
@@ -22,6 +22,7 @@ Parameters: @@ -22,6 +22,7 @@ Parameters:
22 "merged":false, 22 "merged":false,
23 "author":{ 23 "author":{
24 "id":1, 24 "id":1,
  25 + "username": "admin",
25 "email":"admin@local.host", 26 "email":"admin@local.host",
26 "name":"Administrator", 27 "name":"Administrator",
27 "blocked":false, 28 "blocked":false,
@@ -29,6 +30,7 @@ Parameters: @@ -29,6 +30,7 @@ Parameters:
29 }, 30 },
30 "assignee":{ 31 "assignee":{
31 "id":1, 32 "id":1,
  33 + "username": "admin",
32 "email":"admin@local.host", 34 "email":"admin@local.host",
33 "name":"Administrator", 35 "name":"Administrator",
34 "blocked":false, 36 "blocked":false,
@@ -62,6 +64,7 @@ Parameters: @@ -62,6 +64,7 @@ Parameters:
62 "merged":false, 64 "merged":false,
63 "author":{ 65 "author":{
64 "id":1, 66 "id":1,
  67 + "username": "admin",
65 "email":"admin@local.host", 68 "email":"admin@local.host",
66 "name":"Administrator", 69 "name":"Administrator",
67 "blocked":false, 70 "blocked":false,
@@ -69,6 +72,7 @@ Parameters: @@ -69,6 +72,7 @@ Parameters:
69 }, 72 },
70 "assignee":{ 73 "assignee":{
71 "id":1, 74 "id":1,
  75 + "username": "admin",
72 "email":"admin@local.host", 76 "email":"admin@local.host",
73 "name":"Administrator", 77 "name":"Administrator",
74 "blocked":false, 78 "blocked":false,
@@ -105,6 +109,7 @@ Parameters: @@ -105,6 +109,7 @@ Parameters:
105 "merged":false, 109 "merged":false,
106 "author":{ 110 "author":{
107 "id":1, 111 "id":1,
  112 + "username": "admin",
108 "email":"admin@local.host", 113 "email":"admin@local.host",
109 "name":"Administrator", 114 "name":"Administrator",
110 "blocked":false, 115 "blocked":false,
@@ -112,6 +117,7 @@ Parameters: @@ -112,6 +117,7 @@ Parameters:
112 }, 117 },
113 "assignee":{ 118 "assignee":{
114 "id":1, 119 "id":1,
  120 + "username": "admin",
115 "email":"admin@local.host", 121 "email":"admin@local.host",
116 "name":"Administrator", 122 "name":"Administrator",
117 "blocked":false, 123 "blocked":false,
@@ -150,6 +156,7 @@ Parameters: @@ -150,6 +156,7 @@ Parameters:
150 "merged":false, 156 "merged":false,
151 "author":{ 157 "author":{
152 "id":1, 158 "id":1,
  159 + "username": "admin",
153 "email":"admin@local.host", 160 "email":"admin@local.host",
154 "name":"Administrator", 161 "name":"Administrator",
155 "blocked":false, 162 "blocked":false,
@@ -157,6 +164,7 @@ Parameters: @@ -157,6 +164,7 @@ Parameters:
157 }, 164 },
158 "assignee":{ 165 "assignee":{
159 "id":1, 166 "id":1,
  167 + "username": "admin",
160 "email":"admin@local.host", 168 "email":"admin@local.host",
161 "name":"Administrator", 169 "name":"Administrator",
162 "blocked":false, 170 "blocked":false,
@@ -184,6 +192,7 @@ Will return created note with status `201 Created` on success, or `404 Not found @@ -184,6 +192,7 @@ Will return created note with status `201 Created` on success, or `404 Not found
184 { 192 {
185 "author":{ 193 "author":{
186 "id":1, 194 "id":1,
  195 + "username": "admin",
187 "email":"admin@local.host", 196 "email":"admin@local.host",
188 "name":"Administrator", 197 "name":"Administrator",
189 "blocked":false, 198 "blocked":false,
doc/api/notes.md
@@ -15,6 +15,7 @@ GET /projects/:id/notes @@ -15,6 +15,7 @@ GET /projects/:id/notes
15 "body": "The solution is rather tricky", 15 "body": "The solution is rather tricky",
16 "author": { 16 "author": {
17 "id": 1, 17 "id": 1,
  18 + "username": "john_smith",
18 "email": "john@example.com", 19 "email": "john@example.com",
19 "name": "John Smith", 20 "name": "John Smith",
20 "blocked": false, 21 "blocked": false,
doc/api/projects.md
@@ -17,6 +17,7 @@ GET /projects @@ -17,6 +17,7 @@ GET /projects
17 "default_branch": "master", 17 "default_branch": "master",
18 "owner": { 18 "owner": {
19 "id": 1, 19 "id": 1,
  20 + "username": "john_smith",
20 "email": "john@example.com", 21 "email": "john@example.com",
21 "name": "John Smith", 22 "name": "John Smith",
22 "blocked": false, 23 "blocked": false,
@@ -38,6 +39,7 @@ GET /projects @@ -38,6 +39,7 @@ GET /projects
38 "default_branch": "api", 39 "default_branch": "api",
39 "owner": { 40 "owner": {
40 "id": 1, 41 "id": 1,
  42 + "username": "john_smith",
41 "email": "john@example.com", 43 "email": "john@example.com",
42 "name": "John Smith", 44 "name": "John Smith",
43 "blocked": false, 45 "blocked": false,
@@ -75,6 +77,7 @@ Parameters: @@ -75,6 +77,7 @@ Parameters:
75 "default_branch": "api", 77 "default_branch": "api",
76 "owner": { 78 "owner": {
77 "id": 1, 79 "id": 1,
  80 + "username": "john_smith",
78 "email": "john@example.com", 81 "email": "john@example.com",
79 "name": "John Smith", 82 "name": "John Smith",
80 "blocked": false, 83 "blocked": false,
@@ -141,6 +144,7 @@ Parameters: @@ -141,6 +144,7 @@ Parameters:
141 { 144 {
142 145
143 "id": 1, 146 "id": 1,
  147 + "username": "john_smith",
144 "email": "john@example.com", 148 "email": "john@example.com",
145 "name": "John Smith", 149 "name": "John Smith",
146 "blocked": false, 150 "blocked": false,
doc/api/session.md
@@ -13,6 +13,7 @@ Parameters: @@ -13,6 +13,7 @@ Parameters:
13 ```json 13 ```json
14 { 14 {
15 "id": 1, 15 "id": 1,
  16 + "username": "john_smith",
16 "email": "john@example.com", 17 "email": "john@example.com",
17 "name": "John Smith", 18 "name": "John Smith",
18 "private_token": "dd34asd13as", 19 "private_token": "dd34asd13as",
doc/api/snippets.md
@@ -30,6 +30,7 @@ Parameters: @@ -30,6 +30,7 @@ Parameters:
30 "file_name": "add.rb", 30 "file_name": "add.rb",
31 "author": { 31 "author": {
32 "id": 1, 32 "id": 1,
  33 + "username": "john_smith",
33 "email": "john@example.com", 34 "email": "john@example.com",
34 "name": "John Smith", 35 "name": "John Smith",
35 "blocked": false, 36 "blocked": false,
doc/api/users.md
@@ -10,6 +10,7 @@ GET /users @@ -10,6 +10,7 @@ GET /users
10 [ 10 [
11 { 11 {
12 "id": 1, 12 "id": 1,
  13 + "username": "john_smith",
13 "email": "john@example.com", 14 "email": "john@example.com",
14 "name": "John Smith", 15 "name": "John Smith",
15 "blocked": false, 16 "blocked": false,
@@ -23,6 +24,7 @@ GET /users @@ -23,6 +24,7 @@ GET /users
23 }, 24 },
24 { 25 {
25 "id": 2, 26 "id": 2,
  27 + "username": "jack_smith",
26 "email": "jack@example.com", 28 "email": "jack@example.com",
27 "name": "Jack Smith", 29 "name": "Jack Smith",
28 "blocked": false, 30 "blocked": false,
@@ -52,6 +54,7 @@ Parameters: @@ -52,6 +54,7 @@ Parameters:
52 ```json 54 ```json
53 { 55 {
54 "id": 1, 56 "id": 1,
  57 + "username": "john_smith",
55 "email": "john@example.com", 58 "email": "john@example.com",
56 "name": "John Smith", 59 "name": "John Smith",
57 "blocked": false, 60 "blocked": false,
@@ -75,6 +78,7 @@ POST /users @@ -75,6 +78,7 @@ POST /users
75 Parameters: 78 Parameters:
76 + `email` (required) - Email 79 + `email` (required) - Email
77 + `password` (required) - Password 80 + `password` (required) - Password
  81 ++ `username` (required) - Username
78 + `name` (required) - Name 82 + `name` (required) - Name
79 + `skype` - Skype ID 83 + `skype` - Skype ID
80 + `linkedin` - Linkedin 84 + `linkedin` - Linkedin
@@ -95,6 +99,7 @@ GET /user @@ -95,6 +99,7 @@ GET /user
95 ```json 99 ```json
96 { 100 {
97 "id": 1, 101 "id": 1,
  102 + "username": "john_smith",
98 "email": "john@example.com", 103 "email": "john@example.com",
99 "name": "John Smith", 104 "name": "John Smith",
100 "blocked": false, 105 "blocked": false,
lib/api/entities.rb
1 module Gitlab 1 module Gitlab
2 module Entities 2 module Entities
3 class User < Grape::Entity 3 class User < Grape::Entity
4 - expose :id, :email, :name, :bio, :skype, :linkedin, :twitter, 4 + expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter,
5 :dark_scheme, :theme_id, :blocked, :created_at 5 :dark_scheme, :theme_id, :blocked, :created_at
6 end 6 end
7 7
8 class UserBasic < Grape::Entity 8 class UserBasic < Grape::Entity
9 - expose :id, :email, :name, :blocked, :created_at 9 + expose :id, :username, :email, :name, :blocked, :created_at
10 end 10 end
11 11
12 class UserLogin < UserBasic 12 class UserLogin < UserBasic