plugins: query_editor now inherits from Plugin class + fixes to active_filters
[myslice.git] / plugins / query_editor / query_editor.js
index 3bc3d8b..9ef90fd 100644 (file)
  * License: GPLv3
  */
 
-/*
- * It's a best practice to pass jQuery to an IIFE (Immediately Invoked Function
- * Expression) that maps it to the dollar sign so it can't be overwritten by
- * another library in the scope of its execution.
- */
-
 (function($){
 
-    var PLUGIN_NAME = 'QueryEditor';
-
-    // routing calls
-    jQuery.fn.QueryEditor = function( method ) {
-               if ( methods[method] ) {
-                       return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
-               } else if ( typeof method === 'object' || ! method ) {
-                       return methods.init.apply( this, arguments );
-               } else {
-                       jQuery.error( 'Method ' +  method + ' does not exist on jQuery.' + PLUGIN_NAME );
-               }    
-    };
-
-    /***************************************************************************
-     * Public methods
-     ***************************************************************************/
-
-    var methods = {
-
-        /**
-         * @brief Plugin initialization
-         * @param options : an associative array of setting values
-         * @return : a jQuery collection of objects on which the plugin is
-         *     applied, which allows to maintain chainability of calls
-         */
-        init : function ( options ) {
-
-            return this.each(function() {
-
-                var $this = $(this);
-
-                /* An object that will hold private variables and methods */
-                var plugin = new QueryEditor(options);
-                $this.data('Manifold', plugin);
-
-            }); // this.each
-        }, // init
-
-        /**
-         * @brief Plugin destruction
-         * @return : a jQuery collection of objects on which the plugin is
-         *     applied, which allows to maintain chainability of calls
-         */
-        destroy : function( ) {
-
-            return this.each(function() {
-                var $this = $(this);
-                var hazelnut = $this.data('Manifold');
-
-                // Unbind all events using namespacing
-                $(window).unbind(PLUGIN_NAME);
-
-                // Remove associated data
-                hazelnut.remove();
-                $this.removeData('Manifold');
-
-                $this.set_query_handler(options.query_uuid, hazelnut.query_handler);
-                $this.set_record_handler(options.query_uuid, hazelnut.record_handler); 
+    var QueryEditor = Plugin.extend({
 
-                /* XXX Subscribe to query updates to maintain current state of query (multiple editors) */
-                jQuery.subscribe('/query/' + options.query_uuid + '/changed', {instance: $this}, query_changed);
-                jQuery.subscribe('/query/' + options.query_uuid + '/diff', {instance: $this}, query_changed_diff);
-                /* Subscribe to results in order to redraw the table when updates arrive */
-                jQuery.subscribe('/results/' + options.query_uuid + '/changed', {instance: $this}, update_autocomplete);
+        init: function(options, element) {
+            $('.queryeditor-auto-filter').change(function(event) { 
+                var key   = event.target.id.split('-')[4]; // Should be consistent with the naming of fields
+                var op    = '=';
+                var value = event.target.value;
 
+                manifold.raise_event(object.options.query_uuid, FILTER_ADDED, [key, op, value]);
             });
-        }, // destroy
-
-    }; // var methods;
-
-    /***************************************************************************
-     * Plugin object
-     ***************************************************************************/
-
-    function QueryEditor(options)
-    {
-
-        /* member variables */
-        this.options = options;
-
-        var object = this;
-
-        this.initialize_table = function(data) 
-        {
-
-            var d = data;
             
             jQuery('.queryeditor-filter').change(function(event) { 
-                query = data.current_query;
-                var key=getKeySplitId(event.target.id,"-");
-                var op='=';
-                var value=event.target.value;
-                            
-                if(value){                
-                    query.update_filter(key, op, value);
-                    //add_ActiveFilter(event.target.id, '=',event.target.value,data);
-                }else{
-                    query.remove_filter(key,op,"");
-                    //remove_ActiveFilter(event, data, event.target.id,'=');
-                }
-                // Publish the query changed, the other plugins with subscribe will get the changes
-                jQuery.publish('/query/' + query.uuid + '/changed', query);
+                var key   = event.target.id.split('-')[4];
+                var op    = '=';
+                var value = event.target.value;
+
+                manifold.raise_event(object.options.query_uuid, FILTER_ADDED, [key, op, value]);
             });
             jQuery('.queryeditor-filter-min').change(function(event) {
                 query = data.current_query;
             });
 
             jQuery('.queryeditor-check').click(function() { 
-                manifold.raise_event(object.options.query_uuid, this.checked?SET_ADD:SET_REMOVED, this.value);
+                manifold.raise_event(object.options.query_uuid, this.checked?FIELD_ADDED:FIELD_REMOVED, this.value);
                 /*
                     var column = this.id.substring(6);
                     query = data.current_query;
                 jQuery('#'+this.options.plugin_uuid+'_fields_wrapper').css({'padding-top':'0em','padding-bottom':'0em'});
 
             //}); // onfunctionAvailable
+        }, // init
 
-        } // initialize_table
+        /* UI management */
 
-        this.print_field_description = function(field_header, div_id) { 
-            
+        check_field: function(field)
+        {
+            this.el('check', field).attr('checked', true);
+        },
+
+        uncheck_field: function(field)
+        {
+            this.el('check', field).attr('checked', false);
+        },
+
+        /* Events */
+
+        on_filter_added: function(filter)
+        {
+//                    filter = data;
+//                    // Set the value of the filter = to query filter value
+//                    // Necessary if the filter has been modified by another plugin (QuickFilter)
+//                    if(filter[1]=="="){
+//                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]).val(filter[2]);
+//                    }else if(filter[1]=="<"){
+//                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-max').val(filter[2]);
+//                    }else if(filter[1]==">"){
+//                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-min').val(filter[2]);
+//                    }
+        },
+
+        on_filter_removed: function(filter)
+        {
+//                    filter = data;
+//                    if(filter[1]=="="){
+//                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]).val(null);
+//                    }else if(filter[1]=="<"){
+//                        //502124d5a5848-filter-asn-max
+//                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-max').val(null);
+//                    }else if(filter[1]==">"){
+//                        //502124d5a5848-filter-asn-min
+//                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-min').val(null);
+//                    }
+        },
+
+        on_field_added: function(field)
+        {
+            this.check_field(field);
+        },
+
+        on_field_removed: function(field)
+        {
+            this.uncheck_field(field);
+        },
+
+        /* Former code */
+
+        print_field_description: function(field_header, div_id) 
+        { 
             //var selected = all_headers[field_header];
             var selected = getMetadata_field('resource',field_header);
 
             output += "</div>";
 
             return output;
-        }
+        },
 
-        this.update_autocomplete = function(e, rows, current_query)
+        update_autocomplete: function(e, rows, current_query)
         {
             var d = data;
             d.current_query = current_query;
                             }
                 });
             });                
-        } // update_autocomplete     
-
-        /**
-         * This function is used to update autocomplete
-         */
-        this.record_handler = function(e, event_type, record)
-        {
-            // elements in set
-            switch(event_type) {
-                case NEW_RECORD:
-                    /* NOTE in fact we are doing a join here */
-                    if (object.received_all)
-                        // update checkbox for record
-                        object.set_checkbox(record);
-                    else
-                        // store for later update of checkboxes
-                        object.in_set_buffer.push(record);
-                    break;
-                case CLEAR_RECORDS:
-                    // nothing to do here
-                    break;
-                case IN_PROGRESS:
-                    manifold.spin($(this));
-                    break;
-                case DONE:
-                    if (object.received_all)
-                        manifold.spin($(this), false);
-                    object.received_set = true;
-                    break;
-            }
-        };
+        }, // update_autocomplete     
 
-        this.query_handler = function(e, event_type, data)
+        fnFormatDetails: function( metaTable, nTr, div_id ) 
         {
-            // This replaces the complex set_query function
-            // The plugin does not need to remember the query anymore
-            switch(event_type) {
-                // Filters
-                // When Query changed, Then we need to update the filters of
-                // QueryEditor plugin if the filter is active, set the value
-                // (the update can come from another plugin) else set the
-                // filter value to null PB if the filter is composed of MIN/MAX
-                // values
-                case FILTER_ADDED:
-                    filter = data;
-                    // Set the value of the filter = to query filter value
-                    // Necessary if the filter has been modified by another plugin (QuickFilter)
-                    if(filter[1]=="="){
-                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]).val(filter[2]);
-                    }else if(filter[1]=="<"){
-                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-max').val(filter[2]);
-                    }else if(filter[1]==">"){
-                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-min').val(filter[2]);
-                    }
-                case FILTER_REMOVED:
-                    filter = data;
-                    if(filter[1]=="="){
-                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]).val(null);
-                    }else if(filter[1]=="<"){
-                        //502124d5a5848-filter-asn-max
-                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-max').val(null);
-                    }else if(filter[1]==">"){
-                        //502124d5a5848-filter-asn-min
-                        jQuery('#'+this.options.plugin_uuid+'-filter-'+filter[0]+'-min').val(null);
-                    }
-                case CLEAR_FILTERS:
-                    break;
-
-                // Fields
-                /* Hide/unhide columns to match added/removed fields */
-                case FIELD_ADDED:
-                    $('#check_' + data).attr('checked', true);
-                    break;
-                case FIELD_REMOVED:
-                    $('#check_' + data).attr('checked', false);
-                    break;
-                case CLEAR_FIELDS:
-                    alert(PLUGIN_NAME + '::clear_fields() not implemented');
-                    break;
-            } // switch
-
-
-        }
-        this.fnFormatDetails  = function( metaTable, nTr, div_id ) {
             var aData = metaTable.fnGetData( nTr );
             var sOut = '<blockquote>';
             //sOut += prepare_tab_description(aData[1].substr(21, aData[1].length-21-7), div_id);
             return sOut;
         }
        
-            
-        /**
-         *
-         */
-        this.initialize = function() {
-            //XXX
-            this.initialize_table(jQuery(this).data());
-        }
-        /* Constructor */
-
-        this.initialize();
-
-    } // function PresView
-
 })( jQuery );