feat(explorer): add config to support custom sort fn

This commit is contained in:
Ben Schlegel 2023-09-16 12:40:19 +02:00
parent 422ba5c365
commit c7d3474ba8
No known key found for this signature in database
GPG Key ID: 8BDB8891C1575E22
2 changed files with 20 additions and 14 deletions

View File

@ -11,6 +11,17 @@ const defaultOptions = (): Options => ({
folderClickBehavior: "collapse", folderClickBehavior: "collapse",
folderDefaultState: "collapsed", folderDefaultState: "collapsed",
useSavedState: true, useSavedState: true,
// Sort order: folders first, then files. Sort folders and files alphabetically
sortFn: (a, b) => {
if ((!a.file && !b.file) || (a.file && b.file)) {
return a.name.localeCompare(b.name)
}
if (a.file && !b.file) {
return 1
} else {
return -1
}
},
}) })
export default ((userOpts?: Partial<Options>) => { export default ((userOpts?: Partial<Options>) => {
function Explorer({ allFiles, displayClass, fileData }: QuartzComponentProps) { function Explorer({ allFiles, displayClass, fileData }: QuartzComponentProps) {
@ -22,7 +33,7 @@ export default ((userOpts?: Partial<Options>) => {
allFiles.forEach((file) => fileTree.add(file, 1)) allFiles.forEach((file) => fileTree.add(file, 1))
// Sort tree (folders first, then files (alphabetic)) // Sort tree (folders first, then files (alphabetic))
fileTree.sort() fileTree.sort(opts.sortFn!)
// Get all folders of tree. Initialize with collapsed state // Get all folders of tree. Initialize with collapsed state
const folders = fileTree.getFolderPaths(opts.folderDefaultState === "collapsed") const folders = fileTree.getFolderPaths(opts.folderDefaultState === "collapsed")

View File

@ -7,6 +7,7 @@ export interface Options {
folderDefaultState: "collapsed" | "open" folderDefaultState: "collapsed" | "open"
folderClickBehavior: "collapse" | "link" folderClickBehavior: "collapse" | "link"
useSavedState: boolean useSavedState: boolean
sortFn: (a: FileNode, b: FileNode) => number
} }
type DataWrapper = { type DataWrapper = {
@ -90,19 +91,13 @@ export class FileNode {
} }
// Sort order: folders first, then files. Sort folders and files alphabetically // Sort order: folders first, then files. Sort folders and files alphabetically
sort() { /**
this.children = this.children.sort((a, b) => { * Sorts tree according to sort/compare function
if ((!a.file && !b.file) || (a.file && b.file)) { * @param sortFn compare function used for `.sort()`, also used recursively for children
return a.name.localeCompare(b.name) */
} sort(sortFn: (a: FileNode, b: FileNode) => number) {
if (a.file && !b.file) { this.children = this.children.sort(sortFn)
return 1 this.children.forEach((e) => e.sort(sortFn))
} else {
return -1
}
})
this.children.forEach((e) => e.sort())
} }
} }