From a45c5d2908061a47806be13c12e96ffc59132162 Mon Sep 17 00:00:00 2001 From: Daniel Michelberger Date: Thu, 6 Aug 2026 18:41:53 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Trail-Detailseite=20mit=20Karte,=20H?= =?UTF-8?q?=C3=B6henprofil,=20Markern=20und=20Kommentaren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 (1M context) --- .../routes/dashboard/trails/[id]/+page.svelte | 543 ++++++++++++++++++ 1 file changed, 543 insertions(+) create mode 100644 frontend/src/routes/dashboard/trails/[id]/+page.svelte diff --git a/frontend/src/routes/dashboard/trails/[id]/+page.svelte b/frontend/src/routes/dashboard/trails/[id]/+page.svelte new file mode 100644 index 0000000..95b0adf --- /dev/null +++ b/frontend/src/routes/dashboard/trails/[id]/+page.svelte @@ -0,0 +1,543 @@ + + +{#if !trail} +
+ +

Trail nicht gefunden.

+
+{:else} +
+ +
+
+ +

{trail.name}

+ {#if trail.description} +

{@html trail.description}

+ {/if} +
+ +
+ + {STATUS_LABEL[trail.status] ?? trail.status} + + {#if canEdit} + + {/if} +
+
+ + {#if canEdit} +
+ {#each ['offen', 'eingeschraenkt', 'gesperrt'] as s} + + {/each} +
+ {/if} + + + + + {#if version?.geojson} + + +
+ {(version.distance_m / 1000).toFixed(1)} km + {version.ascent_m} hm + +
+ + {#if flags.scoped.length === 0} +

+ Es gibt noch keine Flag-Typen. + Jetzt anlegen +

+ {/if} + + {#if version.elevation?.length} + + (highlight = i)} + /> + {/if} + {:else} +
+ +

Für diesen Trail gibt es noch keine GPX-Datei.

+ {#if canEdit} + + {/if} +
+ {/if} +
+
+ + +
+ + + +
+ + {#if tab === 'marker'} + {#if trailMarkers.length === 0} +

+ Noch keine Marker. Setze einen über „Marker setzen" auf der Karte. +

+ {:else} +
+ {#each trailMarkers as m (m.id)} + {@const flag = flags.getById(m.flag)} + + + +
+

{flag?.label ?? 'Unbekannt'}

+ {#if m.note} +

{m.note}

+ {/if} +

{formatDate(m.created)}

+
+ +
+
+ {/each} +
+ {/if} + {:else if tab === 'kommentare'} +
+
+ e.key === 'Enter' && addComment()} + /> + +
+ {#if commentError} +

{commentError}

+ {/if} + + {#if comments.length === 0} +

Noch keine Kommentare.

+ {:else} +
+ {#each comments as c (c.id)} + + +

{c.text}

+

{formatDate(c.created)}

+
+
+ {/each} +
+ {/if} +
+ {:else} + {#if trailVersions.length === 0} +

Noch keine Version hochgeladen.

+ {:else} +
+ {#each trailVersions as v (v.id)} + + +
+
+

{formatDate(v.created)}

+ {#if v.id === trail.current} + Aktiv + {/if} +
+

+ {(v.distance_m / 1000).toFixed(1)} km · {v.ascent_m} hm + {#if v.note}· {v.note}{/if} +

+
+ + {#if v.gpx} + + {/if} + + {#if canEdit && v.id !== trail.current} + + {/if} +
+
+ {/each} +
+ {/if} + {/if} +
+{/if} + + + + + + GPX-Datei hochladen + + Die bisherige Version bleibt erhalten; die neue wird zur aktiven. + + + +
+
+ + (uploadFile = e.currentTarget.files?.[0] ?? null)} + /> +
+
+ + +
+ {#if uploadError} +

{uploadError}

+ {/if} +
+ + + + + +
+
+ + + + + + Marker setzen + + +
+
+ +
+ {#each flags.scoped as f (f.id)} + + {/each} +
+
+
+ + +
+ {#if markerError} +

{markerError}

+ {/if} +
+ + + + + +
+