feat(GenerateSponsoringContracts): show download progress
commitc3226c37c9Author: Philipp Dormann <philipp@philippdormann.de> Date: Wed Apr 2 22:03:06 2025 +0200 wip commit210140fd67Author: Philipp Dormann <philipp@philippdormann.de> Date: Wed Apr 2 21:58:07 2025 +0200 wip commit35e58d233eAuthor: Philipp Dormann <philipp@philippdormann.de> Date: Wed Apr 2 21:55:21 2025 +0200 wip commita09bf31e22Author: Philipp Dormann <philipp@philippdormann.de> Date: Wed Apr 2 21:48:51 2025 +0200 wip commit7c31fba83aAuthor: Philipp Dormann <philipp@philippdormann.de> Date: Wed Apr 2 21:48:37 2025 +0200 wip
This commit is contained in:
		
							
								
								
									
										81
									
								
								src/components/pdf_generation/DownloadProgressModal.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/components/pdf_generation/DownloadProgressModal.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| <script> | ||||
| 	import { _ } from "svelte-i18n"; | ||||
| 	import { clickOutside } from "../base/outsideclick"; | ||||
| 	import { onMount } from "svelte"; | ||||
| 	export let download_details = ""; | ||||
| 	export let modal_open; | ||||
| 	onMount(() => { | ||||
| 		document.onkeydown = (e) => { | ||||
| 			e = e || window.event; | ||||
| 			if (e.key === "Escape") { | ||||
| 				modal_open = false; | ||||
| 			} | ||||
| 			if (e.keyCode === 13) { | ||||
| 				if (createbtnenabled === true) { | ||||
| 					createbtnenabled = false; | ||||
| 					submit(); | ||||
| 				} | ||||
| 			} | ||||
| 		}; | ||||
| 	}); | ||||
| </script> | ||||
|  | ||||
| {#if modal_open} | ||||
| 	<div | ||||
| 		class="fixed z-10 inset-0 overflow-y-hidden" | ||||
| 		use:clickOutside | ||||
| 		on:click_outside={() => { | ||||
| 			modal_open = false; | ||||
| 		}} | ||||
| 	> | ||||
| 		<div | ||||
| 			class="flex items-end justify-center h-screen text-center sm:block p-0 lg:p-4" | ||||
| 		> | ||||
| 			<div class="fixed inset-0 transition-opacity" aria-hidden="true"> | ||||
| 				<div | ||||
| 					class="absolute inset-0 bg-gray-500 opacity-75" | ||||
| 					data-id="modal_backdrop" | ||||
| 				/> | ||||
| 			</div> | ||||
| 			<span | ||||
| 				class="hidden sm:inline-block sm:align-middle sm:h-screen" | ||||
| 				aria-hidden="true">​</span | ||||
| 			> | ||||
| 			<div | ||||
| 				class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]" | ||||
| 				role="dialog" | ||||
| 				aria-modal="true" | ||||
| 				aria-labelledby="modal-headline" | ||||
| 			> | ||||
| 				<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl"> | ||||
| 					<div class=""> | ||||
| 						<div | ||||
| 							class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10" | ||||
| 						> | ||||
| 							<svg | ||||
| 								xmlns="http://www.w3.org/2000/svg" | ||||
| 								viewBox="0 0 24 24" | ||||
| 								class="h-6 w-6 text-blue-600" | ||||
| 								fill="currentColor" | ||||
| 								width="24" | ||||
| 								height="24" | ||||
| 								><path fill="none" d="M0 0h24v24H0z" /> | ||||
| 								<path | ||||
| 									d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" | ||||
| 								/></svg | ||||
| 							> | ||||
| 						</div> | ||||
| 						<div class="mt-3 sm:text-left text-base"> | ||||
| 							<h3 class="text-lg leading-6 font-medium text-gray-900"> | ||||
| 								{$_('download_laeuft')} | ||||
| 							</h3> | ||||
| 							<div class="w-full"> | ||||
| 								{download_details} | ||||
| 							</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| {/if} | ||||
| @@ -7,6 +7,7 @@ | ||||
| 	import DocumentServer from "./DocumentServer"; | ||||
| 	import { init } from "@paralleldrive/cuid2"; | ||||
| 	import toast from "svelte-french-toast"; | ||||
| 	import DownloadProgressModal from "./DownloadProgressModal.svelte"; | ||||
| 	const createId = init({ length: 10, fingerprint: "lfk-frontend" }); | ||||
| 	const documentServer = new DocumentServer( | ||||
| 		config.baseurl_documentserver, | ||||
| @@ -17,8 +18,12 @@ | ||||
| 	export let generate_runners = []; | ||||
| 	export let generate_orgs = []; | ||||
| 	export let generate_teams = []; | ||||
| 	// | ||||
| 	export let download_modal_open = false; | ||||
| 	export let download_details = ""; | ||||
|  | ||||
| 	function generateSponsoringContract(locale) { | ||||
| 		download_modal_open = true; | ||||
| 		if (generate_orgs.length > 0) { | ||||
| 			generateOrgContracts(locale); | ||||
| 		} else if (generate_teams.length > 0) { | ||||
| @@ -41,19 +46,24 @@ | ||||
|  | ||||
| 	async function generateTeamContracts(locale) { | ||||
| 		toast.loading($_("generating-pdfs")); | ||||
| 		let totalCount = generate_teams.length; | ||||
| 		let count = 0; | ||||
| 		for (const t of generate_teams) { | ||||
| 			count++; | ||||
| 			download_details = `${t.parentGroup.name} > ${t.name}`; | ||||
| 			const runners = await RunnerTeamService.runnerTeamControllerGetRunners( | ||||
| 				t.id | ||||
| 			); | ||||
| 			documentServer | ||||
| 			await documentServer | ||||
| 				.generateContracts(runners, locale) | ||||
| 				.then((blob) => { | ||||
| 					download( | ||||
| 						blob, | ||||
| 						`${$_("sponsorings")}_${t.name}-${locale}-${createId()}.pdf` | ||||
| 					); | ||||
| 					if (count === totalCount) { | ||||
| 						download_modal_open = false; | ||||
| 					} | ||||
| 				}) | ||||
| 				.catch((err) => {}); | ||||
| 		} | ||||
| @@ -61,15 +71,23 @@ | ||||
|  | ||||
| 	async function generateOrgContracts(locale) { | ||||
| 		toast.loading($_("generating-pdf")); | ||||
| 		let count_orgs = 0; | ||||
| 		let totalCount = 0; | ||||
| 		for (const o of generate_orgs) { | ||||
| 			count_orgs++; | ||||
| 			let count = 0; | ||||
| 			totalCount++; | ||||
| 			for (const t of o.teams) { | ||||
| 				totalCount++; | ||||
| 			} | ||||
| 		} | ||||
| 		console.log({ totalCount }); | ||||
| 		let count = 0; | ||||
| 		for (const o of generate_orgs) { | ||||
| 			count++; | ||||
| 			let runners = | ||||
| 				await RunnerOrganizationService.runnerOrganizationControllerGetRunners( | ||||
| 					o.id, | ||||
| 					true | ||||
| 				); | ||||
| 			download_details = o.name; | ||||
| 			await documentServer | ||||
| 				.generateContracts(runners, locale) | ||||
| 				.then((blob) => { | ||||
| @@ -84,6 +102,7 @@ | ||||
| 				let runners = await RunnerTeamService.runnerTeamControllerGetRunners( | ||||
| 					t.id | ||||
| 				); | ||||
| 				download_details = `${o.name} > ${t.name}`; | ||||
| 				await documentServer | ||||
| 					.generateContracts(runners, locale) | ||||
| 					.then((blob) => { | ||||
| @@ -93,15 +112,19 @@ | ||||
| 								t.name | ||||
| 							}-${locale}-${createId()}.pdf` | ||||
| 						); | ||||
| 						console.log({ count }); | ||||
| 						if (count === totalCount) { | ||||
| 							download_modal_open = false; | ||||
| 						} | ||||
| 					}) | ||||
| 					.catch((err) => {}); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	function generateRunnerContracts(locale) { | ||||
| 	async function generateRunnerContracts(locale) { | ||||
| 		toast.loading($_("generating-pdf")); | ||||
| 		documentServer | ||||
| 		await documentServer | ||||
| 			.generateContracts(generate_runners, locale) | ||||
| 			.then((blob) => { | ||||
| 				let fileName = `${$_("sponsorings")}-${locale}-${createId()}.pdf`; | ||||
| @@ -111,6 +134,7 @@ | ||||
| 					}-${locale}-${createId()}.pdf`; | ||||
| 				} | ||||
| 				download(blob, fileName); | ||||
| 				download_modal_open = false; | ||||
| 			}) | ||||
| 			.catch((err) => { | ||||
| 				console.error(err); | ||||
| @@ -119,6 +143,7 @@ | ||||
| </script> | ||||
|  | ||||
| {#if sponsoring_contracts_show} | ||||
| 	<DownloadProgressModal {download_details} modal_open={download_modal_open} /> | ||||
| 	<button | ||||
| 		on:click={() => { | ||||
| 			generateSponsoringContract("de"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user