feat(pdfs): Experimental generation of large runner card files
This commit is contained in:
		| @@ -1,197 +1,256 @@ | ||||
| <script> | ||||
| 	import { _ } from "svelte-i18n"; | ||||
| 	import { | ||||
| 		RunnerCardService, | ||||
| 		RunnerOrganizationService, | ||||
| 		RunnerTeamService, | ||||
| 	} from "@odit/lfk-client-js"; | ||||
| 	import toast from "svelte-french-toast"; | ||||
| 	import DocumentServer from "./DocumentServer.ts"; | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   import { | ||||
|     RunnerCardService, | ||||
|     RunnerOrganizationService, | ||||
|     RunnerTeamService, | ||||
|   } from "@odit/lfk-client-js"; | ||||
|   import toast from "svelte-french-toast"; | ||||
|   import DocumentServer from "./DocumentServer.ts"; | ||||
|  | ||||
| 	import { init } from "@paralleldrive/cuid2"; | ||||
| 	const createId = init({ length: 10, fingerprint: "lfk-frontend" }); | ||||
| 	const documentServer = new DocumentServer( | ||||
| 		config.baseurl_documentserver, | ||||
| 		config.documentserver_key | ||||
| 	); | ||||
|   import { init } from "@paralleldrive/cuid2"; | ||||
|   const createId = init({ length: 10, fingerprint: "lfk-frontend" }); | ||||
|   const documentServer = new DocumentServer( | ||||
|     config.baseurl_documentserver, | ||||
|     config.documentserver_key | ||||
|   ); | ||||
|  | ||||
| 	export let cards_show = false; | ||||
| 	export let generate_cards = []; | ||||
| 	export let generate_runners = []; | ||||
| 	export let generate_orgs = []; | ||||
| 	export let generate_teams = []; | ||||
|   export let cards_show = false; | ||||
|   export let generate_cards = []; | ||||
|   export let generate_runners = []; | ||||
|   export let generate_orgs = []; | ||||
|   export let generate_teams = []; | ||||
|  | ||||
| 	function download(blob, fileName) { | ||||
| 		const url = window.URL.createObjectURL(blob); | ||||
| 		let a = document.createElement("a"); | ||||
| 		a.href = url; | ||||
| 		a.download = fileName; | ||||
| 		document.body.appendChild(a); | ||||
| 		a.click(); | ||||
| 		a.remove(); | ||||
| 		toast.dismiss(); | ||||
| 		toast.success($_("pdf-successfully-generated")); | ||||
| 	} | ||||
|   function download(blob, fileName) { | ||||
|     const url = window.URL.createObjectURL(blob); | ||||
|     let a = document.createElement("a"); | ||||
|     a.href = url; | ||||
|     a.download = fileName; | ||||
|     document.body.appendChild(a); | ||||
|     a.click(); | ||||
|     a.remove(); | ||||
|     toast.dismiss(); | ||||
|     toast.success($_("pdf-successfully-generated")); | ||||
|   } | ||||
|  | ||||
| 	function generateRunnerCards(locale) { | ||||
| 		if (generate_orgs.length > 0) { | ||||
| 			generateOrgCards(locale); | ||||
| 		} else if (generate_teams.length > 0) { | ||||
| 			generateTeamCards(locale); | ||||
| 		} else if (generate_runners.length > 0) { | ||||
| 			generateRunnersCards(locale); | ||||
|   function generateRunnerCards(locale, useCombined = false) { | ||||
|     if (generate_orgs.length > 0) { | ||||
| 		if(useCombined){ | ||||
| 			generateOrgCardsCombined(locale); | ||||
| 		} else { | ||||
| 			generateCards(locale); | ||||
| 			generateOrgCards(locale) | ||||
| 		} | ||||
| 	} | ||||
|     } else if (generate_teams.length > 0) { | ||||
|       generateTeamCards(locale); | ||||
|     } else if (generate_runners.length > 0) { | ||||
|       generateRunnersCards(locale); | ||||
|     } else { | ||||
|       generateCards(locale); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| 	function generateCards(locale) { | ||||
| 		toast.loading($_("generating-pdf")); | ||||
| 		documentServer | ||||
| 			.generateCards(generate_cards, locale) | ||||
| 			.then((blob) => { | ||||
| 				download(blob, `${$_("runnercards")}-${locale}-${createId()}.pdf`); | ||||
| 			}) | ||||
| 			.catch((err) => { | ||||
| 				console.error(err); | ||||
| 			}); | ||||
| 	} | ||||
|   function generateCards(locale) { | ||||
|     toast.loading($_("generating-pdf")); | ||||
|     documentServer | ||||
|       .generateCards(generate_cards, locale) | ||||
|       .then((blob) => { | ||||
|         download(blob, `${$_("runnercards")}-${locale}-${createId()}.pdf`); | ||||
|       }) | ||||
|       .catch((err) => { | ||||
|         console.error(err); | ||||
|       }); | ||||
|   } | ||||
|  | ||||
| 	async function generateRunnersCards(locale) { | ||||
| 		toast.loading($_("generating-pdf")); | ||||
| 		const current_cards = await RunnerCardService.runnerCardControllerGetAll(); | ||||
| 		let cards = []; | ||||
| 		for (let runner of generate_runners) { | ||||
| 			let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
| 			if (!card) { | ||||
| 				card = await RunnerCardService.runnerCardControllerPost({ | ||||
| 					runner: runner.id, | ||||
| 				}); | ||||
| 			} | ||||
| 			cards.push(card); | ||||
| 		} | ||||
| 		documentServer | ||||
| 			.generateCards(cards, locale) | ||||
| 			.then((blob) => { | ||||
| 				let fileName = `${$_("runnercards")}-${locale}-${createId()}.pdf`; | ||||
| 				if (generate_runners.length == 1) { | ||||
| 					fileName = `${$_("runnercards")}_${generate_runners[0].firstname}_${ | ||||
| 						generate_runners[0].lastname | ||||
| 					}-${locale}-${createId()}.pdf`; | ||||
| 				} | ||||
| 				download(blob, fileName); | ||||
| 			}) | ||||
| 			.catch((err) => {}); | ||||
| 	} | ||||
|   async function generateRunnersCards(locale) { | ||||
|     toast.loading($_("generating-pdf")); | ||||
|     const current_cards = await RunnerCardService.runnerCardControllerGetAll(); | ||||
|     let cards = []; | ||||
|     for (let runner of generate_runners) { | ||||
|       let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
|       if (!card) { | ||||
|         card = await RunnerCardService.runnerCardControllerPost({ | ||||
|           runner: runner.id, | ||||
|         }); | ||||
|       } | ||||
|       cards.push(card); | ||||
|     } | ||||
|     documentServer | ||||
|       .generateCards(cards, locale) | ||||
|       .then((blob) => { | ||||
|         let fileName = `${$_("runnercards")}-${locale}-${createId()}.pdf`; | ||||
|         if (generate_runners.length == 1) { | ||||
|           fileName = `${$_("runnercards")}_${generate_runners[0].firstname}_${ | ||||
|             generate_runners[0].lastname | ||||
|           }-${locale}-${createId()}.pdf`; | ||||
|         } | ||||
|         download(blob, fileName); | ||||
|       }) | ||||
|       .catch((err) => {}); | ||||
|   } | ||||
|  | ||||
| 	async function generateTeamCards(locale) { | ||||
| 		toast.loading($_("generating-pdfs")); | ||||
| 		let count = 0; | ||||
| 		const current_cards = await RunnerCardService.runnerCardControllerGetAll(); | ||||
| 		for (const t of generate_teams) { | ||||
| 			const runners = await RunnerTeamService.runnerTeamControllerGetRunners( | ||||
| 				t.id | ||||
| 			); | ||||
| 			let cards = []; | ||||
| 			for (let runner of runners) { | ||||
| 				let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
| 				if (!card) { | ||||
| 					card = await RunnerCardService.runnerCardControllerPost({ | ||||
| 						runner: runner.id, | ||||
| 					}); | ||||
| 				} | ||||
| 				cards.push(card); | ||||
| 			} | ||||
| 			documentServer | ||||
| 				.generateCards(cards, locale) | ||||
| 				.then((blob) => { | ||||
| 					download( | ||||
| 						blob, | ||||
| 						`${$_("runnercards")}_${t.name}-${locale}-${createId()}.pdf` | ||||
| 					); | ||||
| 				}) | ||||
| 				.catch((err) => {}); | ||||
| 		} | ||||
| 	} | ||||
|   async function generateTeamCards(locale) { | ||||
|     toast.loading($_("generating-pdfs")); | ||||
|     let count = 0; | ||||
|     const current_cards = await RunnerCardService.runnerCardControllerGetAll(); | ||||
|     for (const t of generate_teams) { | ||||
|       const runners = await RunnerTeamService.runnerTeamControllerGetRunners( | ||||
|         t.id | ||||
|       ); | ||||
|       let cards = []; | ||||
|       for (let runner of runners) { | ||||
|         let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
|         if (!card) { | ||||
|           card = await RunnerCardService.runnerCardControllerPost({ | ||||
|             runner: runner.id, | ||||
|           }); | ||||
|         } | ||||
|         cards.push(card); | ||||
|       } | ||||
|       documentServer | ||||
|         .generateCards(cards, locale) | ||||
|         .then((blob) => { | ||||
|           download( | ||||
|             blob, | ||||
|             `${$_("runnercards")}_${t.name}-${locale}-${createId()}.pdf` | ||||
|           ); | ||||
|         }) | ||||
|         .catch((err) => {}); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| 	async function generateOrgCards(locale) { | ||||
| 		toast.loading($_("generating-pdfs")); | ||||
| 		const current_cards = await RunnerCardService.runnerCardControllerGetAll(); | ||||
| 		let count = 0; | ||||
| 		let count_orgs = 0; | ||||
| 		for (const o of generate_orgs) { | ||||
| 			count_orgs++; | ||||
| 			let count = 0; | ||||
| 			let runners = | ||||
| 				await RunnerOrganizationService.runnerOrganizationControllerGetRunners( | ||||
| 					o.id, | ||||
| 					true | ||||
| 				); | ||||
| 			let cards = []; | ||||
| 			for (let runner of runners) { | ||||
| 				let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
| 				if (!card) { | ||||
| 					card = await RunnerCardService.runnerCardControllerPost({ | ||||
| 						runner: runner.id, | ||||
| 					}); | ||||
| 				} | ||||
| 				cards.push(card); | ||||
| 			} | ||||
| 			await documentServer | ||||
| 				.generateCards(cards, locale) | ||||
| 				.then((blob) => { | ||||
| 					download( | ||||
| 						blob, | ||||
| 						`${$_("runnercards")}_${o.name}_direct-${locale}-${createId()}.pdf` | ||||
| 					); | ||||
| 				}) | ||||
| 				.catch((err) => {}); | ||||
| 			for (const t of o.teams) { | ||||
| 				count++; | ||||
| 				let runners = await RunnerTeamService.runnerTeamControllerGetRunners( | ||||
| 					t.id | ||||
| 				); | ||||
| 				let cards = []; | ||||
| 				for (let runner of runners) { | ||||
| 					let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
| 					if (!card) { | ||||
| 						card = await RunnerCardService.runnerCardControllerPost({ | ||||
| 							runner: runner.id, | ||||
| 						}); | ||||
| 					} | ||||
| 					cards.push(card); | ||||
| 				} | ||||
| 				await documentServer | ||||
| 					.generateCards(cards, locale) | ||||
| 					.then((blob) => { | ||||
| 						download( | ||||
| 							blob, | ||||
| 							`${$_("runnercards")}_${o.name}_${ | ||||
| 								t.name | ||||
| 							}-${locale}-${createId()}.pdf` | ||||
| 						); | ||||
| 					}) | ||||
| 					.catch((err) => {}); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|   async function generateOrgCards(locale) { | ||||
|     toast.loading($_("generating-pdfs")); | ||||
|     const current_cards = await RunnerCardService.runnerCardControllerGetAll(); | ||||
|     let count = 0; | ||||
|     let count_orgs = 0; | ||||
|     for (const o of generate_orgs) { | ||||
|       count_orgs++; | ||||
|       let count = 0; | ||||
|       let runners = | ||||
|         await RunnerOrganizationService.runnerOrganizationControllerGetRunners( | ||||
|           o.id, | ||||
|           true | ||||
|         ); | ||||
|       let cards = []; | ||||
|       for (let runner of runners) { | ||||
|         let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
|         if (!card) { | ||||
|           card = await RunnerCardService.runnerCardControllerPost({ | ||||
|             runner: runner.id, | ||||
|           }); | ||||
|         } | ||||
|         cards.push(card); | ||||
|       } | ||||
|       await documentServer | ||||
|         .generateCards(cards, locale) | ||||
|         .then((blob) => { | ||||
|           download( | ||||
|             blob, | ||||
|             `${$_("runnercards")}_${o.name}_direct-${locale}-${createId()}.pdf` | ||||
|           ); | ||||
|         }) | ||||
|         .catch((err) => {}); | ||||
|       for (const t of o.teams) { | ||||
|         count++; | ||||
|         let runners = await RunnerTeamService.runnerTeamControllerGetRunners( | ||||
|           t.id | ||||
|         ); | ||||
|         let cards = []; | ||||
|         for (let runner of runners) { | ||||
|           let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
|           if (!card) { | ||||
|             card = await RunnerCardService.runnerCardControllerPost({ | ||||
|               runner: runner.id, | ||||
|             }); | ||||
|           } | ||||
|           cards.push(card); | ||||
|         } | ||||
|         await documentServer | ||||
|           .generateCards(cards, locale) | ||||
|           .then((blob) => { | ||||
|             download( | ||||
|               blob, | ||||
|               `${$_("runnercards")}_${o.name}_${ | ||||
|                 t.name | ||||
|               }-${locale}-${createId()}.pdf` | ||||
|             ); | ||||
|           }) | ||||
|           .catch((err) => {}); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   async function generateOrgCardsCombined(locale) { | ||||
|     toast.loading($_("generating-pdfs")); | ||||
|     const current_cards = await RunnerCardService.runnerCardControllerGetAll(); | ||||
|     let count = 0; | ||||
|     let count_orgs = 0; | ||||
|     for (const o of generate_orgs) { | ||||
|       count_orgs++; | ||||
|       let cards = []; | ||||
|       let count = 0; | ||||
|       let runners = | ||||
|         await RunnerOrganizationService.runnerOrganizationControllerGetRunners( | ||||
|           o.id, | ||||
|           true | ||||
|         ); | ||||
|       for (let runner of runners) { | ||||
|         let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
|         if (!card) { | ||||
|           card = await RunnerCardService.runnerCardControllerPost({ | ||||
|             runner: runner.id, | ||||
|           }); | ||||
|         } | ||||
|         cards.push(card); | ||||
|       } | ||||
|       for (const t of o.teams) { | ||||
|         count++; | ||||
|         let runners = await RunnerTeamService.runnerTeamControllerGetRunners( | ||||
|           t.id | ||||
|         ); | ||||
|         for (let runner of runners) { | ||||
|           let card = current_cards.find((c) => c.runner?.id == runner.id); | ||||
|           if (!card) { | ||||
|             card = await RunnerCardService.runnerCardControllerPost({ | ||||
|               runner: runner.id, | ||||
|             }); | ||||
|           } | ||||
|           cards.push(card); | ||||
|         } | ||||
|       } | ||||
|       await documentServer | ||||
|         .generateCards(cards, locale) | ||||
|         .then((blob) => { | ||||
|           download( | ||||
|             blob, | ||||
|             `${$_("runnercards")}_${o.name}-${locale}-${createId()}.pdf` | ||||
|           ); | ||||
|         }) | ||||
|         .catch((err) => {}); | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| {#if cards_show} | ||||
| 	<button | ||||
| 		on:click={() => { | ||||
| 			generateRunnerCards("de"); | ||||
| 		}} | ||||
| 		class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0" | ||||
| 	> | ||||
| 		{$_("generate-runnercards")}: DE | ||||
| 	</button> | ||||
| 	<button | ||||
| 		on:click={() => { | ||||
| 			generateRunnerCards("en"); | ||||
| 		}} | ||||
| 		class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0" | ||||
| 	> | ||||
| 		{$_("generate-runnercards")}: EN | ||||
| 	</button> | ||||
|   <button | ||||
|     on:click={() => { | ||||
|       generateRunnerCards("de"); | ||||
|     }} | ||||
|     on:contextmenu|preventDefault={() => { | ||||
|       generateRunnerCards("de", true); | ||||
|     }} | ||||
|     class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0" | ||||
|   > | ||||
|     {$_("generate-runnercards")}: DE | ||||
|   </button> | ||||
|   <button | ||||
|     on:click={() => { | ||||
|       generateRunnerCards("en"); | ||||
|     }} | ||||
| 	on:contextmenu|preventDefault={() => { | ||||
|       generateRunnerCards("en", true); | ||||
|     }} | ||||
|     class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0" | ||||
|   > | ||||
|     {$_("generate-runnercards")}: EN | ||||
|   </button> | ||||
| {/if} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user