From cfe625894d631c0fe0784664f26c78a95e4a6a21 Mon Sep 17 00:00:00 2001 From: andreasCanSee Date: Sat, 19 Jul 2025 16:58:22 +0200 Subject: [PATCH 01/14] feat(tree): add tree_species table and display description on tree detail page --- frontend/src/lib/supabase/trees.ts | 15 ++++++++ .../src/routes/trees/[treeId]/+page.svelte | 36 ++++++++++++++----- .../20250719141821_create_tree_species.sql | 13 +++++++ 3 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 supabase/migrations/20250719141821_create_tree_species.sql diff --git a/frontend/src/lib/supabase/trees.ts b/frontend/src/lib/supabase/trees.ts index 579daf8..ad43f8a 100644 --- a/frontend/src/lib/supabase/trees.ts +++ b/frontend/src/lib/supabase/trees.ts @@ -37,4 +37,19 @@ export async function loadSpeciesMap(treeIds: string[]): Promise import { page } from '$app/stores'; import { supabase } from '$lib/supabase'; + import { onMount } from 'svelte'; import type { TreeData } from '$types/tree'; + import { getTreeSpeciesDescription } from '$lib/supabase'; import { Accordion } from '$components/ui'; import type AccordionType from '$components/ui/Accordion.svelte'; @@ -20,22 +22,35 @@ let openAbout = true; let openWater = false; let openHistory = false; + let treeDescription: string | null = null; $: showInfo = activeTabIndex === 0; $: showChat = activeTabIndex === 1; let tree: TreeData; + async function loadTree(treeId: string) { + const { data: treeData, error } = await supabase + .from('trees') + .select() + .eq('uuid', treeId) + .maybeSingle(); + + if (error) { + console.error('Fehler beim Laden des Baums:', error.message); + return; + } + + tree = treeData; + + if (tree) { + treeDescription = await getTreeSpeciesDescription(tree.tree_type_botanic); + } + } + // Lädt den Baum neu, sobald sich die treeId in der URL ändert $: if ($page.params.treeId) { - (async () => { - const { data } = await supabase - .from('trees') - .select() - .eq('uuid', $page.params.treeId) - .maybeSingle(); - tree = data; - })(); + loadTree($page.params.treeId); } @@ -88,6 +103,11 @@

🌳 Über diesen Baum

+

+ {treeDescription + ? treeDescription + : 'Hej, wie mein Name schon verrät komme ich ursprünglich aus dem Norden von Europa. …'} +

