import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" import style from "./styles/explorer.scss" // @ts-ignore import script from "./scripts/explorer.inline" import { classNames } from "../util/lang" import { i18n } from "../i18n" import { FileTrieNode } from "../util/fileTrie" import OverflowList from "./OverflowList" type OrderEntries = "sort" | "filter" | "map" export interface Options { title?: string folderDefaultState: "collapsed" | "open" folderClickBehavior: "collapse" | "link" useSavedState: boolean sortFn: (a: FileTrieNode, b: FileTrieNode) => number filterFn: (node: FileTrieNode) => boolean mapFn: (node: FileTrieNode) => void order: OrderEntries[] } const defaultOptions: Options = { folderDefaultState: "collapsed", folderClickBehavior: "link", useSavedState: true, mapFn: (node) => { return node }, sortFn: (a, b) => { // Sort order: folders first, then files. Sort folders and files alphabeticall if ((!a.isFolder && !b.isFolder) || (a.isFolder && b.isFolder)) { // numeric: true: Whether numeric collation should be used, such that "1" < "2" < "10" // sensitivity: "base": Only strings that differ in base letters compare as unequal. Examples: a ≠ b, a = á, a = A return a.displayName.localeCompare(b.displayName, undefined, { numeric: true, sensitivity: "base", }) } if (!a.isFolder && b.isFolder) { return 1 } else { return -1 } }, filterFn: (node) => node.slugSegment !== "tags", order: ["filter", "map", "sort"], } export type FolderState = { path: string collapsed: boolean } export default ((userOpts?: Partial) => { const opts: Options = { ...defaultOptions, ...userOpts } const Explorer: QuartzComponent = ({ cfg, displayClass }: QuartzComponentProps) => { return (
) } Explorer.css = style Explorer.afterDOMLoaded = script + OverflowList.afterDOMLoaded("explorer-ul") return Explorer }) satisfies QuartzComponentConstructor