7a6949d256eb4329de0a6cc7e0c2ae0da35b6bf0
braney
  Fri Oct 20 14:05:15 2017 -0700
add + and - icons in front of tracks to make it easier to copy them into
a collection or delete them from a collection

diff --git src/hg/js/hgCollection.js src/hg/js/hgCollection.js
index 0498161..aafb290 100644
--- src/hg/js/hgCollection.js
+++ src/hg/js/hgCollection.js
@@ -133,43 +133,45 @@
         var ourTreeName = getUniqueName("tree");
         var newName = "A New Collection";
         var newDescription = "Description of New Collection";
         var attributes = "shortLabel='" +  newName + "' ";
         attributes += "longLabel='" +  newDescription + "' ";
         attributes += "color='" + "#0" + "' ";
         attributes += "viewType='" + "track" + "' ";
         attributes += "visibility='" + "full" + "' ";
         attributes += "name='" +  ourCollectionName + "' ";
         attributes += "class='" +  "folder" + "' ";
 
         $('#collectionList').append("<li " + attributes +  "id='"+ourCollectionName+"'>A New Collection</li>");
         $('#currentCollection').append("<div id='"+ourTreeName+"'><ul><li data-jstree='{\"icon\":\"../images/folderC.png\"}' " + attributes+ ">A New Collection</li><ul></div>");
         var newTree = $('#currentCollection div:last');
         trees[ourCollectionName] = newTree;
-        $(newTree).jstree({
+        newTree.jstree({
                "core" : {
                      "check_callback" : checkCallback
                          },
                'plugins' : ['dnd', 'conditionalselect', 'contextmenu'],
                'check_callback' : checkCallback,
                'contextmenu': { "items" : currentCollectionItems},
                'dnd': {check_while_dragging: true}
         });
-        $(newTree).on("select_node.jstree", selectTreeNode);
-        $(newTree).on("copy_node.jstree", function (evt, data)  {
+        newTree.on("select_node.jstree", selectTreeNode);
+        newTree.on("copy_node.jstree", function (evt, data)  {
             $(evt.target).jstree("open_node", data.parent);
+            $(evt.target).jstree("set_icon", data.node, 'fa fa-minus');
         });
+        newTree.on('click', '.jstree-themeicon ', minusHit);
         var lastElement = $("#collectionList li").last();
         //lastElement.addClass("folder");
         selectElements($("#collectionList"), lastElement) ;
         rebuildLabel();
     }
 
     function hideAllTrees() {
         // hide all the trees in the Collected Tracks window
         for(var key in trees)
             trees[key].hide();
     }
 
     function selectCollection(event, ui ) {
         // called with a collection is selected
         var id = ui.selected.id;
@@ -268,30 +270,53 @@
             top: event.pageY + "px",
             left: event.pageX + "px"
         });
         return false;
     }
 
     function recordNames(tree) {
         // keep an accounting of track names that have been used
         var v = $(tree).jstree(true).get_json('#', {'flat': true});
         for (i = 0; i < v.length; i++) {
             var z = v[i];
             names[z.li_attr.name] = 1;
         }
     }
 
+    function plusHit(event, data) {
+        // called with the plus icon is hit
+        var treeObject = $(event.currentTarget).parent().parent();
+        var id = treeObject.attr('id');
+        var node = treeObject.jstree("get_node", id);
+        if (node.children.length === 0) {
+            var parentId = $(selectedTree).jstree("get_node", "ul > li:first").id;
+            isDirty = true;
+            $(selectedTree).jstree("copy_node", node, parentId,'last');
+        }
+    }
+
+    function minusHit (event, data) {
+        // called with the minus icon is hit
+        var treeObject = $(event.currentTarget).parent().parent();
+        var id = treeObject.attr('id');
+        var node = treeObject.jstree("get_node", id);
+        if (node.children.length === 0) {
+            isDirty = true;
+            $(selectedTree).jstree( "delete_node", node);
+        }
+    }
+
     function init() {
         $body = $("body");
 
         $(document).on({
             ajaxStart: function() { $body.addClass("loading");    },
             ajaxStop: function() { $body.removeClass("loading"); }    
         });
         $('.gbButtonGoContainer').click(submitForm);
        
         window.addEventListener("beforeunload", function (e) {
             if (!isDirty)
                 return undefined;
 
             var confirmationMessage = 'Do you want to leave this page without saving?';
 
@@ -354,49 +379,52 @@
         $("#currentCollection div").each(function(index) {
             var newTree = this;
 
             $(newTree).jstree({
                'plugins' : ['dnd', 'conditionalselect', 'contextmenu'],
                'contextmenu': { "items" : currentCollectionItems},
                'dnd': {
                 "check_callback" : checkCallback,
                 }
             });
             recordNames(newTree);
             trees[this.id] = $(newTree);
             $(newTree).on("select_node.jstree", selectTreeNode);
             $(newTree).on("copy_node.jstree", function (evt, data)  {
                 $(evt.target).jstree("open_node", data.parent);
+                $(evt.target).jstree("set_icon", data.node, 'fa fa-minus');
             });
+            $(newTree).on('click', '.jstree-themeicon ', minusHit);
         });
 
         treeDiv=$('#tracks');
         treeDiv.jstree({
                'plugins' : ['dnd', 'conditionalselect', 'contextmenu'],
                'contextmenu': { "items" : currentTrackItems},
                'dnd': {
                 "check_callback" : checkCallback,
                'always_copy' : true,
                 is_draggable: isDraggable,
                },
                'core' :  {
                 "check_callback" : checkCallback
             }
         });
-        $(treeDiv).on("select_node.jstree", function (evt, data)  {
+        treeDiv.on("select_node.jstree", function (evt, data)  {
             $(evt.target).jstree("toggle_node", data.node);
         });
+        treeDiv.on('click', '.jstree-themeicon ', plusHit);
 
         var firstElement = $("#collectionList li").first();
         selectElements($("#collectionList"), firstElement) ;
     }
 
    function submitForm() {
     // Submit the form (from GO button -- as in hgGateway.js)
     // Show a spinner -- sometimes it takes a while for hgTracks to start displaying.
         $('.gbIconGo').removeClass('fa-play').addClass('fa-spinner fa-spin');
         saveCollections(trees);
     }
 
     function updatePage(responseJson) {
         // called after AJAX call
         isDirty = false;