Resizable sidebar remembered in settings.json; nest tags by / like branches
This commit is contained in:
+11
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user