08996db0236137b9cf9b3893d74e7aae41873ab2
braney
  Thu Apr 14 12:33:46 2011 -0700
fixed up the forms to act a little more rationally... added error catching so new hubs that can't be opened don't errAbort
diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c
index 3aa0b1b..8ba1ecb 100644
--- src/hg/hgHubConnect/hgHubConnect.c
+++ src/hg/hgHubConnect/hgHubConnect.c
@@ -63,77 +63,79 @@
         {
 	c = commaList[nameLen];
 	if (c == 0 || c == ',')
 	    return TRUE;
 	}
     commaList = strchr(commaList, ',');
     if (commaList == NULL)
         return FALSE;
     commaList += 1;
     }
 }
 
 void hgHubConnectPrivate()
 /* Put up the list of private hubs and other controls for the page. */
 {
-printf("<FORM ACTION=\"%s\" METHOD=\"POST\" NAME=\"mainForm\">\n", "../cgi-bin/hgHubConnect");
-cartSaveSession(cart);
-cgiMakeHiddenVar(hgHubDoAdd, "on");
 printf("<B>List of Private Hubs</B><BR>");
 struct hubConnectStatus *hub, *hubList =  hubConnectStatusListFromCart(cart);
 int count = 0;
 for(hub = hubList; hub; hub = hub->next)
     {
     if (hub->id > 0)
 	continue;
-    count++;
-    if (hub != hubList)
+    if (count)
 	webPrintLinkTableNewRow();
     else
 	webPrintLinkTableStart();
+    count++;
 
     if (isEmpty(hub->errorMessage))
 	{
 	webPrintLinkCellStart();
 	char hubName[32];
 	safef(hubName, sizeof(hubName), "%s%d", hgHubConnectHubVarPrefix, hub->id);
 	cartMakeCheckBox(cart, hubName, FALSE);
 	webPrintLinkCellEnd();
 	}
     else
 	webPrintLinkCell("error");
     webPrintLinkCell(hub->shortLabel);
     if (isEmpty(hub->errorMessage))
 	webPrintLinkCell(hub->longLabel);
     else
 	webPrintLinkCell(hub->errorMessage);
     webPrintLinkCell(hub->hubUrl);
     }
 if (count)
     webPrintLinkTableEnd();
 else
     printf("No Private Track Hubs for this genome assembly<BR>");
+}
+
+static void makeNewHubButton()
+{
+printf("<FORM ACTION=\"%s\" METHOD=\"POST\" NAME=\"secondForm\">\n", "../cgi-bin/hgHubConnect");
+cartSaveSession(cart);
+cgiMakeHiddenVar(hgHubDoAdd, "on");
 cgiMakeButton("add", "add new private hub");
+printf("</FORM>\n");
 }
 
 void hgHubConnectPublic()
 /* Put up the list of external hubs and other controls for the page. */
 {
-destUrl = cartUsualString(cart, hgHubConnectCgiDestUrl, destUrl);
-printf("<FORM ACTION=\"%s\" METHOD=\"POST\" NAME=\"mainForm\">\n", destUrl);
-cartSaveSession(cart);
-cgiMakeHiddenVar(hgHubConnectRemakeTrackHub, "on");
+//destUrl = cartUsualString(cart, hgHubConnectCgiDestUrl, destUrl);
 printf(
    "<P>Track data hubs are collections of tracks from outside of UCSC that can be imported into "
    "the Genome Browser.  To import a public hub check the box in the list below. "
    "After import the hub will show up as a group of tracks with its own blue "
    "bar and label underneath the main browser graphic, and in the configure page. To arrange "
    "for your own track data hub to appear in this list, please contact genome@soe.ucsc.edu.</P>\n"
    );
 getDbAndGenome(cart, &database, &organism, oldVars);
 printf("<B>genome:</B> %s &nbsp;&nbsp;&nbsp;<B>assembly:</B> %s &nbsp;&nbsp;&nbsp;[%s] ", 
 	organism, hFreezeDate(database), database);
 cgiMakeButton("submit", "submit");
 printf("<BR>");
 printf("<B>List of Public Hubs</B><BR>");
 struct sqlConnection *conn = hConnectCentral();
 char query[512];
@@ -167,36 +169,36 @@
 	else
 	    webPrintLinkCell("error");
 	webPrintLinkCell(shortLabel);
 	if (isEmpty(errorMessage))
 	    webPrintLinkCell(longLabel);
 	else
 	    webPrintLinkCell(errorMessage);
 	webPrintLinkCell(url);
 	}
     }
 sqlFreeResult(&sr);
 if (gotAnyRows)
     webPrintLinkTableEnd();
 else
     printf("No Track Hubs for this genome assembly");
