62 lines
2.1 KiB
JavaScript
62 lines
2.1 KiB
JavaScript
import { element } from "./dom.js";
|
|
import { formatBytes } from "./format.js";
|
|
|
|
function withFreeSpace(label, destination) {
|
|
if (!destination || destination.freeBytes < 0) return label;
|
|
return `${label} - ${formatBytes(destination.freeBytes)} free`;
|
|
}
|
|
|
|
function destinationForPath(destinations, path) {
|
|
return destinations.find((destination) => path === destination.path || path.startsWith(`${destination.path}/`));
|
|
}
|
|
|
|
function libraryGroups(destinations) {
|
|
const groups = new Map();
|
|
for (const destination of destinations) {
|
|
if (!groups.has(destination.root)) {
|
|
const group = document.createElement("optgroup");
|
|
group.label = destination.root;
|
|
groups.set(destination.root, group);
|
|
}
|
|
const option = element("option", "", withFreeSpace(destination.name, destination));
|
|
option.value = destination.path;
|
|
option.title = destination.path;
|
|
groups.get(destination.root).append(option);
|
|
}
|
|
return [...groups.values()];
|
|
}
|
|
|
|
function pathGroup(label, paths, destinations) {
|
|
const group = document.createElement("optgroup");
|
|
group.label = label;
|
|
for (const path of paths) {
|
|
const option = element("option", "", withFreeSpace(path, destinationForPath(destinations, path)));
|
|
option.value = path;
|
|
option.title = path;
|
|
group.append(option);
|
|
}
|
|
return group;
|
|
}
|
|
|
|
export function fillLibrarySelect(select, destinations, extras = {}) {
|
|
const previousValue = select.value;
|
|
const leadingOptions = [];
|
|
if (extras.emptyLabel) {
|
|
const emptyOption = element("option", "", extras.emptyLabel);
|
|
emptyOption.value = "";
|
|
leadingOptions.push(emptyOption);
|
|
}
|
|
if (extras.recentPaths && extras.recentPaths.length > 0) {
|
|
leadingOptions.push(pathGroup("Recent", extras.recentPaths, destinations));
|
|
}
|
|
if (extras.savedPaths && extras.savedPaths.length > 0) {
|
|
leadingOptions.push(pathGroup("Saved paths", extras.savedPaths, destinations));
|
|
}
|
|
|
|
select.replaceChildren(...leadingOptions, ...libraryGroups(destinations));
|
|
const availableValues = [...select.options].map((option) => option.value);
|
|
if (availableValues.includes(previousValue)) {
|
|
select.value = previousValue;
|
|
}
|
|
}
|