Resizable sidebar remembered in settings.json; nest tags by / like branches
This commit is contained in:
@@ -22,6 +22,13 @@ describe("buildTree", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("buildTree with keepOrder", () => {
|
||||
it("keeps the given order, folders first, each folder placed by its first item", () => {
|
||||
const t = buildTree(["v3", "backup/new", "v2", "backup/old", "rc/x"].map(item), true);
|
||||
expect(shape(t)).toEqual([{ backup: ["new", "old"] }, { rc: ["x"] }, "v3", "v2"]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("refsUnder", () => {
|
||||
it("collects every ref in a subtree", () => {
|
||||
const t = buildTree(["feat/a", "feat/b/c", "main"].map(item));
|
||||
|
||||
+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