Date: Sat, 19 Jul 2025 17:04:21 +0200 Subject: [PATCH 02/14] refactor: extract tree loading logic and clean up imports --- frontend/src/lib/supabase/trees.ts | 18 ++++++++++++ .../src/routes/trees/[treeId]/+page.svelte | 28 ++++++------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/frontend/src/lib/supabase/trees.ts b/frontend/src/lib/supabase/trees.ts index ad43f8a..67784d8 100644 --- a/frontend/src/lib/supabase/trees.ts +++ b/frontend/src/lib/supabase/trees.ts @@ -52,4 +52,22 @@ export async function getTreeSpeciesDescription(treeTypeBotanic: string) { } return data?.description ?? null; +} + +/** + * Holt alle Baumdaten für eine bestimmte UUID aus der trees-Tabelle. + */ +export async function getTreeById(treeId: string) { + const { data, error } = await supabase + .from('trees') + .select() + .eq('uuid', treeId) + .maybeSingle(); + + if (error) { + console.error('Failed to load tree:', error.message); + return null; + } + + return data; } \ No newline at end of file diff --git a/frontend/src/routes/trees/[treeId]/+page.svelte b/frontend/src/routes/trees/[treeId]/+page.svelte index 35e0b68..c3d3b1b 100644 --- a/frontend/src/routes/trees/[treeId]/+page.svelte +++ b/frontend/src/routes/trees/[treeId]/+page.svelte @@ -1,18 +1,19 @@ + + + + {@html renderedDescription} + + diff --git a/frontend/src/components/trees/TreeMetric.svelte b/frontend/src/components/trees/TreeMetric.svelte index 6ae37e1..aad4dfa 100644 --- a/frontend/src/components/trees/TreeMetric.svelte +++ b/frontend/src/components/trees/TreeMetric.svelte @@ -8,56 +8,94 @@ $: percent = Math.min(100, Math.max(0, (value / max) * 100)); -
- -
- - - - - - {#if position === 'right'} - -
-
+
+ +
+ + -
- {:else if position === 'top'} - -
-
-
- {:else if position === 'bottom'} - -
+ + + + {#if position === 'right'} +
+
+
+ {:else if position === 'top'}
-
- {/if} -
+ class="absolute top-[-10px] left-1/2 transform -translate-x-1/2 h-[5px] w-14 bg-gray-200 rounded" + > +
+
+ {:else if position === 'bottom'} +
+
+
+ {/if} +
- -

{label}

-

{value} {unit}

+ +
+

+ {#if label === 'Kronendurchmesser'} + Kronen-
durchmesser + {:else if label === 'Stammdurchmesser'} + Stamm-
durchmesser + {:else} + {label} + {/if} +

+

+ {value} + {unit} +

+
+
+ + diff --git a/frontend/src/components/trees/TreeMetricsView.svelte b/frontend/src/components/trees/TreeMetricsView.svelte new file mode 100644 index 0000000..b3e1873 --- /dev/null +++ b/frontend/src/components/trees/TreeMetricsView.svelte @@ -0,0 +1,47 @@ + + +{#if $isMobile} + +
+
+ + + +
+
+{:else} + +
+ + + +
+{/if} diff --git a/frontend/src/components/trees/index.ts b/frontend/src/components/trees/index.ts index 0ce23e2..e0fefd5 100644 --- a/frontend/src/components/trees/index.ts +++ b/frontend/src/components/trees/index.ts @@ -1,5 +1,6 @@ export { default as AdoptTreeButton } from './AdoptTreeButton.svelte'; -export { default as TreeMetric } from './TreeMetric.svelte'; +export { default as TreeDescription } from './TreeDescription.svelte'; +export { default as TreeMetricsView } from './TreeMetricsView.svelte'; export { default as TreeWaterings } from './TreeWaterings.svelte'; export { default as WaterColumn } from './WaterColumn.svelte'; export { default as AddWateringForm } from './add-watering/AddWateringForm.svelte'; diff --git a/frontend/src/routes/trees/[treeId]/+page.svelte b/frontend/src/routes/trees/[treeId]/+page.svelte index e03772d..2154066 100644 --- a/frontend/src/routes/trees/[treeId]/+page.svelte +++ b/frontend/src/routes/trees/[treeId]/+page.svelte @@ -13,7 +13,13 @@ import { Accordion, Notice } from '$components/ui'; import { DialogPanel } from '$components/overlay'; import { Chat } from '$components/chat'; - import { AdoptTreeButton, WaterTreeButton, TreeMetric, TreeWaterings } from '$components/trees'; + import { + AdoptTreeButton, + WaterTreeButton, + TreeMetricsView, + TreeWaterings, + TreeDescription + } from '$components/trees'; export let activeTabIndex = 0; const handleTabChange = (tab: number) => (activeTabIndex = tab); @@ -91,33 +97,22 @@ {#if activeTabIndex === 0}
-

🌳 Über diesen Baum

-
-
-

- {treeDescription - ? treeDescription - : 'Hej, wie mein Name schon verrät komme ich ursprünglich aus dem Norden von Europa. …'} +

+ 🌳 Über diesen Baum

-
- - - -
+
+ +
+ + +
+
From 22fb93860026479bb47c439664d9672ba2e6996e Mon Sep 17 00:00:00 2001 From: andreasCanSee Date: Sat, 19 Jul 2025 21:32:13 +0200 Subject: [PATCH 06/14] enhance: add external link to Bielefeld climate analysis in info notice --- frontend/src/routes/trees/[treeId]/+page.svelte | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/frontend/src/routes/trees/[treeId]/+page.svelte b/frontend/src/routes/trees/[treeId]/+page.svelte index 2154066..91cd840 100644 --- a/frontend/src/routes/trees/[treeId]/+page.svelte +++ b/frontend/src/routes/trees/[treeId]/+page.svelte @@ -122,7 +122,17 @@ Dieser Baum beeinflusst seine Umgebung positiv: Er spendet Schatten, reguliert das Mikroklima, verbessert die Luftqualität und bietet Lebensraum für Tiere und - Insekten. Weitere Informationen folgen in einem späteren Update. + Insekten. Weitere Informationen folgen in einem späteren Update.

Bis + dahin kannst du dir die + + Stadtklimaanalyse Bielefeld + durchlesen, um zu erfahren, warum du dank der Stadtbäume in Bielefeld im Sommer + besser schlafen kannst. 🤓
From 1d3aff22b14b622c3e05d74088ee751fa7bd52d2 Mon Sep 17 00:00:00 2001 From: andreasCanSee Date: Sun, 20 Jul 2025 22:02:40 +0200 Subject: [PATCH 07/14] refactor(Accordion): use ResizeObserver to solve UI bug in description section, remove dispatcher --- .../src/components/trees/TreeMetric.svelte | 6 ++--- .../src/components/trees/TreeWaterings.svelte | 5 +--- frontend/src/components/ui/Accordion.svelte | 24 ++++++++++++++----- frontend/src/lib/supabase/waterings.ts | 12 ++++++++++ .../src/routes/trees/[treeId]/+page.svelte | 5 +--- 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/frontend/src/components/trees/TreeMetric.svelte b/frontend/src/components/trees/TreeMetric.svelte index aad4dfa..b3526a9 100644 --- a/frontend/src/components/trees/TreeMetric.svelte +++ b/frontend/src/components/trees/TreeMetric.svelte @@ -10,7 +10,7 @@
@@ -66,7 +66,7 @@
-

+

{#if label === 'Kronendurchmesser'} Kronen-
durchmesser {:else if label === 'Stammdurchmesser'} @@ -75,7 +75,7 @@ {label} {/if}

-

+

{value} {unit}

diff --git a/frontend/src/components/trees/TreeWaterings.svelte b/frontend/src/components/trees/TreeWaterings.svelte index 7fa194f..b687773 100644 --- a/frontend/src/components/trees/TreeWaterings.svelte +++ b/frontend/src/components/trees/TreeWaterings.svelte @@ -1,5 +1,5 @@