diff --git a/apps/client/package.json b/apps/client/package.json index 3681f00..c5e2e60 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -30,6 +30,7 @@ "flowbite-svelte": "^0.47.1", "flowbite-svelte-icons": "^1.6.2", "globals": "^15.0.0", + "html2pdf.js": "^0.10.2", "mdsvex": "^0.11.2", "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.2.6", @@ -44,6 +45,7 @@ "dependencies": { "@sveltejs/adapter-node": "^5.2.8", "axios": "^1.7.7", + "moment": "^2.30.1", "svelte-qrcode-action": "^1.0.2" } } diff --git a/apps/client/src/routes/(private)/new-vcv/+page.svelte b/apps/client/src/routes/(private)/new-vcv/+page.svelte index 3162a12..18a5e96 100644 --- a/apps/client/src/routes/(private)/new-vcv/+page.svelte +++ b/apps/client/src/routes/(private)/new-vcv/+page.svelte @@ -15,6 +15,7 @@ import Step2 from './steps/step2.svelte'; import Step3 from './steps/step3.svelte'; import Step4 from './steps/step4.svelte'; + import Step5 from './steps/step5.svelte'; import Button from '$lib/components/ui/Button.svelte'; import { goto } from '$app/navigation'; import { apiClient } from '$lib/axios/axios'; @@ -40,6 +41,10 @@ let editing = false; let cvId: string; + let makePdf: HTMLDivElement; + + let handlePdfSave: () => void; + function handleGoBack() { if (step === 0) { goto('/dashboard'); @@ -75,6 +80,19 @@ } onMount(async () => { + const html2pdf = (await import('html2pdf.js')).default; + + let html2PdfWorker = html2pdf(); + handlePdfSave = () => { + let opt = { + margin: [0, 0, 0, 0], + filename: 'YourVCV.pdf', + image: { type: 'png' }, + html2canvas: { scale: 3 }, + jsPDF: { unit: 'mm', format: 'a4', orientation: 'p', putOnlyUsedFonts: true } + }; + html2PdfWorker.from(makePdf).set(opt).save(); + }; const urlParams = new URLSearchParams($page.url.search); const urlContainerId = urlParams.get('id'); if (urlContainerId) { @@ -91,6 +109,7 @@ credentials = data.credentials; experiences = data.experiences; } + }); @@ -105,18 +124,24 @@ {:else if step === 2} {:else if step === 3} - + + {:else if step === 4} + {/if}
-
- Go Back -
-
- -
+ {#if step > 0} +
+ Go Back +
+ {/if} + {#if step < 4} +
+ +
+ {/if}
diff --git a/apps/client/src/routes/(private)/new-vcv/steps/step5.svelte b/apps/client/src/routes/(private)/new-vcv/steps/step5.svelte new file mode 100644 index 0000000..b6a8f24 --- /dev/null +++ b/apps/client/src/routes/(private)/new-vcv/steps/step5.svelte @@ -0,0 +1,13 @@ + + +

Export your VCV

+ +
+
+ +
+
diff --git a/dev.docker-compose.yml b/dev.docker-compose.yml index 618d303..a51388a 100644 --- a/dev.docker-compose.yml +++ b/dev.docker-compose.yml @@ -7,7 +7,7 @@ services: context: . dockerfile: ./docker/dev/Dockerfile.client ports: - - 5173:5173 + - 51733:5173 env_file: - .env develop: @@ -30,7 +30,7 @@ services: context: . dockerfile: ./docker/dev/Dockerfile.server ports: - - 1209:1209 + - 12923:1209 develop: watch: - action: sync @@ -56,7 +56,7 @@ services: volumes: - ~/data/vcv/db:/var/lib/postgresql/data ports: - - 5434:5432 + - 5433:5432 networks: host-bridge: diff --git a/package.json b/package.json index f353e17..93a1d75 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,5 @@ "format": "pnpm -F=* format", "lint": "pnpm -F=* lint", "dev": "docker compose -f ./dev.docker-compose.yml up" - }, - "dependencies": { - "html2pdf": "^0.0.11", - "jspdf": "^2.5.2", - "moment": "^2.30.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e98e670..b2c5667 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,17 +6,7 @@ settings: importers: - .: - dependencies: - html2pdf: - specifier: ^0.0.11 - version: 0.0.11 - jspdf: - specifier: ^2.5.2 - version: 2.5.2 - moment: - specifier: ^2.30.1 - version: 2.30.1 + .: {} apps/client: dependencies: @@ -26,6 +16,9 @@ importers: axios: specifier: ^1.7.7 version: 1.7.7 + moment: + specifier: ^2.30.1 + version: 2.30.1 svelte-qrcode-action: specifier: ^1.0.2 version: 1.0.2(svelte@5.1.3) @@ -84,6 +77,9 @@ importers: globals: specifier: ^15.0.0 version: 15.11.0 + html2pdf.js: + specifier: ^0.10.2 + version: 0.10.2 mdsvex: specifier: ^0.11.2 version: 0.11.2(svelte@5.1.3) @@ -2382,6 +2378,9 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -2848,8 +2847,8 @@ packages: resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} engines: {node: '>=8.0.0'} - html2pdf@0.0.11: - resolution: {integrity: sha512-Kx3I5r7lazHZzZv5lDk59jQoTxqaEGlf2BcGNvzWGPQVu0hE8jYCk4hboksuaCvmMJPa0S0A+156ZbE71Wdo2w==} + html2pdf.js@0.10.2: + resolution: {integrity: sha512-WyHVeMb18Bp7vYTmBv1GVsThH//K7SRfHdSdhHPkl4JvyQarNQXnailkYn0QUbRRmnN5rdbbmSIGEsPZtzPy2Q==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -7216,7 +7215,6 @@ snapshots: css-line-break@2.1.0: dependencies: utrie: 1.0.2 - optional: true cssesc@3.0.0: {} @@ -7479,6 +7477,8 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es6-promise@4.2.8: {} + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -8052,9 +8052,12 @@ snapshots: dependencies: css-line-break: 2.1.0 text-segmentation: 1.0.3 - optional: true - html2pdf@0.0.11: {} + html2pdf.js@0.10.2: + dependencies: + es6-promise: 4.2.8 + html2canvas: 1.4.1 + jspdf: 2.5.2 http-errors@2.0.0: dependencies: @@ -9874,7 +9877,6 @@ snapshots: text-segmentation@1.0.3: dependencies: utrie: 1.0.2 - optional: true text-table@0.2.0: {} @@ -10135,7 +10137,6 @@ snapshots: utrie@1.0.2: dependencies: base64-arraybuffer: 1.0.2 - optional: true uuid@10.0.0: {}