Skip to content

Commit a2c8dca

Browse files
committed
Sort blogs by vote score
1 parent f555174 commit a2c8dca

2 files changed

Lines changed: 41 additions & 1 deletion

File tree

‎config/pages/blogs.yaml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ sections:
1414
page_rows: 5
1515
search_category: posts
1616
browse:
17-
randomize: true
17+
randomize: false
1818
search_category: blogs
1919
blog_metadata: !import "data/blogs/metadata.yaml"
2020
post_cache: !import-list "data/blogs/posts"

‎frontend/src/pages/blogs.ts‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,45 @@ function setBusy(element: HTMLElement, busy: boolean): void {
9292
});
9393
}
9494

95+
let orderObserver: MutationObserver | null = null;
96+
97+
function sortByScore(): void {
98+
const grid = document.querySelector<HTMLElement>(".blog-grid");
99+
if (!grid) return;
100+
101+
if (!orderObserver) {
102+
const searchInput = document.querySelector<HTMLInputElement>(
103+
"[data-directory-input]",
104+
);
105+
orderObserver = new MutationObserver(() => {
106+
if (!searchInput?.value.trim()) sortByScore();
107+
});
108+
orderObserver.observe(grid, { childList: true });
109+
}
110+
111+
const score = (card: HTMLElement): number =>
112+
Number(
113+
card.querySelector<HTMLElement>("[data-blog-vote]")?.dataset.score ?? 0,
114+
);
115+
116+
const cards = Array.from(
117+
grid.querySelectorAll<HTMLElement>(":scope > .blog-card"),
118+
);
119+
cards.sort((left, right) => {
120+
const difference = score(right) - score(left);
121+
if (difference) return difference;
122+
return (left.dataset.searchTitle ?? "").localeCompare(
123+
right.dataset.searchTitle ?? "",
124+
undefined,
125+
{ sensitivity: "base" },
126+
);
127+
});
128+
129+
const current = Array.from(grid.children);
130+
if (cards.every((card, index) => card === current[index])) return;
131+
grid.append(...cards);
132+
}
133+
95134
function redirectTarget(): string {
96135
const url = new URL(window.location.href);
97136
url.hash = "";
@@ -121,6 +160,7 @@ export async function initBlogVoting(): Promise<void> {
121160
const element = byId.get(row.blog_id);
122161
if (element) setScore(element, Number(row.score) || 0);
123162
}
163+
sortByScore();
124164
}
125165

126166
async function loadUserVotes(session: SupabaseSession | null): Promise<void> {

0 commit comments

Comments
 (0)