-printf("</FORM>\n");
 hDisconnectCentral(&conn);
 }
 
 static void addIntro()
 {
+printf("Enter URL to remote hub.<BR>\n");
 }
 
 void makeClearButton(char *field)
 /* UI button that clears a text field */
 {
 char javascript[1024];
 safef(javascript, sizeof javascript,
         "document.mainForm.%s.value = '';", field);
 cgiMakeOnClickButton(javascript, "&nbsp;Clear&nbsp;");
 }
 
 void addPrivateHubForm(struct hubConnectStatus *hub, char *err)
 /* display UI for adding private hubs by URL or pasting data */
 {
 getDbAndGenome(cart, &database, &organism, oldVars);
@@ -225,30 +227,32 @@
 
 /* row for error message */
 if (err)
     printf("<P><B>&nbsp;&nbsp;&nbsp;&nbsp;<I><FONT COLOR='RED'>Error</I></FONT>&nbsp;%s</B><P>", err);
 
 printf("Enter URL:");
 
 hTextVar(hgHubDataText, "", 60);
 cgiMakeSubmitButton();
 
 puts("</FORM>");
 }
 
 void helpPrivateHub()
 {
+printf("Private hubs are constructed the same way as public hubs, but they "
+   "aren't listed in hgcentral<BR>\n");
 }
 
 void doAddPrivateHub(struct cart *theCart, char *err)
 /* Write header and body of html page. */
 {
 cartWebStart(cart, database, "Add Private Hub");
 addPrivateHubForm(NULL, err);
 helpPrivateHub();
 cartWebEnd(cart);
 }
 
 void hubSaveInCart(struct cart *cart, struct hubConnectStatus *hub)
 {
 char hubName[1024];
 char *oldHubTrashName = cartOptionalString(cart, hubFileVar());
@@ -280,59 +284,76 @@
 carefulClose(&f);
 
 safef(hubName, sizeof(hubName), "%s%d", hgHubConnectHubVarPrefix, hub->id);
 cartSetString(cart, hubName, "1");
 
 cartSetString(cart, hubFileVar(), hubTrashName);
 }
 
 void checkForNewHub(struct cart *cart)
 {
 char *url = cartOptionalString(cart, hgHubDataText);
 
 if (url != NULL)
     {
     struct hubConnectStatus *hub = NULL;
-    struct trackHub *tHub = trackHubOpen(url, "1");
+    struct trackHub *tHub = NULL;
+
+    struct errCatch *errCatch = errCatchNew();
+    if (errCatchStart(errCatch))
+	tHub = trackHubOpen(url, "1");
+    errCatchEnd(errCatch);
+    if (errCatch->gotError)
+	{
+	warn(errCatch->message->string);
+	return;
+	}
+    errCatchFree(&errCatch);
     AllocVar(hub);
 
     hub->hubUrl = cloneString(url);
     hub->errorMessage = "";
     hub->shortLabel = tHub->shortLabel;
     hub->longLabel = tHub->longLabel;
     hub->dbCount = 0;
     AllocArray(hub->dbArray, 1);
     hub->dbArray[0] = database;
 
     hubSaveInCart(cart, hub);
     cartRemove(cart, hgHubDataText);
     }
 }
 
 void doMiddle(struct cart *theCart)
 /* Write header and body of html page. */
 {
 cart = theCart;
 setUdcCacheDir();
 if (cartVarExists(cart, hgHubDoAdd))
     doAddPrivateHub(cart, NULL);
 else
     {
     cartWebStart(cart, NULL, pageTitle);
     checkForNewHub(cart);
+    printf("<FORM ACTION=\"%s\" METHOD=\"POST\" NAME=\"mainForm\">\n", destUrl);
+    cartSaveSession(cart);
+    cgiMakeHiddenVar(hgHubConnectRemakeTrackHub, "on");
     hgHubConnectPublic();
     hgHubConnectPrivate();
+    puts("</FORM>");
+
+    makeNewHubButton();
     }
 cartWebEnd();
 }
 
-char *excludeVars[] = {"Submit", "submit", "hc_one_url", hgHubConnectCgiDestUrl, NULL};
+char *excludeVars[] = {"Submit", "submit", "hc_one_url", hgHubConnectCgiDestUrl, hgHubDoAdd, NULL};
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 oldVars = hashNew(10);
 cgiSpoof(&argc, argv);
 cartEmptyShell(doMiddle, hUserCookie(), excludeVars, oldVars);
 return 0;
 }