Resizable sidebar remembered in settings.json; nest tags by / like branches

This commit is contained in:
2026-10-14 22:21:09 +02:00
parent bf9b3baa1f
commit f027ebe2aa
7 changed files with 127 additions and 13 deletions
+11 -3
View File
@@ -10,8 +10,11 @@ export interface TreeNode {
ref?: Ref;
}
/** Splits short names by `/` into a tree. Folders come before refs, each sorted by name. */
export function buildTree(items: { short: string; ref: Ref }[]): TreeNode[] {
/**
* Splits short names by `/` into a tree. Folders come before refs, each sorted by name,
* or, with `keepOrder`, in the order of `items` (a folder takes the place of its first item).
*/
export function buildTree(items: { short: string; ref: Ref }[], keepOrder = false): TreeNode[] {
const root: TreeNode = { label: "", path: "", children: [] };
for (const { short, ref } of items) {
let node = root;
@@ -32,7 +35,12 @@ export function buildTree(items: { short: string; ref: Ref }[]): TreeNode[] {
);
nodes.forEach((n) => sort(n.children));
};
sort(root.children);
const foldersFirst = (nodes: TreeNode[]) => {
// Array.prototype.sort is stable, so items keep their order within each group.
nodes.sort((a, b) => Number(b.children.length > 0) - Number(a.children.length > 0));
nodes.forEach((n) => foldersFirst(n.children));
};
(keepOrder ? foldersFirst : sort)(root.children);
return root.children;
}