Commit e4aa5a5c8f9d8a4b556aeba003160017821ed9a3

Authored by Riyad Preukschas
1 parent eb928137

Extract and split GFM auto-completion setup JS

* static initialization and setup moved to assets
* per request initialization moved to layout partial
app/assets/javascripts/gfm_auto_complete.js.coffee 0 → 100644
@@ -0,0 +1,57 @@ @@ -0,0 +1,57 @@
  1 +
  2 +###
  3 + Creates the variables for setting up GFM auto-completion
  4 +###
  5 +# Emoji
  6 +window.autocompleteEmojiData = [];
  7 +window.autocompleteEmojiTemplate = "<li data-value='${insert}'>${name} <img alt='${name}' height='20' src='${image}' width='20' /></li>";
  8 +
  9 +# Team Members
  10 +window.autocompleteMembersUrl = "";
  11 +window.autocompleteMembersParams =
  12 + private_token: ""
  13 + page: 1
  14 +window.autocompleteMembersData = [];
  15 +
  16 +
  17 +
  18 +###
  19 + Add GFM auto-completion to all input fields, that accept GFM input.
  20 +###
  21 +window.setupGfmAutoComplete = ->
  22 + ###
  23 + Emoji
  24 + ###
  25 + $('.gfm-input').atWho ':',
  26 + data: autocompleteEmojiData,
  27 + tpl: autocompleteEmojiTemplate
  28 +
  29 + ###
  30 + Team Members
  31 + ###
  32 + $('.gfm-input').atWho '@', (query, callback) ->
  33 + (getMoreMembers = ->
  34 + $.getJSON(autocompleteMembersUrl, autocompleteMembersParams)
  35 + .success (members) ->
  36 + # pick the data we need
  37 + newMembersData = $.map members, (m) -> m.name
  38 +
  39 + # add the new page of data to the rest
  40 + $.merge autocompleteMembersData, newMembersData
  41 +
  42 + # show the pop-up with a copy of the current data
  43 + callback autocompleteMembersData[..]
  44 +
  45 + # are we past the last page?
  46 + if newMembersData.length == 0
  47 + # set static data and stop callbacks
  48 + $('.gfm-input').atWho '@',
  49 + data: autocompleteMembersData
  50 + callback: null
  51 + else
  52 + # get next page
  53 + getMoreMembers()
  54 +
  55 + # so the next request gets the next page
  56 + autocompleteMembersParams.page += 1;
  57 + ).call();
0 \ No newline at end of file 58 \ No newline at end of file
app/views/layouts/_head_panel.html.haml
@@ -28,6 +28,8 @@ @@ -28,6 +28,8 @@
28 My profile 28 My profile
29 = link_to 'Logout', destroy_user_session_path, class: "logout", method: :delete 29 = link_to 'Logout', destroy_user_session_path, class: "logout", method: :delete
30 30
  31 += render "layouts/init_auto_complete"
  32 +
31 :javascript 33 :javascript
32 $(function(){ 34 $(function(){
33 $("#search").autocomplete({ 35 $("#search").autocomplete({
app/views/layouts/_init_auto_complete.html.haml 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +:javascript
  2 + $(function() {
  3 + autocompleteMembersUrl = "#{ "/api/v2/projects/#{@project.code}/members" if @project }";
  4 + autocompleteMembersParams.private_token = "#{current_user.authentication_token}";
  5 +
  6 + autocompleteEmojiData = #{raw emoji_autocomplete_source};
  7 + // convert the list so that the items have the right format for completion
  8 + autocompleteEmojiData = $.map(autocompleteEmojiData, function(value) {
  9 + return {
  10 + name: value,
  11 + insert: value+':',
  12 + image: '#{image_path("emoji")}/'+value+'.png'
  13 + }
  14 + });
  15 +
  16 + setupGfmAutoComplete();
  17 + });
app/views/notes/_common_form.html.haml
@@ -36,49 +36,3 @@ @@ -36,49 +36,3 @@
36 %a.file_upload.btn.small Upload File 36 %a.file_upload.btn.small Upload File
37 = f.file_field :attachment, class: "input-file" 37 = f.file_field :attachment, class: "input-file"
38 %span.hint Any file less than 10 MB 38 %span.hint Any file less than 10 MB
39 -  
40 -:javascript  
41 - $(function(){  
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 - });  
84 - });