Experience
- {/* Protein.com */}
@@ -268,7 +256,6 @@ export default function ResumeBuilderPage() {
- {/* HostPioneers */}
@@ -286,7 +273,6 @@ export default function ResumeBuilderPage() {
- {/* Red Cross */}
@@ -301,7 +287,6 @@ export default function ResumeBuilderPage() {
- {/* Cayenne */}
@@ -321,137 +306,7 @@ export default function ResumeBuilderPage() {
- {/* JavaScript */}
-
);
}
diff --git a/public/resume-builder.js b/public/resume-builder.js
new file mode 100644
index 0000000..4ffea8f
--- /dev/null
+++ b/public/resume-builder.js
@@ -0,0 +1,139 @@
+// Resume Builder JavaScript
+let resumes = JSON.parse(localStorage.getItem('haitham_resumes_v2') || '{}');
+let currentProfileName = localStorage.getItem('haitham_current_profile_v2') || 'Main Resume';
+
+const getEl = (id) => document.getElementById(id);
+
+const getInitialContent = () => ({
+ name: getEl('userName')?.innerText || '',
+ photo: getEl('userPhoto')?.src || '',
+ phone: getEl('userPhone')?.innerText || '',
+ email: getEl('userEmail')?.innerText || '',
+ linkedin: getEl('userLinkedin')?.innerText || '',
+ location: getEl('userLocation')?.innerText || '',
+ about: getEl('aboutMe')?.innerText || '',
+ education: getEl('educationList')?.innerHTML || '',
+ skills: getEl('skillsList')?.innerHTML || '',
+ language: getEl('languageList')?.innerHTML || '',
+ experience: getEl('experienceContainer')?.innerHTML || ''
+});
+
+const init = () => {
+ if (Object.keys(resumes).length === 0) {
+ resumes['Main Resume'] = getInitialContent();
+ saveToDisk();
+ }
+ updateSelect();
+ loadProfile(currentProfileName);
+};
+
+const handlePhotoUpload = (input) => {
+ const file = input.files[0];
+ if (file) {
+ const reader = new FileReader();
+ reader.onload = (e) => {
+ getEl('userPhoto').src = e.target.result;
+ saveCurrentProfile();
+ };
+ reader.readAsDataURL(file);
+ }
+};
+
+const photoInput = getEl('photoInput');
+const photoFrame = getEl('photoFrame');
+if (photoInput && photoFrame) {
+ photoInput.addEventListener('change', (e) => handlePhotoUpload(e.target));
+ photoFrame.addEventListener('click', () => photoInput.click());
+}
+
+const updateSelect = () => {
+ const select = getEl('resumeSelect');
+ if (!select) return;
+ select.innerHTML = '';
+ Object.keys(resumes).forEach(name => {
+ const opt = document.createElement('option');
+ opt.value = name;
+ opt.textContent = name;
+ if (name === currentProfileName) opt.selected = true;
+ select.appendChild(opt);
+ });
+};
+
+const loadProfile = (name) => {
+ const p = resumes[name] || resumes[Object.keys(resumes)[0]];
+ if (!p) return;
+ currentProfileName = name;
+ localStorage.setItem('haitham_current_profile_v2', name);
+
+ getEl('userName').innerText = p.name || '';
+ getEl('userPhoto').src = p.photo || 'Resume.jpg';
+ getEl('userPhone').innerText = p.phone || '';
+ getEl('userEmail').innerText = p.email || '';
+ getEl('userLinkedin').innerText = p.linkedin || '';
+ getEl('userLocation').innerText = p.location || '';
+ getEl('aboutMe').innerText = p.about || '';
+ getEl('educationList').innerHTML = p.education || '';
+ getEl('skillsList').innerHTML = p.skills || '';
+ getEl('languageList').innerHTML = p.language || '';
+ getEl('experienceContainer').innerHTML = p.experience || '';
+};
+
+const saveCurrentProfile = () => {
+ resumes[currentProfileName] = getInitialContent();
+ saveToDisk();
+ showStatus('Changes Saved');
+};
+
+const createNewProfile = () => {
+ const name = prompt('Name this version (e.g., Geely IT Manager):');
+ if (name && !resumes[name]) {
+ resumes[name] = { ...resumes[currentProfileName] };
+ currentProfileName = name;
+ saveToDisk();
+ updateSelect();
+ loadProfile(name);
+ } else if (resumes[name]) {
+ alert('This name already exists.');
+ }
+};
+
+const deleteProfile = () => {
+ if (Object.keys(resumes).length <= 1) return alert('You need at least one profile.');
+ if (confirm('Delete "' + currentProfileName + '"?')) {
+ delete resumes[currentProfileName];
+ currentProfileName = Object.keys(resumes)[0];
+ saveToDisk();
+ updateSelect();
+ loadProfile(currentProfileName);
+ }
+};
+
+const saveToDisk = () => {
+ localStorage.setItem('haitham_resumes_v2', JSON.stringify(resumes));
+};
+
+const showStatus = (msg) => {
+ const btn = getEl('btnSave');
+ if (!btn) return;
+ const original = btn.textContent;
+ btn.textContent = msg;
+ btn.style.backgroundColor = '#059669';
+ setTimeout(() => {
+ btn.textContent = original;
+ btn.style.backgroundColor = '';
+ }, 2000);
+};
+
+const btnNew = getEl('btnNew');
+const btnSave = getEl('btnSave');
+const btnDelete = getEl('btnDelete');
+const btnPrint = getEl('btnPrint');
+const resumeSelect = getEl('resumeSelect');
+
+if (btnNew) btnNew.addEventListener('click', createNewProfile);
+if (btnSave) btnSave.addEventListener('click', saveCurrentProfile);
+if (btnDelete) btnDelete.addEventListener('click', deleteProfile);
+if (btnPrint) btnPrint.addEventListener('click', () => window.print());
+if (resumeSelect) resumeSelect.addEventListener('change', (e) => loadProfile(e.target.value));
+
+document.addEventListener('DOMContentLoaded', init);