36 Commits

Author SHA1 Message Date
Giovanni 2ab10c7803 update fetch url to match new api prefix 2026-06-15 13:17:09 +02:00
Giovanni f5441f038c update fetch url to match new api prefix 2026-06-15 13:14:11 +02:00
Giovanni e92c4227d8 update fetch url to match new api prefix 2026-06-15 13:07:08 +02:00
Giovanni 6640136fd9 update fetch url to match new api prefix 2026-06-15 12:47:46 +02:00
Giovanni 285daa7d54 update fetch url to match new api prefix 2026-06-15 11:54:50 +02:00
Giovanni 56f475839d update fetch url to match new api prefix 2026-06-15 11:47:58 +02:00
Giovanni cc8d3c78cd update fetch url to match new api prefix 2026-06-15 11:46:00 +02:00
Giovanni 1b675fdd3e update fetch url to match new api prefix 2026-06-15 11:41:16 +02:00
Giovanni 37a113fbf6 update fetch url to match new api prefix 2026-06-15 11:39:30 +02:00
Giovanni 5401774e0e update fetch url to match new api prefix 2026-06-15 11:34:46 +02:00
Giovanni b142112ce0 update fetch url to match new api prefix 2026-06-15 11:28:56 +02:00
Giovanni 75d4f5d166 update fetch url to match new api prefix 2026-06-15 11:24:42 +02:00
Giovanni dfbe3123d5 Merge branch 'dev' 2026-04-23 15:53:05 +02:00
Giovanni a875e1dfb7 Merge branch 'refactor/componentsAndPages' into dev 2026-04-23 15:51:22 +02:00
Giovanni-Josserand 41dc079844 Merge pull request 'dev' (#47) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#47
2025-11-06 19:56:58 +00:00
Giovanni-Josserand 6847f7d2c6 Merge pull request 'Remove of the old cv pdf' (#46) from review/cv into dev
Reviewed-on: Giovanni-Josserand/Portfolio#46
2025-11-06 19:56:43 +00:00
Giovanni d415d1ca38 Remove of the old cv pdf 2025-11-06 20:56:13 +01:00
Giovanni-Josserand 65060c6875 Merge pull request 'dev' (#45) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#45
2025-11-06 19:54:39 +00:00
Giovanni-Josserand 34869f0611 Merge pull request 'Update of the cv pdf' (#44) from review/cv into dev
Reviewed-on: Giovanni-Josserand/Portfolio#44
2025-11-06 19:54:24 +00:00
Giovanni a08689086c Update of the cv pdf 2025-11-06 20:54:02 +01:00
Giovanni-Josserand 1127a608bd Merge pull request 'Test to fix Qt image that doesn't display' (#43) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#43
2025-11-06 18:48:13 +00:00
Giovanni 45e78dd11c Test to fix Qt image that doesn't display 2025-11-06 19:47:53 +01:00
Giovanni-Josserand 1a26e0d2d8 Merge pull request 'dev' (#42) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#42
2025-11-06 18:45:06 +00:00
Giovanni 59538b6f17 Fix of overflow issue with because of the padding in .experience-card 2025-11-06 19:32:21 +01:00
Giovanni-Josserand fdc39d3928 Merge pull request 'Add of Qt image, remove of .png images and fix attribute not allowed on svg' (#41) from review/skillsSection into dev
Reviewed-on: Giovanni-Josserand/Portfolio#41
2025-11-06 18:22:21 +00:00
Giovanni 9f7592ace2 Add of Qt image, remove of .png images and fix attribute not allowed on svg 2025-11-06 19:21:25 +01:00
Giovanni-Josserand 743160af3c Merge pull request 'dev' (#40) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#40
2025-09-28 17:24:53 +00:00
Giovanni-Josserand 9b17d23901 Merge pull request 'dev' (#35) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#35
2025-09-28 17:01:02 +00:00
Giovanni-Josserand c41760c313 Merge pull request 'dev' (#29) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#29
2025-09-14 16:20:37 +00:00
Giovanni-Josserand 540bf7efec Merge pull request 'add of the new images' (#27) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#27
2025-09-06 09:55:17 +00:00
Giovanni-Josserand fe2abff5e5 Merge pull request 'dev' (#26) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#26
2025-09-06 09:48:46 +00:00
Giovanni-Josserand 40d8c49908 Merge pull request 'test debug error 404' (#21) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#21
2025-08-31 19:36:31 +00:00
Giovanni-Josserand 3728385ebc Merge pull request 'dev' (#20) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#20
2025-08-31 16:29:50 +00:00
Giovanni-Josserand cc7c586d4a Merge pull request 'repair CV link' (#16) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#16
2025-08-28 19:34:59 +00:00
Giovanni-Josserand 1ec3121bc1 Merge pull request 'update of single project images URL' (#15) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#15
2025-08-28 13:58:25 +00:00
Giovanni-Josserand 9700ae889e Merge pull request 'dev' (#14) from dev into main
Reviewed-on: Giovanni-Josserand/Portfolio#14
2025-08-28 13:35:44 +00:00
23 changed files with 41 additions and 138 deletions
Binary file not shown.
Binary file not shown.
-14
View File
@@ -7,26 +7,12 @@
width="1822" width="1822"
height="2051" height="2051"
viewBox="0 0 1822 2051" viewBox="0 0 1822 2051"
sodipodi:docname="C++.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="1822" width="1822"

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 157 KiB

-14
View File
@@ -7,26 +7,12 @@
width="1200" width="1200"
height="1200" height="1200"
viewBox="0 0 1200 1200" viewBox="0 0 1200 1200"
sodipodi:docname="CSS.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="1200" width="1200"

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

-14
View File
@@ -7,26 +7,12 @@
width="2048" width="2048"
height="2048" height="2048"
viewBox="0 0 2048 2048" viewBox="0 0 2048 2048"
sodipodi:docname="Git.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="2048" width="2048"

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

-14
View File
@@ -7,26 +7,12 @@
width="169" width="169"
height="169" height="169"
viewBox="0 0 169 169" viewBox="0 0 169 169"
sodipodi:docname="image-removebg-preview.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="169" width="169"

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

@@ -7,26 +7,12 @@
width="973" width="973"
height="973" height="973"
viewBox="0 0 973 973" viewBox="0 0 973 973"
sodipodi:docname="JavaScript.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="973" width="973"

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

-14
View File
@@ -7,26 +7,12 @@
width="2560" width="2560"
height="1381" height="1381"
viewBox="0 0 2560 1381" viewBox="0 0 2560 1381"
sodipodi:docname="PHP.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="2560" width="2560"

Before

Width:  |  Height:  |  Size: 247 KiB

After

Width:  |  Height:  |  Size: 246 KiB

-14
View File
@@ -7,26 +7,12 @@
width="110" width="110"
height="110" height="110"
viewBox="0 0 110 110" viewBox="0 0 110 110"
sodipodi:docname="Pyhton.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="110" width="110"

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 109 KiB

-14
View File
@@ -7,26 +7,12 @@
width="301" width="301"
height="299" height="299"
viewBox="0 0 301 299" viewBox="0 0 301 299"
sodipodi:docname="SQL.png"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg">
<defs <defs
id="defs1" /> id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g <g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g1"> id="g1">
<image <image
width="301" width="301"

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 56 KiB

+3 -3
View File
@@ -20,12 +20,12 @@ function Projects() {
useEffect(() => { useEffect(() => {
const fetchProjects = async () => { const fetchProjects = async () => {
try { try {
const response = await fetch('/api/shortProjects/'); const response = await fetch('/api/projects/');
if (!response.ok) { if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`); throw new Error(`Erreur HTTP: ${response.status}`);
} }
const data = await response.json(); const data = await response.json();
setProjects(data.data); setProjects(data);
} catch (err) { } catch (err) {
setError(err.message); setError(err.message);
} }
@@ -88,7 +88,7 @@ function Projects() {
} }
if (filters.technology.length > 0) { if (filters.technology.length > 0) {
const isSkill = filters.technology.every(tech => project.skills.includes(tech)); const isSkill = filters.technology.every(tech => project.skills.some(skill => skill.name === tech));
if(!isSkill){ if(!isSkill){
return false return false
} }
@@ -45,8 +45,8 @@ function SingleProject({ image, title, description, skills, id, school, beginnin
<ul className="single-project-skills-list"> <ul className="single-project-skills-list">
{skills.map((skill) => ( {skills.map((skill) => (
<li key={skill}> <li key={skill.id}>
<SkillCard text={skill} /> <SkillCard text={skill.name} />
</li> </li>
))} ))}
</ul> </ul>
@@ -4,30 +4,22 @@ import React, {useEffect, useState} from "react";
function Experiences() { function Experiences() {
const [experiences, setExperiences] = useState([]); const [experiences, setExperiences] = useState([]);
const [experienceTasks, setExperienceTasks] = useState([]);
const [error, setError] = useState(null); const [error, setError] = useState(null);
useEffect(() => { useEffect(() => {
const fetchExperiencesAndTasks = async () => { const fetchExperiences = async () => {
try { try {
let response = await fetch('/api/experiences/'); let response = await fetch('/api/experiences/');
if (!response.ok) { if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`); throw new Error(`Erreur HTTP: ${response.status}`);
} }
let data = await response.json(); let data = await response.json();
setExperiences(data.data); setExperiences(data);
response = await fetch('/api/experienceTasks/');
if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
data = await response.json();
setExperienceTasks(data.data);
} catch (err) { } catch (err) {
setError(err.message); setError(err.message);
} }
}; };
fetchExperiencesAndTasks(); fetchExperiences();
}, []); }, []);
if (error) { if (error) {
@@ -39,7 +31,7 @@ function Experiences() {
<h1 className="section-title">Experiences</h1> <h1 className="section-title">Experiences</h1>
<div className="experiences-container"> <div className="experiences-container">
{experiences.map((exp) => ( {experiences.map((exp) => (
<SingleExperience experience={exp} tasks={experienceTasks.filter(task => task.experience_id === exp.id)}/> <SingleExperience experience={exp}/>
))} ))}
</div> </div>
</section> </section>
+1 -1
View File
@@ -13,7 +13,7 @@ function Home() {
Passionate about development, I am currently looking Passionate about development, I am currently looking
for an opportunity to put my skills into practice and continue learning. for an opportunity to put my skills into practice and continue learning.
</p> </p>
<a href="/assets/documents/CV.pdf" target="_blank" className="btn">Download my CV</a> <a href="/assets/documents/josserand_giovanni_cv.pdf" target="_blank" className="btn">See my CV</a>
</section> </section>
); );
@@ -1,8 +1,8 @@
.experience-card { .experience-card {
position: relative; position: relative;
width: 100%; width: 90%;
margin-bottom: 3rem; margin-bottom: 3rem;
padding: 1.5rem; padding: 1.5em;
display: flex; display: flex;
gap: 6rem; gap: 6rem;
justify-content: center; justify-content: center;
@@ -1,6 +1,6 @@
import './SingleExperience.css'; import './SingleExperience.css';
function SingleExperience({ experience, tasks }) { function SingleExperience({ experience }) {
return ( return (
<div className="experience-card"> <div className="experience-card">
<div className="experience-card-left"> <div className="experience-card-left">
@@ -11,7 +11,7 @@ function SingleExperience({ experience, tasks }) {
<div className="experience-card-right"> <div className="experience-card-right">
<h3 className="experience-role">{experience.role}</h3> <h3 className="experience-role">{experience.role}</h3>
<ul className="experience-tasks"> <ul className="experience-tasks">
{tasks.map((task) => ( {experience.tasks.map((task) => (
<li>{task.description}</li> <li>{task.description}</li>
))} ))}
</ul> </ul>
+1 -1
View File
@@ -14,7 +14,7 @@ function Skills() {
throw new Error(`Erreur HTTP: ${response.status}`); throw new Error(`Erreur HTTP: ${response.status}`);
} }
const data = await response.json(); const data = await response.json();
setSkills(data.data); setSkills(data);
} catch (err) { } catch (err) {
setError(err.message); setError(err.message);
} }
@@ -11,7 +11,7 @@ function ProjectDetailsPage() {
useEffect(() => { useEffect(() => {
const fetchProject = async () => { const fetchProject = async () => {
try { try {
const response = await fetch(`/api/longProjects/${id}`); const response = await fetch(`/api/projects/${id}`);
if (!response.ok) { if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`); throw new Error(`Erreur HTTP: ${response.status}`);
} }
@@ -73,7 +73,7 @@ function ProjectDetails({project}) {
<ul> <ul>
{project.skills && project.skills.map((skill) => ( {project.skills && project.skills.map((skill) => (
<li> <li>
<SkillCard text={skill} /> <SkillCard text={skill.name} />
</li> </li>
))} ))}
</ul> </ul>
@@ -73,7 +73,7 @@ function Filter({ filters, setFilters }) {
throw new Error(`Erreur HTTP: ${response.status}`); throw new Error(`Erreur HTTP: ${response.status}`);
} }
const data = await response.json(); const data = await response.json();
setSkills(data.data); setSkills(data);
} catch (err) { } catch (err) {
setError(err.message); setError(err.message);
} }