Datatables (hazelnut) added a link on the hrn to look at a single resource
[unfold.git] / plugins / hazelnut / static / js / hazelnut.js
index 81cf1e2..f17eb25 100644 (file)
@@ -6,9 +6,8 @@
 
 (function($){
 
-    // TEMP
     var debug=false;
-    debug=true
+//    debug=true
 
     var Hazelnut = Plugin.extend({
 
             var actual_options = {
                 // Customize the position of Datatables elements (length,filter,button,...)
                 // we use a fluid row on top and another on the bottom, making sure we take 12 grid elt's each time
-                sDom: "<'row'<'col-md-5'l><'col-md-1'r><'col-md-6'f>>t<'row'<'col-md-5'i><'col-md-7'p>>",
+                sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t<'row'<'col-xs-5'i><'col-xs-7'p>>",
                // XXX as of sept. 2013, I cannot locate a bootstrap3-friendly mode for now
                // hopefully this would come with dataTables v1.10 ?
                // in any case, search for 'sPaginationType' all over the code for more comments
-                sPaginationType: 'full_numbers',
+                sPaginationType: 'bootstrap',
                 // Handle the null values & the error : Datatables warning Requested unknown parameter
                 // http://datatables.net/forums/discussion/5331/datatables-warning-...-requested-unknown-parameter/p2
                 aoColumnDefs: [{sDefaultContent: '',aTargets: [ '_all' ]}],
             /* Setup the SelectAll button in the dataTable header */
             /* xxx not sure this is still working */
             var oSelectAll = $('#datatableSelectAll-'+ this.options.plugin_uuid);
-            oSelectAll.html("<span class='ui-icon ui-icon-check' style='float:right;display:inline-block;'></span>Select All");
+            oSelectAll.html("<span class='glyphicon glyphicon-ok' style='float:right;display:inline-block;'></span>Select All");
             oSelectAll.button();
             oSelectAll.css('font-size','11px');
             oSelectAll.css('float','right');
             // Prefix id with plugin_uuid
             result += "<input";
             result += " class='hazelnut-checkbox'";
-            result += " id='" + this.id('checkbox', this.id_from_key(key, value)) + "'";
+            result += " id='" + this.flat_id(this.id('checkbox', value)) + "'";
             result += " name='" + key + "'";
             result += " type='checkbox'";
             result += " autocomplete='off'";
                         line.push('');
                     else
                         line.push(record['hostname']);
+
+                } else if (colnames[j] == 'hrn' && typeof(record) != 'undefined') {
+                    line.push('<a href="../resource/'+record['urn']+'"><span class="glyphicon glyphicon-search"></span></a> '+record['hrn']);
                 } else {
                     if (record[colnames[j]])
                         line.push(record[colnames[j]]);
     
            // adding an array in one call is *much* more efficient
            // this.table.fnAddData(line);
-           this.buffered_lines.push(line)
+           this.buffered_lines.push(line);
 
         },
 
         set_checkbox: function(record, checked)
         {
             /* Default: checked = true */
-            if (typeof checked === 'undefined')
-                checked = true;
+            if (checked === undefined) checked = true;
 
             var key_value;
             /* The function accepts both records and their key */
             }
 
 
-            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());
-
+            var checkbox_id = this.flat_id(this.id('checkbox', key_value));
+            checkbox_id = '#' + checkbox_id;
+           // using dataTables's $ to search also in nodes that are not currently displayed
+            var element = this.table.$(checkbox_id);
+           if (debug) messages.debug("set_checkbox checked=" + checked + " id=" + checkbox_id + " matches=" + element.length);
             element.attr('checked', checked);
         },
 
         {
             if (this.received_all_query) {
                // if the 'all' query has been dealt with already we may turn on the checkbox
+               if (debug) messages.debug("turning on checkbox for record "+record[this.key]);
                 this.set_checkbox(record, true);
            } else {
                // otherwise we need to remember that and do it later on
+               if (debug) messages.debug ("Remembering record to check " + record[this.key]);
                 this.buffered_records_to_check.push(record);
-               console.log ("Remembering record to check " + record);
            }
         },
 
 
         on_query_done: function()
         {
-            if (this.received_all_query)
-                this.unspin();
             this.received_query = true;
+           // unspin once we have received both
+            if (this.received_all_query && this.received_query) this.unspin();
         },
         
         on_field_state_changed: function(data)
 
         on_all_query_done: function()
         {
-            var self = this;
-            if (this.received_query) {
-                /* XXX needed ? XXX We uncheck all checkboxes ... */
-                $("[id^='datatables-checkbox-" + this.options.plugin_uuid +"']").attr('checked', false);
-
-                /* ... and check the ones specified in the resource list */
-                $.each(this.buffered_records_to_check, function(i, record) {
-                    self.set_checkbox(record, true);
-                });
-
-                this.unspin();
-            }
+           if (debug) messages.debug("1-shot initializing dataTables content with " + this.buffered_lines.length + " lines");
            this.table.fnAddData (this.buffered_lines);
            this.buffered_lines=[];
+           
+            var self = this;
+           // if we've already received the slice query, we have not been able to set 
+           // checkboxes on the fly at that time (dom not yet created)
+            $.each(this.buffered_records_to_check, function(i, record) {
+               if (debug) messages.debug ("delayed turning on checkbox " + i + " record= " + record);
+                self.set_checkbox(record, true);
+            });
+           this.buffered_records_to_check = [];
+
             this.received_all_query = true;
+           // unspin once we have received both
+            if (this.received_all_query && this.received_query) this.unspin();
 
         }, // on_all_query_done
 
             var self = e.data;
 
             // XXX this.value = key of object to be added... what about multiple keys ?
+           if (debug) messages.debug("hazelnut click handler checked=" + this.checked + " hrn=" + this.value);
             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