From 682f62fd4addb38843a9047b9ac47eb5ba94a30e Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Tue, 9 Oct 2012 23:06:33 +0200 Subject: [PATCH 1/4] Mark all GFM capable inputs --- app/views/issues/_form.html.haml | 4 ++-- app/views/merge_requests/_form.html.haml | 2 +- app/views/wikis/_form.html.haml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/issues/_form.html.haml b/app/views/issues/_form.html.haml index 813ecab2..ec3edce0 100644 --- a/app/views/issues/_form.html.haml +++ b/app/views/issues/_form.html.haml @@ -12,7 +12,7 @@ = f.label :title do %strong= "Subject *" .input - = f.text_field :title, maxlength: 255, class: "xxlarge" + = f.text_field :title, maxlength: 255, class: "xxlarge gfm-input" .issue_middle_block .issue_assignee = f.label :assignee_id do @@ -37,7 +37,7 @@ .clearfix = f.label :description, "Details" .input - = f.text_area :description, maxlength: 2000, class: "xxlarge", rows: 14 + = f.text_area :description, maxlength: 2000, class: "xxlarge gfm-input", rows: 14 %p.hint Issues are parsed with #{link_to "GitLab Flavored Markdown", help_markdown_path, target: '_blank'}. diff --git a/app/views/merge_requests/_form.html.haml b/app/views/merge_requests/_form.html.haml index 96692c0f..f42d74e1 100644 --- a/app/views/merge_requests/_form.html.haml +++ b/app/views/merge_requests/_form.html.haml @@ -38,7 +38,7 @@ .top_box_content = f.label :title do %strong= "Title *" - .input= f.text_field :title, class: "input-xxlarge pad", maxlength: 255, rows: 5 + .input= f.text_field :title, class: "input-xxlarge pad gfm-input", maxlength: 255, rows: 5 .middle_box_content = f.label :assignee_id do %i.icon-user diff --git a/app/views/wikis/_form.html.haml b/app/views/wikis/_form.html.haml index b05d0a78..89bbe2ea 100644 --- a/app/views/wikis/_form.html.haml +++ b/app/views/wikis/_form.html.haml @@ -21,7 +21,7 @@ .bottom_box_content = f.label :content - .input= f.text_area :content, class: 'span8' + .input= f.text_area :content, class: 'span8 gfm-input' .actions = f.submit 'Save', class: "save-btn btn" = link_to "Cancel", project_wiki_path(@project, :index), class: "btn cancel-btn" From eb92813757d8ec14819ddbab6efae7e7cdd403e6 Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Wed, 10 Oct 2012 00:53:42 +0200 Subject: [PATCH 2/4] Move emoji auto-complete helper to ApplicationHelper --- app/helpers/application_helper.rb | 6 ++++++ app/helpers/notes_helper.rb | 6 ------ spec/helpers/notes_helper_spec.rb | 10 ---------- 3 files changed, 6 insertions(+), 16 deletions(-) delete mode 100644 spec/helpers/notes_helper_spec.rb diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 911b46c9..8c65a0fd 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -98,6 +98,12 @@ module ApplicationHelper [projects, default_nav, project_nav].flatten.to_json end + def emoji_autocomplete_source + # should be an array of strings + # so to_s can be called, because it is sufficient and to_json is too slow + Emoji::NAMES.to_s + end + def ldap_enable? Devise.omniauth_providers.include?(:ldap) end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 9f75fc42..65389e38 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -14,10 +14,4 @@ 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 deleted file mode 100644 index 73481694..00000000 --- a/spec/helpers/notes_helper_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -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 e4aa5a5c8f9d8a4b556aeba003160017821ed9a3 Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Wed, 10 Oct 2012 00:16:52 +0200 Subject: [PATCH 3/4] Extract and split GFM auto-completion setup JS * static initialization and setup moved to assets * per request initialization moved to layout partial --- .../javascripts/gfm_auto_complete.js.coffee | 57 +++++++++++++++++++ app/views/layouts/_head_panel.html.haml | 2 + .../layouts/_init_auto_complete.html.haml | 17 ++++++ app/views/notes/_common_form.html.haml | 46 --------------- 4 files changed, 76 insertions(+), 46 deletions(-) create mode 100644 app/assets/javascripts/gfm_auto_complete.js.coffee create mode 100644 app/views/layouts/_init_auto_complete.html.haml diff --git a/app/assets/javascripts/gfm_auto_complete.js.coffee b/app/assets/javascripts/gfm_auto_complete.js.coffee new file mode 100644 index 00000000..203a5b67 --- /dev/null +++ b/app/assets/javascripts/gfm_auto_complete.js.coffee @@ -0,0 +1,57 @@ + +### + Creates the variables for setting up GFM auto-completion +### +# Emoji +window.autocompleteEmojiData = []; +window.autocompleteEmojiTemplate = "
  • ${name} ${name}
  • "; + +# Team Members +window.autocompleteMembersUrl = ""; +window.autocompleteMembersParams = + private_token: "" + page: 1 +window.autocompleteMembersData = []; + + + +### + Add GFM auto-completion to all input fields, that accept GFM input. +### +window.setupGfmAutoComplete = -> + ### + Emoji + ### + $('.gfm-input').atWho ':', + data: autocompleteEmojiData, + tpl: autocompleteEmojiTemplate + + ### + Team Members + ### + $('.gfm-input').atWho '@', (query, callback) -> + (getMoreMembers = -> + $.getJSON(autocompleteMembersUrl, autocompleteMembersParams) + .success (members) -> + # pick the data we need + newMembersData = $.map members, (m) -> m.name + + # add the new page of data to the rest + $.merge autocompleteMembersData, newMembersData + + # show the pop-up with a copy of the current data + callback autocompleteMembersData[..] + + # are we past the last page? + if newMembersData.length == 0 + # set static data and stop callbacks + $('.gfm-input').atWho '@', + data: autocompleteMembersData + callback: null + else + # get next page + getMoreMembers() + + # so the next request gets the next page + autocompleteMembersParams.page += 1; + ).call(); \ No newline at end of file diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index f5e423a5..7f89bdf0 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -28,6 +28,8 @@ My profile = link_to 'Logout', destroy_user_session_path, class: "logout", method: :delete += render "layouts/init_auto_complete" + :javascript $(function(){ $("#search").autocomplete({ diff --git a/app/views/layouts/_init_auto_complete.html.haml b/app/views/layouts/_init_auto_complete.html.haml new file mode 100644 index 00000000..87a74655 --- /dev/null +++ b/app/views/layouts/_init_auto_complete.html.haml @@ -0,0 +1,17 @@ +:javascript + $(function() { + autocompleteMembersUrl = "#{ "/api/v2/projects/#{@project.code}/members" if @project }"; + autocompleteMembersParams.private_token = "#{current_user.authentication_token}"; + + autocompleteEmojiData = #{raw emoji_autocomplete_source}; + // convert the list so that the items have the right format for completion + autocompleteEmojiData = $.map(autocompleteEmojiData, function(value) { + return { + name: value, + insert: value+':', + image: '#{image_path("emoji")}/'+value+'.png' + } + }); + + setupGfmAutoComplete(); + }); diff --git a/app/views/notes/_common_form.html.haml b/app/views/notes/_common_form.html.haml index 4ac26d33..a9f2907b 100644 --- a/app/views/notes/_common_form.html.haml +++ b/app/views/notes/_common_form.html.haml @@ -36,49 +36,3 @@ %a.file_upload.btn.small Upload File = f.file_field :attachment, class: "input-file" %span.hint Any file less than 10 MB - -:javascript - $(function(){ - // 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')}
  • " - }); - }); From 4d843d2ce1e12525637e2a578896686a4efb9a55 Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Tue, 9 Oct 2012 23:54:14 +0200 Subject: [PATCH 4/4] Fix auto-completion for forms that are inserted with JS --- app/assets/javascripts/issues.js | 2 ++ app/views/notes/_create_common_note.js.haml | 1 + 2 files changed, 3 insertions(+) diff --git a/app/assets/javascripts/issues.js b/app/assets/javascripts/issues.js index 3ddc6926..c3cf364f 100644 --- a/app/assets/javascripts/issues.js +++ b/app/assets/javascripts/issues.js @@ -6,6 +6,7 @@ function switchToNewIssue(form){ $("#new_issue_dialog").show("fade", { direction: "right" }, 150); $('.top-tabs .add_new').hide(); disableButtonIfEmptyField("#issue_title", ".save-btn"); + setupGfmAutoComplete(); }); } @@ -17,6 +18,7 @@ function switchToEditIssue(form){ $("#edit_issue_dialog").show("fade", { direction: "right" }, 150); $('.add_new').hide(); disableButtonIfEmptyField("#issue_title", ".save-btn"); + setupGfmAutoComplete(); }); } diff --git a/app/views/notes/_create_common_note.js.haml b/app/views/notes/_create_common_note.js.haml index bbebc247..e7df64c4 100644 --- a/app/views/notes/_create_common_note.js.haml +++ b/app/views/notes/_create_common_note.js.haml @@ -10,4 +10,5 @@ - else :plain $(".note-form-holder").replaceWith("#{escape_javascript(render 'form')}"); + setupGfmAutoComplete();