unpkg/server/components/DirectoryListing.js

102 lines
2.2 KiB
JavaScript
Raw Normal View History

const path = require("path");
2018-04-04 05:24:22 +00:00
const formatBytes = require("pretty-bytes");
const sortBy = require("sort-by");
2017-05-25 18:25:42 +00:00
const cloneElement = require("./utils/cloneElement");
const e = require("./utils/createElement");
2017-05-25 18:25:42 +00:00
function stripLeadingSegment(name) {
return name.replace(/^[^\/]+\//, "");
2018-04-04 05:24:22 +00:00
}
2017-05-25 18:25:42 +00:00
function getValues(object) {
return Object.keys(object).map(key => object[key]);
}
function DirectoryListing({ filename, entry, entries }) {
const rows = [];
2017-05-25 18:25:42 +00:00
if (filename !== "/") {
rows.push(
2017-11-08 16:57:15 +00:00
e(
2017-11-25 21:25:01 +00:00
"tr",
{ key: ".." },
2017-11-25 21:25:01 +00:00
e("td", null, e("a", { title: "Parent directory", href: "../" }, "..")),
e("td", null, "-"),
e("td", null, "-"),
e("td", null, "-")
2017-05-25 18:25:42 +00:00
)
2018-02-17 00:00:06 +00:00
);
}
2017-05-25 18:25:42 +00:00
const matchingEntries = getValues(entries).filter(
({ name }) =>
entry.name !== name && path.dirname(name) === (entry.name || ".")
);
matchingEntries
.filter(({ type }) => type === "directory")
.sort(sortBy("name"))
.forEach(({ name }) => {
const relName = stripLeadingSegment(name);
const href = relName + "/";
rows.push(
e(
"tr",
{ key: name },
e("td", null, e("a", { title: relName, href }, href)),
e("td", null, "-"),
e("td", null, "-"),
e("td", null, "-")
)
);
});
matchingEntries
.filter(({ type }) => type === "file")
.sort(sortBy("name"))
.forEach(({ name, size, contentType, lastModified }) => {
const relName = stripLeadingSegment(name);
rows.push(
e(
"tr",
{ key: name },
e("td", null, e("a", { title: relName, href: relName }, relName)),
e("td", null, contentType),
e("td", null, formatBytes(size)),
e("td", null, lastModified)
)
);
});
2017-11-08 16:57:15 +00:00
return e(
2017-11-25 21:25:01 +00:00
"table",
2017-11-08 16:57:15 +00:00
null,
e(
2017-11-25 21:25:01 +00:00
"thead",
2017-11-08 16:57:15 +00:00
null,
e(
2017-11-25 21:25:01 +00:00
"tr",
2017-11-08 16:57:15 +00:00
null,
2017-11-25 21:25:01 +00:00
e("th", null, "Name"),
e("th", null, "Type"),
e("th", null, "Size"),
e("th", null, "Last Modified")
2017-11-08 16:57:15 +00:00
)
),
e(
"tbody",
null,
rows.map((row, index) =>
cloneElement(row, {
className: index % 2 ? "odd" : "even"
})
)
)
2018-02-17 00:00:06 +00:00
);
2017-05-25 18:25:42 +00:00
}
2018-02-17 00:00:06 +00:00
module.exports = DirectoryListing;