8f2e6dbc0e250e934382477cea73e60624ccfe32 chmalee Fri Feb 16 11:45:42 2024 -0800 Start of populating a list of files to the UI diff --git src/hg/hgHubConnect/trackHubWizard.c src/hg/hgHubConnect/trackHubWizard.c index a0d65fa..5983908 100644 --- src/hg/hgHubConnect/trackHubWizard.c +++ src/hg/hgHubConnect/trackHubWizard.c @@ -4,144 +4,147 @@ * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "cart.h" #include "cheapcgi.h" #include "hdb.h" #include "hgConfig.h" #include "md5.h" #include "trashDir.h" #include "hgHubConnect.h" #include "jsHelper.h" #include "web.h" #include "wikiLink.h" #include "customTrack.h" #include "userdata.h" +#include "jsonWrite.h" + +void doRemoveFile() +/* Process the request to remove a file */ +{ +char *userName = getUserName(); +if (userName) + { + char *cgiFileName = cgiOptionalString("deleteFile"); + char *fileName = prefixUserFile(userName, cgiFileName); + if (fileExists(fileName)) + { + fprintf(stderr, "deleting file: '%s'\n", fileName); + removeFileForUser(fileName, userName); + fprintf(stdout, "Status: 204 No Content\n\n"); + fflush(stdout); + exit(0); + } + } +fprintf(stdout, "Status: 404 Not Found\n\n"); +fflush(stdout); +exit(0); +} + +static void outFilesForUser() +/* List out the currently stored files for the user and their sizes */ +{ +char *userName = getUserName(); +struct jsonWrite *jw = jsonWriteNew(); // the JSON to return for the client javascript +jsonWriteObjectStart(jw, NULL); +if (userName) + { + struct fileInfo *file; + struct userFiles *uf = listFilesForUser(userName); + jsonWriteListStart(jw, "fileList"); + for (file = uf->file; file != NULL; file = file->next) + { + jsonWriteObjectStart(jw, NULL); + jsonWriteString(jw, "name", file->name); + jsonWriteNumber(jw, "size", file->size); + jsonWriteDateFromUnix(jw, "createTime", file->creationTime); + jsonWriteObjectEnd(jw); + } + jsonWriteListEnd(jw); + } +jsonWriteObjectEnd(jw); +jsInlineF("var userFiles = %s;\n", dyStringCannibalize(&jw->dy)); +jsonWriteFree(&jw); +} void doTrackHubWizard() /* Offer an upload form so users can upload all their hub files */ { jsIncludeFile("utils.js", NULL); jsIncludeFile("ajax.js", NULL); jsIncludeFile("lodash.3.10.0.compat.min.js", NULL); jsIncludeFile("cart.js", NULL); jsIncludeFile("tus.min.js", NULL); jsIncludeFile("hgMyData.js", NULL); webIncludeResourceFile("../style/bootstrap.min.css"); webIncludeResourceFile("../style/gb.css"); puts("<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css\">\n"); +puts("<link rel=\"stylesheet\" type=\"text/css\" " + "href=\"https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css\">\n"); +puts("<script type=\"text/javascript\" " + "src=\"https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js\"></script>"); puts("<div id='hubUpload' class='hubList'>\n"); puts("<div class='row'>\n"); puts("<div class='col-md-6'>\n"); puts("<div class='row'>\n"); puts("<div class='tabSection'>\n"); puts("<h4>Create your own hub</h4>\n"); puts("<p>After choosing files, click \"Create Hub\" to begin uploading the files to our server</p>\n"); puts("<div class='buttonDiv' id='chooseAndSendFilesRow'>\n"); puts("<label id='btnForInput' class='button' for=\"uploadedFiles\">Choose files</label>\n"); puts("</div>\n"); // .buttonDiv -puts("<div id='fileList'></div>\n"); +puts("<div id='fileList' style=\"clear: right\"></div>\n"); puts("</div>"); // .tabSection puts("</div>\n"); // row puts("<div class='row'>\n"); puts("<div class='tabSection'>"); puts("For information on making track hubs, see the following pages: \n " "<ul>\n" "<li><a href='../goldenPath/help/hubQuickStart.html' style='color:#121E9A' target=_blank>Quick Start Guide</a></li>\n" "<li><a href=\"../goldenPath/help/hgTrackHubHelp.html\" style='color:#121E9A' TARGET=_blank>Track Hub User's Guide</a></li>\n" "<li><a href=\"../goldenPath/help/hgTrackHubHelp#Hosting\" style='color:#121E9A' target=_blank>Where to Host Your Track Hub</a></li>\n" "<li><a href=\"../goldenPath/help/trackDb/trackDbHub.html\" style='color:#121E9A' target=_blank>Track Hub Settings Reference</a></li>\n" "<li><a href=\"../goldenPath/help/publicHubGuidelines.html\" style='color:#121E9A' target=_blank>Guidelines for Submitting a Public Hub</a></li>\n" "</ul>\n" "<BR>You may also <a href='../contacts.html' style='color:#121E9A'>contact us</a> if you have any " "issues or questions on hub development."); puts("</div>"); // .tabSection puts("</div>\n"); // col-md-6 puts("</div>\n"); // row puts("<div id='uploadedFilesSection' style=\"display: none\" class='col-md-6 tabSection'>"); puts("<h4>Your uploaded hubs</h4>"); webIncludeFile("inc/hgMyData.html"); puts("</div>\n"); puts("</div>\n"); // row puts("</div>\n"); // row +outFilesForUser(); jsInline("$(document).ready(function() {\nhubCreate.init();\n})"); puts("</div>"); // get the current files stored for this user } -char *prepBigData(struct cart *cart, char *fileName, char *binVar, char *fileVar) -{ -fprintf(stderr, "prepping bigData for %s\n", fileName); -struct hashEl *hel, *helList = hashElListHash(cart->hash);; -for (hel = helList; hel != NULL; hel = hel->next) -{ -fprintf(stderr, "cart var '%s': '%s'\n", hel->name, (char *)hel->val); -} -fflush(stderr); -char buf[1024]; -char *retFileName = NULL; -char *cFBin = cartOptionalString(cart, binVar); -char *cF = cartOptionalString(cart, fileVar); -char *offset = NULL; -unsigned long size = 0; -if (cFBin) - { - // cFBin already contains memory offset and size (search for __binary in cheapcgi.c) - safef(buf,sizeof(buf),"memory://%s %s", fileName, cFBin); - char *split[3]; - int splitCount = chopByWhite(cloneString(cFBin), split, sizeof(split)); - if (splitCount > 2) {errAbort("hgHubConnect: extra garbage in %s", binVar);} - offset = (char *)sqlUnsignedLong(split[0]); - size = sqlUnsignedLong(split[1]); - } -else - { - safef(buf, sizeof(buf),"memory://%s %lu %lu", - fileName, (unsigned long) cF, (unsigned long) strlen(cF)); - offset = (char *)sqlUnsignedLong(cF); - size = (unsigned long)strlen(cF); - } -if (cfgOptionBooleanDefault("storeUserFiles", FALSE)) - { - //dumpStack("prepBigData: fileName = '%s'\n", fileName); - //errAbort("prepBigData: fileName = '%s'\n", fileName); - // figure out if user is logged in: - // 1. if so, save 'fileName', which is really a pointer to memory, to username encoded directory - // 2. Turn buf into a web accessible url to this data so it will be parsed - // as a track correctly - char *userName = (loginSystemEnabled() || wikiLinkEnabled()) ? wikiLinkUserName() : NULL; - if (userName) - { - // storeUserFiles returns a URL to a track - // after sucessfully saving the data into /userdata - retFileName = storeUserFile(userName, fileName, offset, size); - } - } -return retFileName; -} - #define FILEVAR "userFile__filename" #define FILEVARBIN "userFile__binary" void doCreateHub(struct cart *cart) /* Called asynchronously when the user has submitted some files, return a json response of where * the files live and the new quota */ { // cheapcgi.c renames form variables as var__filename or var__binary for binary data, why? char *fileName = cartOptionalString(cart, FILEVAR); /* struct hashEl *hel, *helList = hashElListHash(cart->hash); for (hel = helList; hel != NULL; hel = hel->next) { fprintf(stderr, "hashEl name: '%s', value: '%s'\n", (char *)hel->name, (char *)hel->val); } */ fprintf(stderr, "fileName is: %s\n", fileName); fflush(stderr); -char *pathToFile = prepBigData(cart, fileName, FILEVARBIN, FILEVAR); +char *pathToFile = "tempPath"; //prepBigData(cart, fileName, FILEVARBIN, FILEVAR); puts("Content-Type:text/javascript\n"); printf("{\"status\": \"%s is uploaded to %s\"}\n", cgiOptionalString("userFile__filename"), pathToFile); fflush(stdout); }