global helper functions need to have grep-able names, i.e. a little bit longer
[myslice.git] / plugins / hazelnut / static / js / hazelnut.js
index 48a392d..13bc5d8 100644 (file)
@@ -7,7 +7,6 @@
 (function($){
 
     // TEMP
-    var ELEMENT_KEY = 'resource_hrn';
     var debug=false;
     debug=true
 
             this.in_set_buffer = Array();
 
             /* XXX Events XXX */
-            this.$element.on('show.Datatables', this.on_show);
+            // this.$element.on('show.Datatables', this.on_show);
+            this.el().on('show', this, this.on_show);
             // Unbind all events using namespacing
             // TODO in destructor
             // $(window).unbind('Hazelnut');
 
+            var query = manifold.query_store.find_analyzed_query(this.options.query_uuid);
+            this.method = query.object;
+
+            var keys = manifold.metadata.get_key(this.method);
+            this.key = (keys && keys.length == 1) ? keys[0] : null;
+
             /* Setup query and record handlers */
             this.listen_query(options.query_uuid);
             this.listen_query(options.query_all_uuid, 'all');
 
         /* PLUGIN EVENTS */
 
-        on_show: function()
+        on_show: function(e)
         {
-            // XXX
-            var $this=$(this);
-            // xxx wtf. why [1] ? would expect 0...
-            if (debug)
-                messages.debug("Hitting suspicious line in hazelnut.show");
-            var oTable = $($('.dataTable', $this)[1]).dataTable();
-            oTable.fnAdjustColumnSizing()
+            var self = e.data;
+
+            self.table.fnAdjustColumnSizing()
         
             /* Refresh dataTabeles if click on the menu to display it : fix dataTables 1.9.x Bug */        
+            /* temp disabled... useful ? -- jordan
             $(this).each(function(i,elt) {
                 if (jQuery(elt).hasClass('dataTables')) {
                     var myDiv=jQuery('#hazelnut-' + this.id).parent();
@@ -63,6 +66,7 @@
                     }
                 }
             });
+            */
         }, // on_show
 
         /* GUI EVENTS */
  // UNUSED ? //         
  // UNUSED ? //         }, // update_plugin
 
-        checkbox: function (plugin_uuid, header, field, selected_str, disabled_str)
+        checkbox: function (key, value)
         {
             var result="";
-            if (header === null)
-                header = '';
             // Prefix id with plugin_uuid
             result += "<input";
-            result += " class='hazelnut-checkbox-" + plugin_uuid + "'";
-            result += " id='hazelnut-checkbox-" + plugin_uuid + "-" + unfold.get_value(header).replace(/\\/g, '')  + "'";
-            result += " name='" + unfold.get_value(field) + "'";
+            result += " class='hazelnut-checkbox'";
+            result += " id='" + this.id('checkbox', this.id_from_key(key, value)) + "'";
+            result += " name='" + key + "'";
             result += " type='checkbox'";
-            result += selected_str;
-            result += disabled_str;
             result += " autocomplete='off'";
-            result += " value='" + unfold.get_value(header) + "'";
+            result += " value='" + value + "'";
             result += "></input>";
             return result;
         }, // checkbox
             }
     
             /* catch up with the last column if checkboxes were requested */
-            if (this.options.checkboxes) {
-                var checked = '';
-                // xxx problem is, we don't get this 'sliver' thing set apparently
-                if (typeof(record['sliver']) != 'undefined') { /* It is equal to null when <sliver/> is present */
-                    checked = 'checked ';
-                    hazelnut.current_resources.push(record[ELEMENT_KEY]);
-                }
+            if (this.options.checkboxes)
                 // Use a key instead of hostname (hard coded...)
-                line.push(this.checkbox(this.options.plugin_uuid, record[ELEMENT_KEY], record['type'], checked, false));
-            }
+                // XXX remove the empty checked attribute
+                line.push(this.checkbox(this.key, record[this.key]));
     
             // XXX Is adding an array of lines more efficient ?
             this.table.fnAddData(line);
                 this.table.fnSetColumnVis(index, false);
         },
 
-        set_checkbox: function(record)
+        set_checkbox: function(record, checked)
         {
-            // XXX urn should be replaced by the key
-            // XXX we should enforce that both queries have the same key !!
-            checkbox_id = "#hazelnut-checkbox-" + this.options.plugin_uuid + "-" + unfold.escape_id(record[ELEMENT_KEY].replace(/\\/g, ''))
-            $(checkbox_id, this.table.fnGetNodes()).attr('checked', true);
+            /* Default: checked = true */
+            if (typeof checked === 'undefined')
+                checked = true;
+
+            var key_value;
+            /* The function accepts both records and their key */
+            switch (manifold.get_type(record)) {
+                case TYPE_VALUE:
+                    key_value = record;
+                    break;
+                case TYPE_RECORD:
+                    /* XXX Test the key before ? */
+                    key_value = record[this.key];
+                    break;
+                default:
+                    throw "Not implemented";
+                    break;
+            }
+
+
+            var checkbox_id = this.id('checkbox', this.id_from_key(this.key, key_value));
+            checkbox_id = '#' + checkbox_id.replace(/\./g, '\\.');
+
+            var element = $(checkbox_id, this.table.fnGetNodes());
+
+            element.attr('checked', checked);
         },
 
         /*************************** QUERY HANDLER ****************************/
             /* NOTE in fact we are doing a join here */
             if (this.received_all)
                 // update checkbox for record
-                this.set_checkbox(record);
+                this.set_checkbox(record, true);
             else
                 // store for later update of checkboxes
                 this.in_set_buffer.push(record);
                 this.unspin();
             this.received_set = true;
         },
+        
+        on_field_state_changed: function(data)
+        {
+            switch(data.request) {
+                case FIELD_REQUEST_ADD:
+                case FIELD_REQUEST_ADD_RESET:
+                    this.set_checkbox(data.value, true);
+                    break;
+                case FIELD_REQUEST_REMOVE:
+                case FIELD_REQUEST_REMOVE_RESET:
+                    this.set_checkbox(data.value, false);
+                    break;
+                default:
+                    break;
+            }
+        },
 
         // all
 
 
                 /* ... and check the ones specified in the resource list */
                 $.each(this.in_set_buffer, function(i, record) {
-                    self.set_checkbox(record);
+                    self.set_checkbox(record, true);
                 });
 
                 this.unspin();
              * Handle clicks on checkboxes: reassociate checkbox click every time
              * the table is redrawn 
              */
-            $('.hazelnut-checkbox-' + this.options.plugin_uuid).unbind('click');
-            $('.hazelnut-checkbox-' + this.options.plugin_uuid).click({instance: this}, this._check_click);
+            this.elts('hazelnut-checkbox').unbind('click').click(this, this._check_click);
 
             if (!this.table)
                 return;
 
         _check_click: function(e) 
         {
+            e.stopPropagation();
 
-            var self = e.data.instance;
+            var self = e.data;
 
             // XXX this.value = key of object to be added... what about multiple keys ?
             manifold.raise_event(self.options.query_uuid, this.checked?SET_ADD:SET_REMOVED, this.value);
+            //return false; // prevent checkbox to be checked, waiting response from manifold plugin api
             
         },