diff --git a/vue/src/views/CV/JobApplications.vue b/vue/src/views/CV/JobApplications.vue index e3fa443..59b270c 100644 --- a/vue/src/views/CV/JobApplications.vue +++ b/vue/src/views/CV/JobApplications.vue @@ -113,6 +113,29 @@ async function deleteApplication(id) { } } +function exportCsv() { + const headers = ["Job Title", "Company", "Status", "Location", "URL", "Applied", "Notes", "Created"]; + const rows = applications.value.map((a) => [ + a.jobTitle, + a.company, + a.status, + a.location ?? "", + a.url ?? "", + a.appliedAt ? a.appliedAt.substring(0, 10) : "", + a.notes ?? "", + a.createdAt ? a.createdAt.substring(0, 10) : "", + ]); + const escape = (v) => `"${String(v).replace(/"/g, '""')}"`; + const csv = [headers, ...rows].map((r) => r.map(escape).join(",")).join("\n"); + const blob = new Blob([csv], { type: "text/csv" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = "job_applications.csv"; + a.click(); + URL.revokeObjectURL(url); +} + function statusClass(status) { const map = { Applied: "status-applied", @@ -136,7 +159,10 @@ onMounted(() => {