OSDN Git Service

Labels autocomplete
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Tue, 18 Dec 2012 03:14:05 +0000 (06:14 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Tue, 18 Dec 2012 03:14:05 +0000 (06:14 +0300)
app/assets/javascripts/main.js.coffee
app/helpers/issues_helper.rb
app/views/issues/_form.html.haml

index 3334439..f6c398c 100644 (file)
@@ -13,6 +13,12 @@ window.errorMessage = (message) ->
   ehtml.html(message)
   ehtml
 
+window.split = (val) ->
+  return val.split( /,\s*/ )
+
+window.extractLast = (term) ->
+  return split( term ).pop()
+
 # Disable button if text field is empty
 window.disableButtonIfEmptyField = (field_selector, button_selector) ->
   field = $(field_selector)
index 6b21f46..264b764 100644 (file)
@@ -30,4 +30,10 @@ module IssuesHelper
       open: "open"
     }
   end
+
+  def labels_autocomplete_source
+    labels = @project.issues_labels.order('count DESC')
+    labels = labels.map{ |l| { label: l.name, value: l.name } }
+    labels.to_json
+  end
 end
index 670b4e0..8a9a91a 100644 (file)
           = link_to "Cancel", project_issues_path(@project), class: cancel_class
         - else
           = link_to "Cancel", project_issue_path(@project, @issue), class: cancel_class
+
+
+
+
+:javascript
+  $(function(){
+    $("#issue_label_list")
+      .bind( "keydown", function( event ) {
+        if ( event.keyCode === $.ui.keyCode.TAB &&
+          $( this ).data( "autocomplete" ).menu.active ) {
+          event.preventDefault();
+        }
+      })
+      .autocomplete({
+        minLength: 0,
+        source: function( request, response ) {
+          response( $.ui.autocomplete.filter(
+            #{raw labels_autocomplete_source}, extractLast( request.term ) ) );
+        },
+        focus: function() {
+          return false;
+        },
+        select: function(event, ui) {
+          var terms = split( this.value );
+          terms.pop();
+          terms.push( ui.item.value );
+          terms.push( "" );
+          this.value = terms.join( ", " );
+          return false;
+        }
+      });
+  });
+