private IEnumerable <ArchivedObject> SortObjects(ArchivedObject[] objects, DirectorySortType sort, bool reverse) { if (sort == DirectorySortType.DEFAULT && !reverse) { return(objects); } IEnumerable <ArchivedObject> result; if (sort == DirectorySortType.DEFAULT) { result = objects.ToArray(); } else if (sort == DirectorySortType.FILE_DATE) { result = objects.OrderByDescending(x => x.GetLastModified()); } else if (sort == DirectorySortType.NAME) { result = objects.OrderBy(x => x.GetName()); } else if (sort == DirectorySortType.SIZE) { result = objects.OrderByDescending(x => x.GetSize()); } else if (sort == DirectorySortType.UPLOADED_DATE) { result = objects.OrderByDescending(x => x.GetUploadedDate()); } else { throw new Exception("Unsupported sort method."); } //Flip if (reverse) { return(result.Reverse()); } else { return(result); } }
public async Task OnStandardRequest(HttpContext e) { //Write headers e.Response.ContentType = "text/html"; //Set cookie SaveCurrentItemCookie(e); //Get the sort type DirectorySortType sort = metadata.default_sort; bool sortReverse = false; if (e.Request.Query.ContainsKey("sort")) { Enum.TryParse <DirectorySortType>(e.Request.Query["sort"], out sort); } if (e.Request.Query.ContainsKey("sort_reverse")) { sortReverse = bool.TryParse(e.Request.Query["sort_reverse"], out sortReverse); } //Create path string pathElements = ""; var parentElement = this; string pathPlain = ""; while (parentElement != null) { string name; if (parentElement.isRoot) { name = "<span class=\"material-icons\"> folder </span>"; } else { name = HttpUtility.HtmlEncode(parentElement.GetName()); pathPlain = " > " + name + pathPlain; } pathElements = "<div class=\"head_path_item\"><a href=\"" + site.config.client_pathname_prefix + parentElement.path_urlsafe + "\">" + name + "</a></div><div class=\"head_path_divider\">/</div>" + pathElements; parentElement = parentElement.parent; } //Create HTML meta headers string metas = ""; metas += $"<meta property=\"og:site_name\" content=\"RomanPort Archives{pathPlain}\">\n"; metas += $"<meta name=\"theme-color\" content=\"#3882dc\">\n"; metas += $"<meta property=\"og:title\" content=\"{HttpUtility.HtmlEncode(GetName())} (in {HttpUtility.HtmlEncode(parent.metadata.title)})\">\n"; metas += $"<meta property=\"og:description\" content=\"Last Updated {HttpUtility.HtmlEncode(GetLastModifiedString())}\n{HttpUtility.HtmlEncode(metadata.description)}\">\n"; //Write pre await TemplateManager.WriteTemplate(e.Response.Body, "PAGE.DIR.PRE_CONTENT", new Dictionary <string, string> { { "FOLDER_TITLE", HttpUtility.HtmlEncode(metadata.title) }, { "FOLDER_DESCRIPTION", HttpUtility.HtmlEncode(metadata.description) }, { "URL", site.config.client_pathname_prefix + path_urlsafe }, { "PATH", pathElements }, { "CURRENT_SORT", sort.ToString() }, { "META_TAGS", metas } }); //Write the up directory button if (!isRoot) { await TemplateManager.WriteTemplate(e.Response.Body, "ITEM.UP", new Dictionary <string, string> { { "PATH", site.config.client_pathname_prefix + parent.path_urlsafe + "?last=" + HttpUtility.UrlEncode(GetName()) }, { "SELECT_SORT_0", sort == DirectorySortType.DEFAULT ? " selected" : "" }, { "SELECT_SORT_1", sort == DirectorySortType.FILE_DATE ? " selected" : "" }, { "SELECT_SORT_2", sort == DirectorySortType.NAME ? " selected" : "" }, { "SELECT_SORT_3", sort == DirectorySortType.SIZE ? " selected" : "" }, { "SELECT_SORT_4", sort == DirectorySortType.UPLOADED_DATE ? " selected" : "" } }); } //Attempt to get the last served from the cookie. We add a highlight to that item string last = ""; if (e.Request.Cookies.ContainsKey(COOKIE_PREVIOUS_ITEM)) { last = e.Request.Cookies[COOKIE_PREVIOUS_ITEM]; } //Write folders foreach (var f in SortObjects(subDirs.ToArray(), sort, sortReverse)) { await WriteObjectListingHere(e, f, last); } //Write files foreach (var f in SortObjects(subFiles.ToArray(), sort, sortReverse)) { await WriteObjectListingHere(e, f, last); } //Write admin bar if authenticated if (site.IsAdminAuthenticated(e)) { await e.WriteString($"<div class=\"adminbar\"><b>Archive Admin</b> - <a href=\"?action=admin_upload\">[Upload File]</a> <a href=\"?action=admin_audio_editor\">[Edit & Upload Audio]</a> <a href=\"?action=admin_mkdir\">[Create Directory]</a> - <a href=\"?action=admin_modify\">[Modify Directory]</a> <a href=\"?action=admin_delete\">[Delete Directory]</a> - <a href=\"{site.config.client_pathname_prefix}/signout\">[Log Out]</a></div>"); } //Write end await TemplateManager.WriteTemplate(e.Response.Body, "PAGE.DIR.POST_CONTENT", new Dictionary <string, string> { { "FOOTER", footer }, { "ADMIN_SIGNIN_URL", site.config.client_pathname_prefix + "/signin" } }); }