Commit fa325ce97796a1ae25d64a4ec63bdad6599e98d7
Exists in
master
and in
4 other branches
Merge pull request #1597 from riyad/add-completion-for-all-emoji
Improve completion of emoji and team members
Showing
4 changed files
with
60 additions
and
10 deletions
Show diff stats
app/helpers/notes_helper.rb
@@ -14,4 +14,10 @@ module NotesHelper | @@ -14,4 +14,10 @@ module NotesHelper | ||
14 | "vote downvote" | 14 | "vote downvote" |
15 | end | 15 | end |
16 | end | 16 | end |
17 | + | ||
18 | + def emoji_for_completion | ||
19 | + # should be an array of strings | ||
20 | + # so to_s can be called, because it is sufficient and to_json is too slow | ||
21 | + Emoji::NAMES | ||
22 | + end | ||
17 | end | 23 | end |
app/views/notes/_common_form.html.haml
@@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
8 | 8 | ||
9 | = f.hidden_field :noteable_id | 9 | = f.hidden_field :noteable_id |
10 | = f.hidden_field :noteable_type | 10 | = f.hidden_field :noteable_type |
11 | - = f.text_area :note, size: 255, class: 'note-text' | 11 | + = f.text_area :note, size: 255, class: 'note-text gfm-input' |
12 | #preview-note.preview_note.hide | 12 | #preview-note.preview_note.hide |
13 | .hint | 13 | .hint |
14 | .right Comments are parsed with #{link_to "GitLab Flavored Markdown", help_markdown_path, target: '_blank'}. | 14 | .right Comments are parsed with #{link_to "GitLab Flavored Markdown", help_markdown_path, target: '_blank'}. |
@@ -39,12 +39,46 @@ | @@ -39,12 +39,46 @@ | ||
39 | 39 | ||
40 | :javascript | 40 | :javascript |
41 | $(function(){ | 41 | $(function(){ |
42 | - var names = #{@project.users.pluck(:name)}, emoji = ['+1', '-1']; | ||
43 | - var emoji = $.map(emoji, function(value, i) {return {key:value + ':', name:value}}); | ||
44 | - $('#note_note, .per_line_form .line-note-text'). | ||
45 | - atWho('@', { data: names }). | ||
46 | - atWho(':', { | ||
47 | - data: emoji, | ||
48 | - tpl: "<li data-value='${key}'>${name} #{escape_javascript image_tag('emoji/${name}.png', :size => '20x20')}</li>" | ||
49 | - }); | 42 | + // init auto-completion of team members |
43 | + var membersUrl = "#{root_url}/api/v2/projects/#{@project.code}/members"; | ||
44 | + var membersParams = { | ||
45 | + private_token: "#{current_user.authentication_token}", | ||
46 | + page: 1, | ||
47 | + }; | ||
48 | + var membersData = []; | ||
49 | + $('.gfm-input').atWho('@', function(query, callback) { | ||
50 | + (function getMoreMembers() { | ||
51 | + $.getJSON(membersUrl, membersParams). | ||
52 | + success(function(members) { | ||
53 | + // pick the data we need | ||
54 | + var newMembersData = $.map(members, function(member) { return member.name }); | ||
55 | + | ||
56 | + // add the new page of data to the rest | ||
57 | + $.merge(membersData, newMembersData); | ||
58 | + | ||
59 | + // show the pop-up with a copy of the current data | ||
60 | + callback(membersData.slice(0)); | ||
61 | + | ||
62 | + // are we past the last page? | ||
63 | + if (newMembersData.length == 0) { | ||
64 | + // set static data and stop callbacks | ||
65 | + $('.gfm-input').atWho('@', { data: membersData, callback: null }); | ||
66 | + } else { | ||
67 | + // get next page | ||
68 | + getMoreMembers(); | ||
69 | + } | ||
70 | + }); | ||
71 | + // next request will get the next page | ||
72 | + membersParams.page += 1; | ||
73 | + })(); | ||
74 | + }); | ||
75 | + | ||
76 | + // init auto-completion of emoji | ||
77 | + var emoji = #{emoji_for_completion}; | ||
78 | + // convert the list so that the items have the right format for completion | ||
79 | + emoji = $.map(emoji, function(value) {return { key: value+':', name: value }}); | ||
80 | + $('.gfm-input').atWho(':', { | ||
81 | + data: emoji, | ||
82 | + tpl: "<li data-value='${key}'>${name} #{escape_javascript image_tag('emoji/${name}.png', :size => '20x20')}</li>" | ||
83 | + }); | ||
50 | }); | 84 | }); |
app/views/notes/_per_line_form.html.haml
@@ -13,7 +13,7 @@ | @@ -13,7 +13,7 @@ | ||
13 | = f.hidden_field :noteable_id | 13 | = f.hidden_field :noteable_id |
14 | = f.hidden_field :noteable_type | 14 | = f.hidden_field :noteable_type |
15 | = f.hidden_field :line_code | 15 | = f.hidden_field :line_code |
16 | - = f.text_area :note, size: 255, class: 'line-note-text' | 16 | + = f.text_area :note, size: 255, class: 'line-note-text gfm-input' |
17 | .note_actions | 17 | .note_actions |
18 | .buttons | 18 | .buttons |
19 | = f.submit 'Add note', class: "btn save-btn submit_note submit_inline_note", id: "submit_note" | 19 | = f.submit 'Add note', class: "btn save-btn submit_note submit_inline_note", id: "submit_note" |
@@ -0,0 +1,10 @@ | @@ -0,0 +1,10 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe NotesHelper do | ||
4 | + describe "#emoji_for_completion" do | ||
5 | + it "should be an Array of Strings" do | ||
6 | + emoji_for_completion.should be_a(Array) | ||
7 | + emoji_for_completion.each { |emoji| emoji.should be_a(String) } | ||
8 | + end | ||
9 | + end | ||
10 | +end |