1
1
mirror of https://github.com/theoludwig/theoludwig.git synced 2025-09-11 23:09:22 +02:00

fix: add more details to tasks in Work experiences

This commit is contained in:
2025-09-02 00:25:18 +02:00
parent eeb5e8872f
commit d6f2d9e3a6
5 changed files with 102 additions and 54 deletions

View File

@@ -87,14 +87,23 @@
"title": "Studies" "title": "Studies"
}, },
"interests": { "interests": {
"fusey": "<link>Fusey (fusey.gg)</link>: website I'm developing for the game ARK that tracks the number of players connected to the servers in real time and has over ~5,000 visitors each month, ~100,000 members on Discord, and ~120,000 followers on X/Twitter.", "title": "Interests & hobbies",
"fusey": "<link>Fusey (fusey.gg)</link>: website I'm developing for the game ARK that tracks the number of players connected to the servers in real time and has <strong>over ~5,000 visitors each month, ~100,000 members on Discord, and ~120,000 followers on X/Twitter</strong>.",
"open-source": "Open-Source Enthusiast" "open-source": "Open-Source Enthusiast"
}, },
"work": { "work": {
"ircad": { "ircad": {
"duration": "4 years", "duration": "4 years",
"position": "Full Stack Web Developer Apprentice", "position": "Full Stack Web Developer Apprentice",
"summary": "Development of WebSurg, a virtual university dedicated to medical-surgical training, in React.js/Next.js and API Platform with Symfony." "tasks": {
"WebSurg": "Development of WebSurg, a virtual university dedicated to medical-surgical training, built with React.js/Next.js and API Platform with Symfony.",
"Figma": "Integration of Figma mockups for WebSurg, website dedicated to medical-surgical training.",
"IRCAD-Core": "IRCAD Core, an internal tool for managing medical training sessions and their requirements (anatomicals models, medications, staff training, etc.).",
"feature-logs": "History and traceability of data modifications (what? who? when?) in IRCAD Core.",
"feature-permissions": "Advanced permissions system and OAuth2 authentication, with read, write, and delete access restricted for specific users of the IRCAD Core application.",
"feature-search": "Search engine with filters, sorting, and customizable display for each user of IRCAD Core.",
"feature-architecture": "IRCAD Core project architecture in TypeScript Monorepo with Turborepo, and automatic deployment (CI/CD) with Docker Compose, self-hosted internally."
}
}, },
"numerize": { "numerize": {
"duration": "3 months", "duration": "3 months",

View File

@@ -87,14 +87,23 @@
"title": "Études" "title": "Études"
}, },
"interests": { "interests": {
"fusey": "<link>Fusey (fusey.gg)</link> : site web que je développe pour le jeu ARK qui permet de suivre en temps réel le nombre de joueurs connectés sur les serveurs et a plus de ~5 000 visiteurs chaque mois, ~100 000 membres sur Discord et ~120 000 followers sur X/Twitter.", "title": "Intérêts & loisirs",
"fusey": "<link>Fusey (fusey.gg)</link> : site web que je développe pour le jeu ARK qui permet de suivre en temps réel le nombre de joueurs connectés sur les serveurs et a plus de <strong>~5 000 visiteurs chaque mois, ~100 000 membres sur Discord et ~120 000 followers sur X/Twitter</strong>.",
"open-source": "Enthousiaste de l'Open-Source" "open-source": "Enthousiaste de l'Open-Source"
}, },
"work": { "work": {
"ircad": { "ircad": {
"duration": "4 ans", "duration": "4 ans",
"position": "Apprenti Développeur Web Full Stack", "position": "Apprenti Développeur Web Full Stack",
"summary": "Développement de WebSurg, une université virtuelle consacrée à la formation médico-chirurgicale, en React.js/Next.js et API Platform avec Symfony." "tasks": {
"WebSurg": "Développement de WebSurg, une université virtuelle consacrée à la formation médico-chirurgicale, en React.js/Next.js et API Platform avec Symfony.",
"Figma": "Intégration des maquettes Figma pour WebSurg, site web consacrée à la formation médico-chirurgicale.",
"IRCAD-Core": "IRCAD Core, outil interne de gestion des formations médicales et leurs besoins (modèles anatomiques, médicaments, formations du personnel, etc.).",
"feature-logs": "Historique et traçabilité des modifications des données (quoi? qui? quand?) dans IRCAD Core.",
"feature-permissions": "Système de permissions avancé et authentification OAuth2, avec accès en lecture, écriture et suppression restreint pour des utilisateurs spécifiques de l'application IRCAD Core.",
"feature-search": "Moteur de recherche avec filtres, tris et ordre d'affichage personnalisable pour IRCAD Core.",
"feature-architecture": "Architecture du projet IRCAD Core en Monorepo TypeScript avec Turborepo, et déploiement automatique (CI/CD) avec Docker Compose, auto-hébergé en interne."
}
}, },
"numerize": { "numerize": {
"duration": "3 mois", "duration": "3 mois",

View File

@@ -41,9 +41,9 @@ export const CurriculumVitaeEducation: React.FC<
t("curriculum-vitae.education.iut.years.2022-2023.courses.tests"), t("curriculum-vitae.education.iut.years.2022-2023.courses.tests"),
t("curriculum-vitae.education.iut.years.2022-2023.courses.clean-code"), t("curriculum-vitae.education.iut.years.2022-2023.courses.clean-code"),
t("curriculum-vitae.education.iut.years.2022-2023.courses.systems-c"), t("curriculum-vitae.education.iut.years.2022-2023.courses.systems-c"),
t( // t(
"curriculum-vitae.education.iut.years.2022-2023.courses.sql-security", // "curriculum-vitae.education.iut.years.2022-2023.courses.sql-security",
), // ),
], ],
}, },
{ {
@@ -54,19 +54,19 @@ export const CurriculumVitaeEducation: React.FC<
courses: [ courses: [
t("curriculum-vitae.education.iut.years.2021-2022.courses.java"), t("curriculum-vitae.education.iut.years.2021-2022.courses.java"),
t("curriculum-vitae.education.iut.years.2021-2022.courses.systems-c"), t("curriculum-vitae.education.iut.years.2021-2022.courses.systems-c"),
t( // t(
"curriculum-vitae.education.iut.years.2021-2022.courses.windows-forms", // "curriculum-vitae.education.iut.years.2021-2022.courses.windows-forms",
), // ),
t("curriculum-vitae.education.iut.years.2021-2022.courses.sql"), t("curriculum-vitae.education.iut.years.2021-2022.courses.sql"),
], ],
}, },
{ // {
years: t("curriculum-vitae.education.lycee.years.2019-2021.title"), // years: t("curriculum-vitae.education.lycee.years.2019-2021.title"),
studyType: t("curriculum-vitae.education.lycee.study-type"), // studyType: t("curriculum-vitae.education.lycee.study-type"),
institution: t("curriculum-vitae.education.lycee.institution"), // institution: t("curriculum-vitae.education.lycee.institution"),
score: t("curriculum-vitae.education.lycee.score"), // score: t("curriculum-vitae.education.lycee.score"),
courses: [], // courses: [],
}, // },
] ]
return ( return (
@@ -79,35 +79,33 @@ export const CurriculumVitaeEducation: React.FC<
{educations.map((education) => { {educations.map((education) => {
return ( return (
<li key={education.years} className="card card-nested"> <li key={education.years} className="card card-nested">
<div className="content"> <p className="relative m-0">
<p className="relative m-0"> <strong>{education.studyType}</strong>
<strong>{education.studyType}</strong> </p>
</p>
<p className="relative m-0"> <p className="relative m-0">
<strong>{education.score}</strong> <strong>{education.score}</strong>
</p> </p>
<p className="text-muted m-0">{education.institution}</p> <p className="text-muted m-0">{education.institution}</p>
<p className="text-muted m-0"> <p className="text-muted m-0">
<small>{education.years}</small> <small>{education.years}</small>
</p> </p>
{education.courses.length > 0 ? ( {education.courses.length > 0 ? (
<ul <ul
style={{ style={{
paddingInlineStart: 20, paddingInlineStart: 20,
}} }}
> >
{education.courses.map((course) => { {education.courses.map((course) => {
return <li key={course}>{course}</li> return <li key={course}>{course}</li>
})} })}
</ul> </ul>
) : ( ) : (
<></> <></>
)} )}
</div>
</li> </li>
) )
})} })}

View File

@@ -10,31 +10,34 @@ export const CurriculumVitaeInterests: React.FC<
const t = useTranslations() const t = useTranslations()
const interests = [ const interests = [
t("curriculum-vitae.interests.open-source"), <strong key="open-source">
{t("curriculum-vitae.interests.open-source")}
</strong>,
t.rich("curriculum-vitae.interests.fusey", { t.rich("curriculum-vitae.interests.fusey", {
link: (children) => { link: (children) => {
return ( return (
<a href="https://fusey.gg" target="_blank"> <a href="https://fusey.gg" target="_blank" className="font-semibold">
{children} {children}
</a> </a>
) )
}, },
strong: (children) => {
return <strong>{children}</strong>
},
}), }),
] ]
return ( return (
<CurriculumVitaeSection <CurriculumVitaeSection
id="interests" id="interests"
title={t("home.interests.title")} title={t("curriculum-vitae.interests.title")}
icon={<FaHeart size={24} />} icon={<FaHeart size={24} />}
> >
<ul className="list-unstyled m-0"> <ul className="list-unstyled m-0">
{interests.map((interest, index) => { {interests.map((interest, index) => {
return ( return (
<li key={index} className="card card-nested"> <li key={index} className="card card-nested max-w-2xl">
<p> <p>{interest}</p>
<strong>{interest}</strong>
</p>
</li> </li>
) )
})} })}

View File

@@ -9,13 +9,21 @@ export const CurriculumVitaeWork: React.FC<CurriculumVitaeWorkProps> = () => {
const workExperiences = [ const workExperiences = [
{ {
summary: t("curriculum-vitae.work.ircad.summary"),
website: "https://ircad.fr/", website: "https://ircad.fr/",
name: "IRCAD", name: "IRCAD",
location: "1 Place de l'Hôpital, FR-67000 Strasbourg", location: "1 Place de l'Hôpital, FR-67000 Strasbourg",
position: t("curriculum-vitae.work.ircad.position"), position: t("curriculum-vitae.work.ircad.position"),
dates: "28/08/2023 - 31/08/2027", dates: "28/08/2023 - 31/08/2027",
duration: t("curriculum-vitae.work.ircad.duration"), duration: t("curriculum-vitae.work.ircad.duration"),
tasks: [
// t("curriculum-vitae.work.ircad.tasks.WebSurg"),
t("curriculum-vitae.work.ircad.tasks.Figma"),
t("curriculum-vitae.work.ircad.tasks.IRCAD-Core"),
t("curriculum-vitae.work.ircad.tasks.feature-logs"),
t("curriculum-vitae.work.ircad.tasks.feature-permissions"),
t("curriculum-vitae.work.ircad.tasks.feature-search"),
t("curriculum-vitae.work.ircad.tasks.feature-architecture"),
],
}, },
{ {
summary: t("curriculum-vitae.work.numerize.summary"), summary: t("curriculum-vitae.work.numerize.summary"),
@@ -25,6 +33,7 @@ export const CurriculumVitaeWork: React.FC<CurriculumVitaeWorkProps> = () => {
position: t("curriculum-vitae.work.numerize.position"), position: t("curriculum-vitae.work.numerize.position"),
dates: "11/04/2023 - 26/07/2023", dates: "11/04/2023 - 26/07/2023",
duration: t("curriculum-vitae.work.numerize.duration"), duration: t("curriculum-vitae.work.numerize.duration"),
tasks: [],
}, },
] ]
@@ -50,16 +59,36 @@ export const CurriculumVitaeWork: React.FC<CurriculumVitaeWorkProps> = () => {
<strong>{workExperience.position}</strong> <strong>{workExperience.position}</strong>
</p> </p>
<p className="text-muted"> <p className="text-muted m-0">
<small> <small>
<span className="space-right"> <span className="space-right">
{workExperience.dates} ({workExperience.duration}) {workExperience.dates} ({workExperience.duration})
</span> </span>
</small> </small>
</p> </p>
<div className="mt-2">
<p>{workExperience.summary}</p> {workExperience.tasks.length > 0 ? (
</div> <ul
style={{
paddingInlineStart: 20,
}}
className="space-y-1"
>
{workExperience.tasks.map((task) => {
return <li key={task}>{task}</li>
})}
</ul>
) : (
<></>
)}
{workExperience.summary != null ? (
<div className="mt-2">
<p>{workExperience.summary}</p>
</div>
) : (
<></>
)}
</li> </li>
) )
})} })}