fixes sorting by difficulty

This commit is contained in:
Christian Beutel
2025-09-07 17:59:35 +02:00
parent 8cc7029243
commit 3b7f30908c
8 changed files with 41 additions and 11 deletions

View File

@@ -69,7 +69,7 @@ func documentFromTrailRecord(app core.App, r *core.Record, author *core.Record,
"elevation_gain": r.GetFloat("elevation_gain"), "elevation_gain": r.GetFloat("elevation_gain"),
"elevation_loss": r.GetFloat("elevation_loss"), "elevation_loss": r.GetFloat("elevation_loss"),
"duration": r.GetFloat("duration"), "duration": r.GetFloat("duration"),
"difficulty": r.Get("difficulty"), "difficulty": difficultyToNumber(r.GetString("difficulty")),
"category": category, "category": category,
"completed": logCount > 0, "completed": logCount > 0,
"date": r.GetDateTime("date").Time().Unix(), "date": r.GetDateTime("date").Time().Unix(),
@@ -97,6 +97,19 @@ func documentFromTrailRecord(app core.App, r *core.Record, author *core.Record,
return document, nil return document, nil
} }
func difficultyToNumber(difficulty string) int32 {
switch difficulty {
case "easy":
return 0
case "moderate":
return 1
case "difficult":
return 2
}
return 0
}
func getPolyline(app core.App, r *core.Record) (string, error) { func getPolyline(app core.App, r *core.Record) (string, error) {
gpxPath := r.GetString("gpx") gpxPath := r.GetString("gpx")
if len(gpxPath) == 0 { if len(gpxPath) == 0 {

View File

@@ -51,9 +51,9 @@
]; ];
const difficultyItems: SelectItem[] = [ const difficultyItems: SelectItem[] = [
{ text: $_("easy"), value: "easy" }, { text: $_("easy"), value: 0 },
{ text: $_("moderate"), value: "moderate" }, { text: $_("moderate"), value: 1 },
{ text: $_("difficult"), value: "difficult" }, { text: $_("difficult"), value: 2 },
]; ];
let searchDropdownItems: SearchItem[] = $state([]); let searchDropdownItems: SearchItem[] = $state([]);

View File

@@ -111,7 +111,7 @@ interface TrailFilter {
q: string, q: string,
category: string[], category: string[],
tags: string[], tags: string[],
difficulty: ("easy" | "moderate" | "difficult")[] difficulty: (0 | 1 | 2)[]
author?: string; author?: string;
public?: boolean; public?: boolean;
shared?: boolean; shared?: boolean;
@@ -169,7 +169,7 @@ interface TrailSearchResult {
elevation_gain: number; elevation_gain: number;
elevation_loss: number; elevation_loss: number;
duration: number; duration: number;
difficulty: "easy" | "moderate" | "difficult"; difficulty: 0 | 1 | 2;
category: string; category: string;
completed: boolean; completed: boolean;
date: number; date: number;

View File

@@ -457,7 +457,7 @@ export async function searchResultToTrailList(hits: Hits<TrailSearchResult>): Pr
created: new Date(h.created * 1000).toISOString(), created: new Date(h.created * 1000).toISOString(),
date: new Date(h.date * 1000).toISOString(), date: new Date(h.date * 1000).toISOString(),
description: h.description, description: h.description,
difficulty: h.difficulty, difficulty: h.difficulty == 0 ? "easy" : h.difficulty == 1 ? "moderate" : "difficult",
distance: h.distance, distance: h.distance,
duration: h.duration, duration: h.duration,
elevation_gain: h.elevation_gain, elevation_gain: h.elevation_gain,

View File

@@ -11,7 +11,7 @@ export const load: ServerLoad = async ({ params, locals, fetch }) => {
q: "", q: "",
category: [], category: [],
tags: [], tags: [],
difficulty: ["easy", "moderate", "difficult"], difficulty: [0, 1, 2],
author: "", author: "",
public: true, public: true,
shared: true, shared: true,

View File

@@ -12,7 +12,7 @@ export const load: Load = async ({ params, fetch, parent }) => {
q: "", q: "",
category: [], category: [],
tags: [], tags: [],
difficulty: ["easy", "moderate", "difficult"], difficulty: [0, 1, 2],
author: actor.id, author: actor.id,
public: true, public: true,
shared: true, shared: true,

View File

@@ -25,7 +25,24 @@
export const snapshot: Snapshot<TrailFilter> = { export const snapshot: Snapshot<TrailFilter> = {
capture: () => filter, capture: () => filter,
restore: (value) => { restore: (value) => {
filter = value; const difficultyMap: Record<string, 0 | 1 | 2> = {
easy: 0,
moderate: 1,
difficult: 2,
};
// defensive copy
const migrated = { ...value };
if (Array.isArray(migrated.difficulty)) {
migrated.difficulty = migrated.difficulty.map((d: any) => {
if (typeof d === "string" && d in difficultyMap) {
return difficultyMap[d];
}
return d;
});
}
filter = migrated;
handleFilterUpdate(); handleFilterUpdate();
}, },
}; };

View File

@@ -10,7 +10,7 @@ export const load: ServerLoad = async ({ params, locals, url, fetch }) => {
q: "", q: "",
category: [], category: [],
tags: [], tags: [],
difficulty: ["easy", "moderate", "difficult"], difficulty: [0, 1, 2],
author: "", author: "",
public: true, public: true,
shared: true, shared: true,