* Fix(RecentNotes): Prevent folder pages from always appearing first Pass prioritizeFolders=false to byDateAndAlphabetical in RecentNotes to sort strictly by date/alphabetical order, fixing issue #1901. * refactor: split sorting functions for clarity - Split byDateAndAlphabetical into two separate functions\n- byDateAndAlphabetical: sorts strictly by date and alphabetically\n- byDateAndAlphabeticalFolderFirst: sorts with folders first\n- Updated RecentNotes to use date-only sorting * Fix(PageList): keep byDateAndAlphabeticalFolderFirst as the default sorting order for PageList
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { FullSlug, isFolderPath, resolveRelative } from "../util/path"
 | 
						|
import { QuartzPluginData } from "../plugins/vfile"
 | 
						|
import { Date, getDate } from "./Date"
 | 
						|
import { QuartzComponent, QuartzComponentProps } from "./types"
 | 
						|
import { GlobalConfiguration } from "../cfg"
 | 
						|
 | 
						|
export type SortFn = (f1: QuartzPluginData, f2: QuartzPluginData) => number
 | 
						|
 | 
						|
export function byDateAndAlphabetical(cfg: GlobalConfiguration): SortFn {
 | 
						|
  return (f1, f2) => {
 | 
						|
    // Sort by date/alphabetical
 | 
						|
    if (f1.dates && f2.dates) {
 | 
						|
      // sort descending
 | 
						|
      return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime()
 | 
						|
    } else if (f1.dates && !f2.dates) {
 | 
						|
      // prioritize files with dates
 | 
						|
      return -1
 | 
						|
    } else if (!f1.dates && f2.dates) {
 | 
						|
      return 1
 | 
						|
    }
 | 
						|
 | 
						|
    // otherwise, sort lexographically by title
 | 
						|
    const f1Title = f1.frontmatter?.title.toLowerCase() ?? ""
 | 
						|
    const f2Title = f2.frontmatter?.title.toLowerCase() ?? ""
 | 
						|
    return f1Title.localeCompare(f2Title)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export function byDateAndAlphabeticalFolderFirst(cfg: GlobalConfiguration): SortFn {
 | 
						|
  return (f1, f2) => {
 | 
						|
    // Sort folders first
 | 
						|
    const f1IsFolder = isFolderPath(f1.slug ?? "")
 | 
						|
    const f2IsFolder = isFolderPath(f2.slug ?? "")
 | 
						|
    if (f1IsFolder && !f2IsFolder) return -1
 | 
						|
    if (!f1IsFolder && f2IsFolder) return 1
 | 
						|
 | 
						|
    // If both are folders or both are files, sort by date/alphabetical
 | 
						|
    if (f1.dates && f2.dates) {
 | 
						|
      // sort descending
 | 
						|
      return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime()
 | 
						|
    } else if (f1.dates && !f2.dates) {
 | 
						|
      // prioritize files with dates
 | 
						|
      return -1
 | 
						|
    } else if (!f1.dates && f2.dates) {
 | 
						|
      return 1
 | 
						|
    }
 | 
						|
 | 
						|
    // otherwise, sort lexographically by title
 | 
						|
    const f1Title = f1.frontmatter?.title.toLowerCase() ?? ""
 | 
						|
    const f2Title = f2.frontmatter?.title.toLowerCase() ?? ""
 | 
						|
    return f1Title.localeCompare(f2Title)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
type Props = {
 | 
						|
  limit?: number
 | 
						|
  sort?: SortFn
 | 
						|
} & QuartzComponentProps
 | 
						|
 | 
						|
export const PageList: QuartzComponent = ({ cfg, fileData, allFiles, limit, sort }: Props) => {
 | 
						|
  const sorter = sort ?? byDateAndAlphabeticalFolderFirst(cfg)
 | 
						|
  let list = allFiles.sort(sorter)
 | 
						|
  if (limit) {
 | 
						|
    list = list.slice(0, limit)
 | 
						|
  }
 | 
						|
 | 
						|
  return (
 | 
						|
    <ul class="section-ul">
 | 
						|
      {list.map((page) => {
 | 
						|
        const title = page.frontmatter?.title
 | 
						|
        const tags = page.frontmatter?.tags ?? []
 | 
						|
 | 
						|
        return (
 | 
						|
          <li class="section-li">
 | 
						|
            <div class="section">
 | 
						|
              <p class="meta">
 | 
						|
                {page.dates && <Date date={getDate(cfg, page)!} locale={cfg.locale} />}
 | 
						|
              </p>
 | 
						|
              <div class="desc">
 | 
						|
                <h3>
 | 
						|
                  <a href={resolveRelative(fileData.slug!, page.slug!)} class="internal">
 | 
						|
                    {title}
 | 
						|
                  </a>
 | 
						|
                </h3>
 | 
						|
              </div>
 | 
						|
              <ul class="tags">
 | 
						|
                {tags.map((tag) => (
 | 
						|
                  <li>
 | 
						|
                    <a
 | 
						|
                      class="internal tag-link"
 | 
						|
                      href={resolveRelative(fileData.slug!, `tags/${tag}` as FullSlug)}
 | 
						|
                    >
 | 
						|
                      {tag}
 | 
						|
                    </a>
 | 
						|
                  </li>
 | 
						|
                ))}
 | 
						|
              </ul>
 | 
						|
            </div>
 | 
						|
          </li>
 | 
						|
        )
 | 
						|
      })}
 | 
						|
    </ul>
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
PageList.css = `
 | 
						|
.section h3 {
 | 
						|
  margin: 0;
 | 
						|
}
 | 
						|
 | 
						|
.section > .tags {
 | 
						|
  margin: 0;
 | 
						|
}
 | 
						|
`
 |