12b9c036ada723b623e3b66cd0b0c85e0328df9c
braney
Mon Aug 14 21:45:24 2017 -0700
add AJAX store.
diff --git src/hg/hgCollection/hgCollection.c src/hg/hgCollection/hgCollection.c
index 63992af..8bcf6b5 100644
--- src/hg/hgCollection/hgCollection.c
+++ src/hg/hgCollection/hgCollection.c
@@ -104,30 +104,31 @@
static void printGroup(char *parent, struct trackDb *tdb, boolean folder, boolean user)
// output list elements for a group
{
char *userString = "";
char *prefix = "";
//if (user)
{
//prefix = "coll_";
if (tdb->parent && tdb->subtracks)
userString = "viewType='view'";
else
userString = "viewType='track'";
}
+ //userString = "viewType='track data-jstree='{'icon':'images/folderC.png'}''";
#define IMAKECOLOR_32(r,g,b) ( ((unsigned int)b<<0) | ((unsigned int)g << 8) | ((unsigned int)r << 16))
jsInlineF("
%s", tdb->shortLabel, tdb->longLabel,IMAKECOLOR_32(tdb->colorR,tdb->colorG,tdb->colorB), hStringFromTv(tdb->visibility), prefix, trackHubSkipHubName(tdb->track), userString, folder ? "folder" : "file", tdb->shortLabel );
jsInlineF("%s", tdb->longLabel);
if (tdb->subtracks)
{
struct trackDb *subTdb;
jsInlineF("");
for(subTdb = tdb->subtracks; subTdb; subTdb = subTdb->next)
printGroup(trackHubSkipHubName(tdb->track), subTdb, user && (subTdb->subtracks != NULL), user);
jsInlineF("
");
@@ -234,50 +235,69 @@
printf("All Visible | All the tracks visible in hgTracks |
\n");
struct trackDb *tdb;
for(tdb = fullTrackList; tdb; tdb = tdb->next)
{
if (isParentVisible(tdb) && isSubtrackVisible(tdb))
{
printGroup("visible", tdb, FALSE, FALSE);
}
}
}
void doTable()
// output the tree table
{
char *hubName = hubNameFromUrl(getHubName(database));
-jsInlineF("$('#tracks').append(\"");
struct grp *curGroup;
for(curGroup = fullGroupList; curGroup; curGroup = curGroup->next)
{
if ((hubName != NULL) && sameString(curGroup->name, hubName))
break;
}
if (curGroup != NULL)
{
// print out all the tracks in this group
struct trackDb *tdb;
- jsInlineF("");
+ }
+ jsInlineF("\");\n");
+
+ // print out all the tracks in this group
+ jsInlineF("$('#collections').append(\"");
+ for(tdb = fullTrackList; tdb; tdb = tdb->next)
+ {
+ if (sameString(tdb->grp, hubName))
+ {
+ jsInlineF("%s", trackHubSkipHubName(tdb->track),trackHubSkipHubName(tdb->track), tdb->shortLabel);
+ //printGroup("collections", tdb, TRUE, TRUE);
+ }
+ }
+ jsInlineF("\");\n");
}
//addVisibleTracks();
+jsInlineF("$('#tracks').append(\"");
for(curGroup = fullGroupList; curGroup; curGroup = curGroup->next)
{
if ((hubName != NULL) && sameString(curGroup->name, hubName))
continue;
jsInlineF("");
jsInlineF("- %s", curGroup->name, curGroup->label );
struct trackDb *tdb;
jsInlineF("
");
for(tdb = fullTrackList; tdb; tdb = tdb->next)
{
if ( sameString(tdb->grp, curGroup->name))
{
printGroup(curGroup->name, tdb, FALSE, FALSE);
}
}
@@ -418,55 +438,55 @@
}
static void outComposite(FILE *f, struct track *collection)
// output a composite header for user composite
{
char *parent = collection->name;
char *shortLabel = collection->shortLabel;
char *longLabel = collection->longLabel;
fprintf(f,"track %s\n\
shortLabel %s\n\
compositeTrack on\n\
aggregate none\n\
longLabel %s\n\
%s on\n\
type wig \n\
-visibility full\n\n", parent, &shortLabel[2], longLabel, CUSTOM_COMPOSITE_SETTING);
+visibility full\n\n", parent, shortLabel, longLabel, CUSTOM_COMPOSITE_SETTING);
}
int snakePalette2[] =
{
0x1f77b4, 0xaec7e8, 0xff7f0e, 0xffbb78, 0x2ca02c, 0x98df8a, 0xd62728, 0xff9896, 0x9467bd, 0xc5b0d5, 0x8c564b, 0xc49c94, 0xe377c2, 0xf7b6d2, 0x7f7f7f, 0xc7c7c7, 0xbcbd22, 0xdbdb8d, 0x17becf, 0x9edae5
};
static char *skipColl(char *str)
{
if (startsWith("coll_", str))
return &str[5];
return str;
}
static void outView(FILE *f, struct sqlConnection *conn, char *db, struct track *view, char *parent, struct hash *nameHash, struct hash *collectionNameHash)
// output a view to a trackhub
{
fprintf(f,"\ttrack %s\n\
\tshortLabel %s\n\
\tlongLabel %s\n\
\tview %s \n\
\tparent %s \n\
\tcolor %ld,%ld,%ld \n\
-\tvisibility %s\n", view->name, &view->shortLabel[2], view->longLabel, view->name, parent, 0xff& (view->color >> 16),0xff& (view->color >> 8),0xff& (view->color), view->visibility);
+\tvisibility %s\n", view->name, view->shortLabel, view->longLabel, view->name, parent, 0xff& (view->color >> 16),0xff& (view->color >> 8),0xff& (view->color), view->visibility);
//fprintf(f,"\tequation +\n");
fprintf(f, "\n");
//int useColor = 0;
struct track *track = view->trackList;
for(; track; track = track->next)
{
struct trackDb *tdb = hashMustFindVal(nameHash, skipColl(track->name));
outTdb(conn, db, f, skipColl(track->name),tdb, view->name, track->visibility, track->color, track, nameHash, collectionNameHash, 2);
//useColor++;
}
}
@@ -499,92 +519,112 @@
tdb = hashMustFindVal(nameHash, track->name);
outTdb(conn, db, f, track->name,tdb, collection->name, track->visibility, track->color, track, nameHash, collectionNameHash, 1);
/*
useColor++;
if (useColor == (sizeof snakePalette2 / sizeof(int)))
useColor = 0;
*/
}
}
}
fclose(f);
hFreeConn(&conn);
}
-static unsigned long hexStringToLong(char *str)
+unsigned long hexStringToLong(char *str)
{
/*
char buffer[1024];
strcpy(buffer, "0x");
strcat(buffer, &str[1]);
*/
return strtol(&str[1], NULL, 16);
}
-static struct track *parseJson(char *jsonText)
-// parse the JSON returned from the ap
+struct jsonParseData
{
-struct hash *trackHash = newHash(5);
-struct track *collectionList = NULL;
+struct track **collectionList;
+struct hash *trackHash;
+};
+
+void jsonObjStart(struct jsonElement *ele, char *name,
+ boolean isLast, void *context)
+{
+struct jsonParseData *jpd = (struct jsonParseData *)context;
+struct track **collectionList = jpd->collectionList;
+struct hash *trackHash = jpd->trackHash;
struct track *track;
-char *ptr = jsonText;
-if (*ptr != '[')
- errAbort("element didn't start with [");
-ptr++;
-do
+if ((name == NULL) && (ele->type == jsonObject))
{
- if (*ptr != '[')
- errAbort("element didn't start with [");
- ptr++;
+ struct hash *objHash = jsonObjectVal(ele, "name");
+
+ struct jsonElement *parentEle = hashFindVal(objHash, "id");
+ char *parentId = jsonStringEscape(parentEle->val.jeString);
+ parentEle = hashFindVal(objHash, "parent");
+ char *parentName = jsonStringEscape(parentEle->val.jeString);
AllocVar(track);
- char *parentName = getString(&ptr);
- if (sameString(parentName, "collections"))
- slAddHead(&collectionList, track);
+ if (sameString(parentName, "#"))
+ slAddHead(collectionList, track);
else
{
struct track *parent = hashMustFindVal(trackHash, parentName);
slAddTail(&parent->trackList, track);
}
- track->shortLabel = getString(&ptr);
- track->longLabel = getString(&ptr);
- track->name = getString(&ptr);
- track->visibility = getString(&ptr);
- char *colorString = getString(&ptr);
+ struct jsonElement *attEle = hashFindVal(objHash, "li_attr");
+ if (attEle)
+ {
+ struct hash *attrHash = jsonObjectVal(attEle, "name");
+ struct jsonElement *strEle = (struct jsonElement *)hashMustFindVal(attrHash, "name");
+ track->name = jsonStringEscape(strEle->val.jeString);
+ hashAdd(trackHash, parentId, track);
- track->color = hexStringToLong(colorString);
- hashAdd(trackHash, track->name, track);
- if (*ptr != ']')
- errAbort("element didn't end with ]");
- ptr++;
- if (*ptr == ',')
- ptr++;
- } while (*ptr != ']');
+ strEle = (struct jsonElement *)hashMustFindVal(attrHash, "shortlabel");
+ track->shortLabel = jsonStringEscape(strEle->val.jeString);
+ strEle = (struct jsonElement *)hashMustFindVal(attrHash, "longlabel");
+ track->longLabel = jsonStringEscape(strEle->val.jeString);
+ strEle = (struct jsonElement *)hashMustFindVal(attrHash, "visibility");
+ track->visibility = jsonStringEscape(strEle->val.jeString);
+ strEle = (struct jsonElement *)hashMustFindVal(attrHash, "color");
+ track->color = hexStringToLong(jsonStringEscape(strEle->val.jeString));
+ }
+ }
+}
+
+static struct track *parseJsonElements( struct jsonElement *collectionElements)
+// parse the JSON returned from the ap
+{
+struct track *collectionList = NULL;
+struct hash *trackHash = hashNew(5);
+struct jsonParseData jpd = {&collectionList, trackHash};
+jsonElementRecurse(collectionElements, NULL, FALSE, jsonObjStart, NULL, &jpd);
slReverse(&collectionList);
return collectionList;
}
void doAjax(char *db, char *jsonText, struct hash *nameHash)
// Save our state
{
-struct track *collectionList = parseJson(jsonText);
+cgiDecodeFull(jsonText, jsonText, strlen(jsonText));
+struct jsonElement *collectionElements = jsonParse(jsonText);
+struct track *collectionList = parseJsonElements(collectionElements);
updateHub(db, collectionList, nameHash);
}
static void buildNameHash(struct hash *nameHash, struct trackDb *list)
{
if (list == NULL)
return;
struct trackDb *tdb;
for(tdb = list; tdb; tdb = tdb->next)
{
hashAdd(nameHash, trackHubSkipHubName(tdb->track), tdb);
buildNameHash(nameHash, tdb->subtracks);
}