From bbd92e57cb5c764baf5fbdb9ccb1a1cd140eeca9 Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Tue, 9 Oct 2012 14:47:42 +0200 Subject: [PATCH 1/3] Add emoji_for_completion helper --- app/helpers/notes_helper.rb | 6 ++++++ spec/helpers/notes_helper_spec.rb | 10 ++++++++++ 2 files changed, 16 insertions(+) create mode 100644 spec/helpers/notes_helper_spec.rb diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 65389e38..9f75fc42 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -14,4 +14,10 @@ module NotesHelper "vote downvote" end end + + def emoji_for_completion + # should be an array of strings + # so to_s can be called, because it is sufficient and to_json is too slow + Emoji::NAMES + end end diff --git a/spec/helpers/notes_helper_spec.rb b/spec/helpers/notes_helper_spec.rb new file mode 100644 index 00000000..73481694 --- /dev/null +++ b/spec/helpers/notes_helper_spec.rb @@ -0,0 +1,10 @@ +require 'spec_helper' + +describe NotesHelper do + describe "#emoji_for_completion" do + it "should be an Array of Strings" do + emoji_for_completion.should be_a(Array) + emoji_for_completion.each { |emoji| emoji.should be_a(String) } + end + end +end From 3adfbe3e81697f61775d4d08d8eacde5a13a95c4 Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Tue, 9 Oct 2012 14:48:20 +0200 Subject: [PATCH 2/3] Mark inputs for notes with GFM capabilities --- app/views/notes/_common_form.html.haml | 2 +- app/views/notes/_per_line_form.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/notes/_common_form.html.haml b/app/views/notes/_common_form.html.haml index adaad9ec..260725e9 100644 --- a/app/views/notes/_common_form.html.haml +++ b/app/views/notes/_common_form.html.haml @@ -8,7 +8,7 @@ = f.hidden_field :noteable_id = f.hidden_field :noteable_type - = f.text_area :note, size: 255, class: 'note-text' + = f.text_area :note, size: 255, class: 'note-text gfm-input' #preview-note.preview_note.hide .hint .right Comments are parsed with #{link_to "GitLab Flavored Markdown", help_markdown_path, target: '_blank'}. diff --git a/app/views/notes/_per_line_form.html.haml b/app/views/notes/_per_line_form.html.haml index 8e31b59e..ee0cde4b 100644 --- a/app/views/notes/_per_line_form.html.haml +++ b/app/views/notes/_per_line_form.html.haml @@ -13,7 +13,7 @@ = f.hidden_field :noteable_id = f.hidden_field :noteable_type = f.hidden_field :line_code - = f.text_area :note, size: 255, class: 'line-note-text' + = f.text_area :note, size: 255, class: 'line-note-text gfm-input' .note_actions .buttons = f.submit 'Add note', class: "btn save-btn submit_note submit_inline_note", id: "submit_note" From 37e579ce10376ef16f9e9f28b81b0ca788438204 Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Tue, 9 Oct 2012 14:48:35 +0200 Subject: [PATCH 3/3] Redo the auto-completion JS for notes --- app/views/notes/_common_form.html.haml | 50 +++++++++++++++++++++----- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/app/views/notes/_common_form.html.haml b/app/views/notes/_common_form.html.haml index 260725e9..4ac26d33 100644 --- a/app/views/notes/_common_form.html.haml +++ b/app/views/notes/_common_form.html.haml @@ -39,12 +39,46 @@ :javascript $(function(){ - var names = #{@project.users.pluck(:name)}, emoji = ['+1', '-1']; - var emoji = $.map(emoji, function(value, i) {return {key:value + ':', name:value}}); - $('#note_note, .per_line_form .line-note-text'). - atWho('@', { data: names }). - atWho(':', { - data: emoji, - tpl: "
  • ${name} #{escape_javascript image_tag('emoji/${name}.png', :size => '20x20')}
  • " - }); + // init auto-completion of team members + var membersUrl = "#{root_url}/api/v2/projects/#{@project.code}/members"; + var membersParams = { + private_token: "#{current_user.authentication_token}", + page: 1, + }; + var membersData = []; + $('.gfm-input').atWho('@', function(query, callback) { + (function getMoreMembers() { + $.getJSON(membersUrl, membersParams). + success(function(members) { + // pick the data we need + var newMembersData = $.map(members, function(member) { return member.name }); + + // add the new page of data to the rest + $.merge(membersData, newMembersData); + + // show the pop-up with a copy of the current data + callback(membersData.slice(0)); + + // are we past the last page? + if (newMembersData.length == 0) { + // set static data and stop callbacks + $('.gfm-input').atWho('@', { data: membersData, callback: null }); + } else { + // get next page + getMoreMembers(); + } + }); + // next request will get the next page + membersParams.page += 1; + })(); + }); + + // init auto-completion of emoji + var emoji = #{emoji_for_completion}; + // convert the list so that the items have the right format for completion + emoji = $.map(emoji, function(value) {return { key: value+':', name: value }}); + $('.gfm-input').atWho(':', { + data: emoji, + tpl: "
  • ${name} #{escape_javascript image_tag('emoji/${name}.png', :size => '20x20')}
  • " + }); });