Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 4x 4x 18x 4x 4x 18x 18x 4x 18x 18x 18x 29x 13x 16x 18x 18x 18x 4x 18x 18x 29x 13x 18x 18x 18x | import { CodeMapNode, NodeType, SortingOption } from "../../../../../codeCharta.model"
type CompareFunction = (a: CodeMapNode, b: CodeMapNode) => number
const nameCollator = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" })
const sortByName: CompareFunction = (a, b) => nameCollator.compare(a.name, b.name)
const sortByUnary: CompareFunction = (a, b) => a.attributes.unary - b.attributes.unary
const getCompareFunction = (sortingOrder: SortingOption, sortingOrderAscending: boolean) => {
const compareFunction = sortingOrder === SortingOption.NUMBER_OF_FILES ? sortByUnary : sortByName
return sortingOrderAscending ? compareFunction : (a: CodeMapNode, b: CodeMapNode) => -1 * compareFunction(a, b)
}
const groupAndSortNodeByFilesAndFolders = (compareFunction: CompareFunction, node: CodeMapNode) => {
const folders: CodeMapNode[] = []
const files: CodeMapNode[] = []
for (const child of node.children) {
if (child.type === NodeType.FOLDER) {
folders.push(child)
} else {
files.push(child)
}
}
folders.sort(compareFunction)
files.sort(compareFunction)
return [...folders, ...files]
}
/** sort given node inplace */
export const sortNode = (node: CodeMapNode, sortingOrder: SortingOption, sortingOrderAscending: boolean) => {
Iif (!node) {
return
}
for (let index = 0; index < node.children.length; index++) {
if (node.children[index].type === NodeType.FOLDER) {
node.children[index] = sortNode(node.children[index], sortingOrder, sortingOrderAscending)
}
}
const compareFunction = getCompareFunction(sortingOrder, sortingOrderAscending)
node.children = groupAndSortNodeByFilesAndFolders(compareFunction, node)
return node
}
|