Kaynağa Gözat

RHL-022 feat(sorters): add numeric string sorting helpers and corresponding tests

Code_Uwe 1 ay önce
ebeveyn
işleme
d798b53b03

+ 33 - 0
lib/frontend/explorer/sorters.js

@@ -0,0 +1,33 @@
+/**
+ * Numeric string sorting helpers.
+ *
+ * The backend currently returns ascending order for years/months/days.
+ * In the Explorer we want a "latest first" experience, so we sort descending.
+ */
+
+function toNumber(value) {
+	const n = Number.parseInt(String(value), 10);
+	return Number.isNaN(n) ? null : n;
+}
+
+export function sortNumericStringsAsc(items) {
+	const arr = Array.isArray(items) ? [...items] : [];
+	return arr.sort((a, b) => {
+		const na = toNumber(a);
+		const nb = toNumber(b);
+
+		if (na !== null && nb !== null) return na - nb;
+		return String(a).localeCompare(String(b), "de");
+	});
+}
+
+export function sortNumericStringsDesc(items) {
+	return sortNumericStringsAsc(items).reverse();
+}
+
+export function sortFilesByNameAsc(files) {
+	const arr = Array.isArray(files) ? [...files] : [];
+	return arr.sort((a, b) =>
+		String(a?.name || "").localeCompare(String(b?.name || ""), "de")
+	);
+}

+ 23 - 0
lib/frontend/explorer/sorters.test.js

@@ -0,0 +1,23 @@
+/* @vitest-environment node */
+
+import { describe, it, expect } from "vitest";
+import {
+	sortNumericStringsAsc,
+	sortNumericStringsDesc,
+	sortFilesByNameAsc,
+} from "./sorters";
+
+describe("lib/frontend/explorer/sorters", () => {
+	it("sorts numeric strings asc/desc", () => {
+		expect(sortNumericStringsAsc(["10", "2", "1"])).toEqual(["1", "2", "10"]);
+		expect(sortNumericStringsDesc(["10", "2", "1"])).toEqual(["10", "2", "1"]);
+	});
+
+	it("sorts files by name asc", () => {
+		const files = [{ name: "b.pdf" }, { name: "a.pdf" }];
+		expect(sortFilesByNameAsc(files).map((f) => f.name)).toEqual([
+			"a.pdf",
+			"b.pdf",
+		]);
+	});
+});