7b7bb68187bb42ead29a9a3b26a950205820c9ae chmalee Wed Nov 20 15:54:48 2024 -0800 Make up to 25 rows show by default, make the table scroll down if it's more than 600 pixels, make the table collapse when there are less than 600 pixels height needed. Remove the 'Action' title, remove the delete button from each row, make the checkboxes select files, on checkbox select populate an info section about how many files have been selected and give the option to view or delete them Start of reworking the delete button to delete a list of files. The backend still needs to be smarter about creating the locations of files Put some place holder text where the selected file information would appear so the page doesn't jump around Start of work on back end for removing files. Changed the json returned for listing the files to list the full path to the file to make the requests to delete a file easier. Still need to decide on encoding vs decoding of the parent dirs during uploads diff --git src/hg/hgHubConnect/trackHubWizard.c src/hg/hgHubConnect/trackHubWizard.c index 3b366d4..682b9ef 100644 --- src/hg/hgHubConnect/trackHubWizard.c +++ src/hg/hgHubConnect/trackHubWizard.c @@ -10,76 +10,78 @@ #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" #include "cartJson.h" #include "hubSpace.h" #include "hubConnect.h" #include "trackHub.h" -void removeOneFile(char *userName, char *cgiFileName) +void removeOneFile(char *userName, char *cgiFileName, char *fullPath, char *db, char *fileType) /* Remove one single file for userName */ { -char *fileName = prefixUserFile(userName, cgiEncodeFull(cgiFileName)); +char *fileName = prefixUserFile(userName, cgiEncodeFull(fullPath), NULL); if (fileExists(fileName)) { fprintf(stderr, "deleting file: '%s'\n", fileName); removeFileForUser(fileName, userName); fflush(stderr); } else { fprintf(stderr, "file '%s' does not exist\n", fileName); fflush(stderr); } } void removeHubDir(char *userName, char *cgiFileName) /* Remove one single hub for userName */ { -char *hubDir = prefixUserFile(userName, cgiEncodeFull(cgiFileName)); +char *hubDir = prefixUserFile(userName, cgiEncodeFull(cgiFileName), NULL); if (isDirectory(hubDir)) { fprintf(stderr, "deleting directory: '%s'\n", hubDir); removeHubForUser(hubDir, userName); fflush(stderr); } } void doRemoveFile(struct cartJson *cj, struct hash *paramHash) /* Process the request to remove a file */ { char *userName = getUserName(); if (userName) { // our array of objects, each object represents a track file struct jsonElement *deleteJson = hashFindVal(paramHash, "fileList"); struct slRef *f, *fileList = deleteJson->val.jeList; jsonWriteListStart(cj->jw, "deletedList"); for (f = fileList; f != NULL; f = f->next) { struct jsonElement *fileObj = (struct jsonElement *)f->val; char *fileName = jsonStringField(fileObj, "fileName"); - //char *fileType = jsonStringField(fileObj, "fileType"); - //struct slName *hubList = slNameListFromComma(jsonStringField(fileObj, "hubNameList")); - removeOneFile(userName, fileName); + char *fileType = jsonStringField(fileObj, "fileType"); + char *db = jsonStringField(fileObj, "genome"); + //char *parentDir = jsonStringField(fileObj, "parentDir"); + char *fullPath = jsonStringField(fileObj, "fullPath"); + removeOneFile(userName, fileName, fullPath, db, fileType); jsonWriteString(cj->jw, NULL, fileName); } jsonWriteListEnd(cj->jw); /* //for now don't worry about this: //if (isHub) // removeHubDir(userName, fname); */ } } void doMoveFile(struct cartJson *cj, struct hash *paramHash) /* Move a file to a new hub */ { } @@ -88,31 +90,31 @@ /* Make a new hub.txt with the parameters from the JSON request */ { char *userName = getUserName(); if (userName) { struct jsonWrite *errors = jsonWriteNew(); // verify the arguments: (void)cartJsonRequiredParam(paramHash, "createHub", errors, "doCreateHub"); // paramHash is an object with everything necessary to create a hub: name and assembly char *db = jsonStringVal(hashFindVal(paramHash, "db"), "db"); char *name = jsonStringVal(hashFindVal(paramHash, "name"), "name"); char *encodedName = cgiEncodeFull(name); fprintf(stderr, "creating hub '%s' for db '%s'\n", encodedName, db); fflush(stderr); // check if this hub already exists, must have a directory and hub.txt already: - char *path = prefixUserFile(userName, encodedName); + char *path = prefixUserFile(userName, encodedName, NULL); if (isDirectory(path)) { // can't make a hub that already exists! fprintf(stdout, "Status: 400 Bad Request\n\n"); fprintf(stdout, "Hub already exists, select hub from dropdown or try a different name"); fflush(stdout); exit(1); } else { // good we can make a new directory and stuff a hub.txt in it // the directory needs to be 777, so ignore umask for now writeHubText(path, userName, encodedName, db); // TODO: add a row to the hubspace table for the hub.txt //addHubTxtToTable(userName, path, name, db); @@ -136,30 +138,31 @@ // the url for this user: jsonWriteString(jw, "userUrl", webDataDir(userName)); jsonWriteListStart(jw, "fileList"); struct hubSpace *file, *fileList = listFilesForUser(userName); for (file = fileList; file != NULL; file = file->next) { jsonWriteObjectStart(jw, NULL); cgiDecodeFull(file->fileName, file->fileName, strlen(file->fileName)); jsonWriteString(jw, "fileName", file->fileName); jsonWriteNumber(jw, "fileSize", file->fileSize); jsonWriteString(jw, "fileType", file->fileType); jsonWriteString(jw, "parentDir", file->parentDir); jsonWriteString(jw, "genome", file->db); jsonWriteString(jw, "lastModified", file->lastModified); jsonWriteString(jw, "uploadTime", file->creationTime); + jsonWriteString(jw, "fullPath", stripDataDir(file->location, userName)); jsonWriteObjectEnd(jw); } jsonWriteListEnd(jw); } jsonWriteObjectEnd(jw); jsInlineF("var isLoggedIn = %s\n", getUserName() ? "true" : "false"); jsInlineF("var userFiles = %s;\n", dyStringCannibalize(&jw->dy)); jsInlineF("var hubNameDefault = \"%s\";\n", defaultHubNameForUser(getUserName())); // if the user is not logged, the 0 for the quota is ignored jsInlineF("var userQuota = %llu\n", getUserName() ? checkUserQuota(getUserName()) : 0); jsInlineF("var maxQuota = %llu\n", getUserName() ? getMaxUserQuota(getUserName()) : HUB_SPACE_DEFAULT_QUOTA); jsonWriteFree(&jw); } void doTrackHubWizard(char *database)