From 468543c9cc1c49cfe1d46956fc608f96c9aefa30 Mon Sep 17 00:00:00 2001 From: Daniel Ntege Date: Mon, 2 Mar 2026 15:25:32 +0300 Subject: [PATCH 1/3] actions: pr link to unassigned issue Signed-off-by: Daniel Ntege --- src/app/[locale]/about-hendrik/page.tsx | 10 ++ src/app/[locale]/employees/[slug]/page.tsx | 127 +++++++++++++++++++++ src/components/about/TeamCard.tsx | 2 +- src/data/de/team.json | 2 +- src/data/en/team.json | 2 +- 5 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 src/app/[locale]/about-hendrik/page.tsx create mode 100644 src/app/[locale]/employees/[slug]/page.tsx diff --git a/src/app/[locale]/about-hendrik/page.tsx b/src/app/[locale]/about-hendrik/page.tsx new file mode 100644 index 00000000..3b71a777 --- /dev/null +++ b/src/app/[locale]/about-hendrik/page.tsx @@ -0,0 +1,10 @@ +import { redirect } from 'next/navigation' + +export default async function AboutHendrikPage({ + params, +}: { + params: Promise<{ locale: string }> +}) { + const { locale } = await params + redirect(`/${locale}/employees/hendrik`) +} diff --git a/src/app/[locale]/employees/[slug]/page.tsx b/src/app/[locale]/employees/[slug]/page.tsx new file mode 100644 index 00000000..ae54d5a4 --- /dev/null +++ b/src/app/[locale]/employees/[slug]/page.tsx @@ -0,0 +1,127 @@ +import Image from 'next/image' +import { notFound } from 'next/navigation' +import type { Metadata } from 'next' +import teamDataEn from '@/data/en/team.json' +import teamDataDe from '@/data/de/team.json' + +interface TeamMember { + id: string + firstName: string + lastName: string + bio: string + picture: string + role: string + socials?: Array<{ name: string; link: string; icon: string }> +} + +function getMember(locale: string, slug: string): TeamMember | undefined { + const teamData = locale === 'de' ? teamDataDe : teamDataEn + return teamData.find((member) => member.id === slug) +} + +export async function generateStaticParams() { + const slugs = Array.from(new Set([...teamDataEn, ...teamDataDe].map((member) => member.id))) + + return ['en', 'de'].flatMap((locale) => + slugs.map((slug) => ({ + locale, + slug, + })) + ) +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ locale: string; slug: string }> +}): Promise { + const { locale, slug } = await params + const member = getMember(locale, slug) ?? getMember('en', slug) + + if (!member) { + return { + title: 'Employee Not Found - Open Elements', + } + } + + return { + title: `${member.firstName} ${member.lastName} - Open Elements`, + description: member.bio, + openGraph: { + title: `${member.firstName} ${member.lastName} - Open Elements`, + description: member.bio, + images: [ + { + url: member.picture, + width: 800, + height: 800, + alt: `${member.firstName} ${member.lastName}`, + }, + ], + }, + } +} + +export default async function EmployeePage({ + params, +}: { + params: Promise<{ locale: string; slug: string }> +}) { + const { locale, slug } = await params + const member = getMember(locale, slug) ?? getMember('en', slug) + + if (!member) { + notFound() + } + + return ( +
+
+
+
+ + {`${member.firstName} +
+ +
+

+ {member.firstName} {member.lastName} +

+

{member.role}

+ +

{member.bio}

+ + {member.socials && member.socials.length > 0 ? ( +
+ {member.socials.map((social) => ( + + {social.name} + + ))} +
+ ) : null} +
+
+
+
+ ) +} diff --git a/src/components/about/TeamCard.tsx b/src/components/about/TeamCard.tsx index 816568f1..adc8c38e 100644 --- a/src/components/about/TeamCard.tsx +++ b/src/components/about/TeamCard.tsx @@ -1,5 +1,5 @@ import Image from 'next/image' -import Link from 'next/link' +import { Link } from '@/i18n/routing' interface TeamMember { id: string diff --git a/src/data/de/team.json b/src/data/de/team.json index 3f1c1429..b13f4328 100644 --- a/src/data/de/team.json +++ b/src/data/de/team.json @@ -3,7 +3,7 @@ "id": "hendrik", "firstName": "Hendrik", "lastName": "Ebbers", - "link": "/about-hendrik/", + "link": "/employees/hendrik", "bio": "Hendrik ist der Gründer von Open Elements. Als Java Champion und Mitglied verschiedener JSR-Expertengruppen und JavaOne-Stars verkörpert er die Leidenschaft und das Know-how, das unsere Firma ausmacht. Er engagiert sich aktiv in der Eclipse JakartaEE und Eclipse Adoptium Working Groups und ist zudem Mitglied im Board of Directors der Eclipse Foundation.", "picture": "/team/hendrik.jpg", "role": "Founder Open Elements", diff --git a/src/data/en/team.json b/src/data/en/team.json index 4fc123f4..7f4ddbcd 100644 --- a/src/data/en/team.json +++ b/src/data/en/team.json @@ -3,7 +3,7 @@ "id": "hendrik", "firstName": "Hendrik", "lastName": "Ebbers", - "link": "/about-hendrik/", + "link": "/employees/hendrik", "bio": "Hendrik Ebbers is the founder of Open Elements. He is a Java champion, a member of JSR expert groups and a JavaOne rockstar. Hendrik is a member of the Eclipse JakartaEE working group (WG) and the Eclipse Adoptium WG. In addition, Hendrik Ebbers is a member of the Board of Directors of the Eclipse Foundation.", "picture": "/team/hendrik.jpg", "role": "Founder Open Elements", From 3f7ae41e999b865c831ac8723e4becfd88b26918 Mon Sep 17 00:00:00 2001 From: Daniel Ntege Date: Mon, 2 Mar 2026 15:44:00 +0300 Subject: [PATCH 2/3] style: Update EmployeePage layout and improve social links presentation Signed-off-by: Daniel Ntege --- src/app/[locale]/employees/[slug]/page.tsx | 65 ++++++++++++++-------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/src/app/[locale]/employees/[slug]/page.tsx b/src/app/[locale]/employees/[slug]/page.tsx index ae54d5a4..6eb05960 100644 --- a/src/app/[locale]/employees/[slug]/page.tsx +++ b/src/app/[locale]/employees/[slug]/page.tsx @@ -75,46 +75,63 @@ export default async function EmployeePage({ } return ( -
-
-
-
+
+ Circles + Arrow + +
+
+

+ {member.firstName} {member.lastName} +

+

{member.role}

+
+ +
+
employee
-
-

- {member.firstName} {member.lastName} -

-

{member.role}

- -

{member.bio}

- +
+
{member.bio}
{member.socials && member.socials.length > 0 ? ( -
+
{member.socials.map((social) => ( - {social.name} + ))}
From b63f4bcf50788c659af1549fe44c7b31b2e857d0 Mon Sep 17 00:00:00 2001 From: Daniel Ntege Date: Mon, 2 Mar 2026 15:52:19 +0300 Subject: [PATCH 3/3] profile pages Signed-off-by: Daniel Ntege --- src/app/[locale]/employees/[slug]/page.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/[locale]/employees/[slug]/page.tsx b/src/app/[locale]/employees/[slug]/page.tsx index 6eb05960..5ebd4ede 100644 --- a/src/app/[locale]/employees/[slug]/page.tsx +++ b/src/app/[locale]/employees/[slug]/page.tsx @@ -117,7 +117,6 @@ export default async function EmployeePage({ priority />
-
{member.bio}
{member.socials && member.socials.length > 0 ? (