Skip to content

Commit b55ba21

Browse files
authored
Merge pull request #1153 from i-dot-ai/feature/add-external-langfuse-link-to-header
Added external links to header management for langfuse
2 parents e4d84c2 + 30db610 commit b55ba21

File tree

13 files changed

+145
-30
lines changed

13 files changed

+145
-30
lines changed

frontend/.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
AWS_BUCKET_NAME="i-dot-ai-dev-consult-data"
22
PUBLIC_BACKEND_URL="http://localhost:8000"
3+
PUBLIC_LANGFUSE_URL="/"
34
TEST_INTERNAL_ACCESS_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVtYWlsQGV4YW1wbGUuY29tIn0.k27nav4gbG-2lIArYInTqP1GUz2LRuzb3lWandMKRoY # pragma: allowlist secret

frontend/scripts/type-errors.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"errorCount": 44,
2+
"errorCount": 40,
33
"warningCount": 18,
4-
"lastUpdated": "2026-01-26",
4+
"lastUpdated": "2026-02-02",
55
"note": "This file tracks the number of type errors in the codebase. CI will fail if the number of errors increase or decrease without updating this file."
66
}

frontend/src/components/WithExternalClick/WithExternalClick.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
window.addEventListener("click", handleOutsideClick);
2020
}
2121
function removeListeners() {
22-
window.addEventListener("click", handleOutsideClick);
22+
window.removeEventListener("click", handleOutsideClick);
2323
}
2424
2525
function handleOutsideClick(e: MouseEvent) {

frontend/src/components/inputs/Button/Button.svelte

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
export let fullWidth: boolean = false;
2424
export let testId: string = "";
2525
export let href: string | undefined = undefined;
26+
export let target: string | undefined = undefined;
27+
export let rel: string | undefined = undefined;
2628
export let ariaControls: string | undefined = undefined;
2729
export let noPadding: boolean = false;
2830
export let fixedHoverColor: boolean = false;
@@ -36,6 +38,8 @@
3638
data-variant={variant}
3739
tabindex="0"
3840
{href}
41+
{target}
42+
{rel}
3943
class={clsx([
4044
fullWidth && "w-full",
4145
`text-${size}`,

frontend/src/components/navigation/Header/Header.svelte

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import MaterialIcon from "../../MaterialIcon.svelte";
1111
import ChevronRight from "../../svg/material/ChevronRight.svelte";
1212
import Menu from "../../svg/material/Menu.svelte";
13+
import OpenInNew from "../../svg/material/OpenInNew.svelte";
1314
import Button from "../../inputs/Button/Button.svelte";
1415
import WithExternalClick from "../../WithExternalClick/WithExternalClick.svelte";
1516
@@ -20,7 +21,7 @@
2021
subtitle = "",
2122
pathParts = [],
2223
icon = IaiIcon,
23-
navItems = [{ label: "Home", url: "/" }],
24+
navItems = [{ label: "Home", url: "/", external: false }],
2425
endItems,
2526
}: Props = $props();
2627
@@ -55,9 +56,16 @@
5556
}
5657
</script>
5758

58-
{#snippet navButton(label: string, url?: string)}
59+
{#snippet navButton(label: string, url?: string, external?: boolean)}
5960
<div class="hover:text-primary">
60-
<Button variant="ghost" fullWidth={true} size="sm" href={url}>
61+
<Button
62+
variant="ghost"
63+
fullWidth={true}
64+
size="sm"
65+
href={url}
66+
target={external ? "_blank" : undefined}
67+
rel={external ? "noopener noreferrer" : undefined}
68+
>
6169
<span
6270
class={clsx([
6371
"whitespace-nowrap",
@@ -66,9 +74,17 @@
6674
"py-1",
6775
"md:py-0",
6876
"w-full",
77+
"flex",
78+
"items-center",
79+
"gap-1",
6980
])}
7081
>
7182
{label}
83+
{#if external}
84+
<MaterialIcon size="0.8rem" color="fill-current">
85+
<OpenInNew />
86+
</MaterialIcon>
87+
{/if}
7288
</span>
7389
</Button>
7490
</div>
@@ -192,13 +208,17 @@
192208
>
193209
{#each navItem.children as subItem, i (i)}
194210
<li>
195-
{@render navButton(subItem.label, subItem.url)}
211+
{@render navButton(
212+
subItem.label,
213+
subItem.url,
214+
subItem.external,
215+
)}
196216
</li>
197217
{/each}
198218
</ol>
199219
{/if}
200220
{:else}
201-
{@render navButton(navItem.label, navItem.url)}
221+
{@render navButton(navItem.label, navItem.url, navItem.external)}
202222
{/if}
203223

204224
{#if isMobile}

frontend/src/components/navigation/Header/__snapshots__/Header.test.ts.snap

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,10 @@ exports[`Header > matches snapshot 1`] = `
161161
>
162162
<!---->
163163
<span
164-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
164+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
165165
>
166-
Home
166+
Home
167+
<!---->
167168
</span>
168169
169170
@@ -236,9 +237,10 @@ exports[`Header > matches snapshot 1`] = `
236237
>
237238
<!---->
238239
<span
239-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
240+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
240241
>
241-
Walkthrough
242+
Walkthrough
243+
<!---->
242244
</span>
243245
244246
@@ -264,9 +266,10 @@ exports[`Header > matches snapshot 1`] = `
264266
>
265267
<!---->
266268
<span
267-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
269+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
268270
>
269-
Guidance
271+
Guidance
272+
<!---->
270273
</span>
271274
272275
@@ -292,9 +295,10 @@ exports[`Header > matches snapshot 1`] = `
292295
>
293296
<!---->
294297
<span
295-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
298+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
296299
>
297-
Feedback
300+
Feedback
301+
<!---->
298302
</span>
299303
300304
@@ -320,9 +324,10 @@ exports[`Header > matches snapshot 1`] = `
320324
>
321325
<!---->
322326
<span
323-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
327+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
324328
>
325-
Privacy notice
329+
Privacy notice
330+
<!---->
326331
</span>
327332
328333
@@ -400,9 +405,10 @@ exports[`Header > matches snapshot 1`] = `
400405
>
401406
<!---->
402407
<span
403-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
408+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
404409
>
405-
Consultations
410+
Consultations
411+
<!---->
406412
</span>
407413
408414
@@ -428,9 +434,10 @@ exports[`Header > matches snapshot 1`] = `
428434
>
429435
<!---->
430436
<span
431-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
437+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
432438
>
433-
Users
439+
Users
440+
<!---->
434441
</span>
435442
436443

frontend/src/components/navigation/Header/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export interface NavItem {
44
label: string;
55
url?: string;
66
children?: NavItem[];
7+
external?: boolean;
78
}
89

910
export interface Props {

frontend/src/components/navigation/HeaderConsult/HeaderConsult.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { slide } from "svelte/transition";
33
44
import { Routes } from "../../../global/routes";
5+
import { getLangfuseUrl } from "../../../global/utils";
56
import type { ConsultationStage } from "../../../global/types";
67
78
import Button from "../../inputs/Button/Button.svelte";
@@ -56,6 +57,7 @@
5657
},
5758
{ label: "Manage Users", url: Routes.SupportUsers },
5859
{ label: "Data Pipeline", url: Routes.SupportDataPipeline },
60+
{ label: "Langfuse", url: getLangfuseUrl(), external: true },
5961
],
6062
},
6163
]

frontend/src/components/navigation/HeaderConsult/__snapshots__/HeaderConsult.test.ts.snap

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,10 @@ exports[`HeaderConsult > matches snapshot 1`] = `
200200
>
201201
<!---->
202202
<span
203-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
203+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
204204
>
205-
Privacy notice
205+
Privacy notice
206+
<!---->
206207
</span>
207208
208209
@@ -280,9 +281,10 @@ exports[`HeaderConsult > matches snapshot 1`] = `
280281
>
281282
<!---->
282283
<span
283-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
284+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
284285
>
285-
Manage Consultations
286+
Manage Consultations
287+
<!---->
286288
</span>
287289
288290
@@ -308,9 +310,10 @@ exports[`HeaderConsult > matches snapshot 1`] = `
308310
>
309311
<!---->
310312
<span
311-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
313+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
312314
>
313-
Manage Users
315+
Manage Users
316+
<!---->
314317
</span>
315318
316319
@@ -336,9 +339,55 @@ exports[`HeaderConsult > matches snapshot 1`] = `
336339
>
337340
<!---->
338341
<span
339-
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full"
342+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
340343
>
341-
Data Pipeline
344+
Data Pipeline
345+
<!---->
346+
</span>
347+
348+
349+
</a>
350+
351+
<!---->
352+
</div>
353+
<!---->
354+
</li>
355+
<li>
356+
<div
357+
class="hover:text-primary"
358+
>
359+
<!---->
360+
<a
361+
aria-pressed="false"
362+
class="w-full text-sm cursor-pointer rounded-md py-1 px-2 border border-transparent transition-colors duration-300 self-start inline-flex gap-1 items-center hover:bg-gray-100 svelte-1d0mdzt"
363+
data-variant="ghost"
364+
disabled="false"
365+
href="/"
366+
rel="noopener noreferrer"
367+
role="link"
368+
tabindex="0"
369+
target="_blank"
370+
>
371+
<!---->
372+
<span
373+
class="whitespace-nowrap text-center md:text-left py-1 md:py-0 w-full flex items-center gap-1"
374+
>
375+
Langfuse
376+
<svg
377+
class="fill-current"
378+
height="0.8rem"
379+
role="img"
380+
viewBox="0 -960 960 960"
381+
width="0.8rem"
382+
xmlns="http://www.w3.org/2000/svg"
383+
>
384+
<path
385+
d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h280v80H200v560h560v-280h80v280q0 33-23.5 56.5T760-120H200Zm188-212-56-56 372-372H560v-80h280v280h-80v-144L388-332Z"
386+
xmlns="http://www.w3.org/2000/svg"
387+
/>
388+
<!---->
389+
</svg>
390+
<!---->
342391
</span>
343392
344393
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<path
2+
xmlns="http://www.w3.org/2000/svg"
3+
d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h280v80H200v560h560v-280h80v280q0 33-23.5 56.5T760-120H200Zm188-212-56-56 372-372H560v-80h280v280h-80v-144L388-332Z"
4+
/>

0 commit comments

Comments
 (0)