Search code examples
slickgrid

How to implement jQuery autocomplete in SlickGrid cell editor


I am setting up SlickGrid and need to have a column with an autoComplete editor. I tried it my modifying TextEditor or DateEditor. Nothing works.

Can anybody give me a rough sketch of an implementation by using the TextEditor as a basis?

Thanks a lot.


Solution

  • I did this in slick.editors.js - might have some bugs, but should work and help you get started:

    $.extend(true, window, {
        "Slick": {
          "Editors": {
            "Auto": AutoCompleteEditor,
            "Text": TextEditor,
            "Integer": IntegerEditor,
            "Date": DateEditor,
            "YesNoSelect": YesNoSelectEditor,
            "Checkbox": CheckboxEditor,
            "PercentComplete": PercentCompleteEditor,
            "LongText": LongTextEditor
          }
        }
      });
    
      var availableTags = [
                            "ActionScript",
                            "AppleScript",
                            "Asp",
                            "BASIC",
                            "C",
                            "C++",
                            "Clojure",
                            "COBOL",
                            "ColdFusion",
                            "Erlang",
                            "Fortran",
                            "Groovy",
                            "Haskell",
                            "Java",
                            "JavaScript",
                            "Lisp",
                            "Perl",
                            "PHP",
                            "Python",
                            "Ruby",
                            "Scala",
                            "Scheme"
                          ];
    
       function AutoCompleteEditor(args) {
         var $input;
         var defaultValue;
         var scope = this;
         var calendarOpen = false;
    
         this.init = function () {
           $input = $("<INPUT id='tags' class='editor-text' />");
           $input.appendTo(args.container);
           $input.focus().select();
           $input.autocomplete({
                source: availableTags
            });
         };
    
         this.destroy = function () {
           $input.autocomplete("destroy");
         };
    
         this.focus = function () {
           $input.focus();
         };
    
         this.loadValue = function (item) {
           defaultValue = item[args.column.field];
           $input.val(defaultValue);
           $input[0].defaultValue = defaultValue;
           $input.select();
         };
    
         this.serializeValue = function () {
           return $input.val();
         };
    
         this.applyValue = function (item, state) {
           item[args.column.field] = state;
         };
    
         this.isValueChanged = function () {
           return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
         };
    
         this.validate = function () {
           return {
             valid: true,
             msg: null
           };
         };
    
         this.init();
       }
    

    Let me know if this helps.