require("./DirectoryListing.css"); const React = require("react"); const formatBytes = require("pretty-bytes"); const sortBy = require("sort-by"); function getDirname(name) { return ( name .split("/") .slice(0, -1) .join("/") || "." ); } function getMatchingEntries(entry, entries) { const dirname = entry.name || "."; return Object.keys(entries) .filter(name => entry.name !== name && getDirname(name) === dirname) .map(name => entries[name]); } function getRelativeName(base, name) { return base.length ? name.substr(base.length + 1) : name; } function DirectoryListing({ filename, entry, entries }) { const rows = []; if (filename !== "/") { rows.push( .. - - - ); } const matchingEntries = getMatchingEntries(entry, entries); matchingEntries .filter(({ type }) => type === "directory") .sort(sortBy("name")) .forEach(({ name }) => { const relName = getRelativeName(entry.name, name); const href = relName + "/"; rows.push( {href} - - - ); }); matchingEntries .filter(({ type }) => type === "file") .sort(sortBy("name")) .forEach(({ name, size, contentType, lastModified }) => { const relName = getRelativeName(entry.name, name); rows.push( {relName} {contentType} {formatBytes(size)} {lastModified} ); }); return (
{rows.map((row, index) => React.cloneElement(row, { className: index % 2 ? "odd" : "even" }) )}
Name Type Size Last Modified
); } if (process.env.NODE_ENV === "development") { const PropTypes = require("prop-types"); const entryType = PropTypes.shape({ name: PropTypes.string.isRequired }); DirectoryListing.propTypes = { filename: PropTypes.string.isRequired, entry: entryType.isRequired, entries: PropTypes.objectOf(entryType).isRequired }; } module.exports = DirectoryListing;