feat(GenerateSponsoringContracts): show download progress

commit c3226c37c901ab7e2aadb0ec11fb87a6e0610fe2
Author: Philipp Dormann <philipp@philippdormann.de>
Date:   Wed Apr 2 22:03:06 2025 +0200

    wip

commit 210140fd67322c4052120c48f835b34e0f4993a9
Author: Philipp Dormann <philipp@philippdormann.de>
Date:   Wed Apr 2 21:58:07 2025 +0200

    wip

commit 35e58d233eff076efb62722c76a11e22b6e14441
Author: Philipp Dormann <philipp@philippdormann.de>
Date:   Wed Apr 2 21:55:21 2025 +0200

    wip

commit a09bf31e220cf17cdc4159e6f1beb7dbbefb6114
Author: Philipp Dormann <philipp@philippdormann.de>
Date:   Wed Apr 2 21:48:51 2025 +0200

    wip

commit 7c31fba83a4105df7738bd8e47a7feb11284cd0c
Author: Philipp Dormann <philipp@philippdormann.de>
Date:   Wed Apr 2 21:48:37 2025 +0200

    wip
This commit is contained in:
Philipp Dormann 2025-04-02 22:03:47 +02:00
parent c00497d776
commit e261d5e345
Signed by: philipp
GPG Key ID: 3BB9ADD52DCA4314
4 changed files with 114 additions and 6 deletions

View 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">&#8203;</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}

View File

@ -7,6 +7,7 @@
import DocumentServer from "./DocumentServer"; import DocumentServer from "./DocumentServer";
import { init } from "@paralleldrive/cuid2"; import { init } from "@paralleldrive/cuid2";
import toast from "svelte-french-toast"; import toast from "svelte-french-toast";
import DownloadProgressModal from "./DownloadProgressModal.svelte";
const createId = init({ length: 10, fingerprint: "lfk-frontend" }); const createId = init({ length: 10, fingerprint: "lfk-frontend" });
const documentServer = new DocumentServer( const documentServer = new DocumentServer(
config.baseurl_documentserver, config.baseurl_documentserver,
@ -17,8 +18,12 @@
export let generate_runners = []; export let generate_runners = [];
export let generate_orgs = []; export let generate_orgs = [];
export let generate_teams = []; export let generate_teams = [];
//
export let download_modal_open = false;
export let download_details = "";
function generateSponsoringContract(locale) { function generateSponsoringContract(locale) {
download_modal_open = true;
if (generate_orgs.length > 0) { if (generate_orgs.length > 0) {
generateOrgContracts(locale); generateOrgContracts(locale);
} else if (generate_teams.length > 0) { } else if (generate_teams.length > 0) {
@ -41,19 +46,24 @@
async function generateTeamContracts(locale) { async function generateTeamContracts(locale) {
toast.loading($_("generating-pdfs")); toast.loading($_("generating-pdfs"));
let totalCount = generate_teams.length;
let count = 0; let count = 0;
for (const t of generate_teams) { for (const t of generate_teams) {
count++; count++;
download_details = `${t.parentGroup.name} > ${t.name}`;
const runners = await RunnerTeamService.runnerTeamControllerGetRunners( const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id t.id
); );
documentServer await documentServer
.generateContracts(runners, locale) .generateContracts(runners, locale)
.then((blob) => { .then((blob) => {
download( download(
blob, blob,
`${$_("sponsorings")}_${t.name}-${locale}-${createId()}.pdf` `${$_("sponsorings")}_${t.name}-${locale}-${createId()}.pdf`
); );
if (count === totalCount) {
download_modal_open = false;
}
}) })
.catch((err) => {}); .catch((err) => {});
} }
@ -61,15 +71,23 @@
async function generateOrgContracts(locale) { async function generateOrgContracts(locale) {
toast.loading($_("generating-pdf")); toast.loading($_("generating-pdf"));
let count_orgs = 0; let totalCount = 0;
for (const o of generate_orgs) { for (const o of generate_orgs) {
count_orgs++; totalCount++;
let count = 0; for (const t of o.teams) {
totalCount++;
}
}
console.log({ totalCount });
let count = 0;
for (const o of generate_orgs) {
count++;
let runners = let runners =
await RunnerOrganizationService.runnerOrganizationControllerGetRunners( await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
o.id, o.id,
true true
); );
download_details = o.name;
await documentServer await documentServer
.generateContracts(runners, locale) .generateContracts(runners, locale)
.then((blob) => { .then((blob) => {
@ -84,6 +102,7 @@
let runners = await RunnerTeamService.runnerTeamControllerGetRunners( let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id t.id
); );
download_details = `${o.name} > ${t.name}`;
await documentServer await documentServer
.generateContracts(runners, locale) .generateContracts(runners, locale)
.then((blob) => { .then((blob) => {
@ -93,15 +112,19 @@
t.name t.name
}-${locale}-${createId()}.pdf` }-${locale}-${createId()}.pdf`
); );
console.log({ count });
if (count === totalCount) {
download_modal_open = false;
}
}) })
.catch((err) => {}); .catch((err) => {});
} }
} }
} }
function generateRunnerContracts(locale) { async function generateRunnerContracts(locale) {
toast.loading($_("generating-pdf")); toast.loading($_("generating-pdf"));
documentServer await documentServer
.generateContracts(generate_runners, locale) .generateContracts(generate_runners, locale)
.then((blob) => { .then((blob) => {
let fileName = `${$_("sponsorings")}-${locale}-${createId()}.pdf`; let fileName = `${$_("sponsorings")}-${locale}-${createId()}.pdf`;
@ -111,6 +134,7 @@
}-${locale}-${createId()}.pdf`; }-${locale}-${createId()}.pdf`;
} }
download(blob, fileName); download(blob, fileName);
download_modal_open = false;
}) })
.catch((err) => { .catch((err) => {
console.error(err); console.error(err);
@ -119,6 +143,7 @@
</script> </script>
{#if sponsoring_contracts_show} {#if sponsoring_contracts_show}
<DownloadProgressModal {download_details} modal_open={download_modal_open} />
<button <button
on:click={() => { on:click={() => {
generateSponsoringContract("de"); generateSponsoringContract("de");

View File

@ -204,6 +204,7 @@
"donors-are-being-loaded": "Sponsoren werden geladen", "donors-are-being-loaded": "Sponsoren werden geladen",
"dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?", "dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?",
"dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌", "dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌",
"download_laeuft": "Download läuft...",
"e-mail-adress": "E-Mail-Adresse", "e-mail-adress": "E-Mail-Adresse",
"edit": "Bearbeiten", "edit": "Bearbeiten",
"edit-a-card": "Läuferkarte bearbeiten", "edit-a-card": "Läuferkarte bearbeiten",

View File

@ -204,6 +204,7 @@
"donors-are-being-loaded": "donors are being loaded", "donors-are-being-loaded": "donors are being loaded",
"dont-have-your-email-connected": "Don't have your email connected?", "dont-have-your-email-connected": "Don't have your email connected?",
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌", "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
"download_laeuft": "Download in progress...",
"e-mail-adress": "E-Mail Adress", "e-mail-adress": "E-Mail Adress",
"edit": "Edit", "edit": "Edit",
"edit-a-card": "Edit a card", "edit-a-card": "Edit a card",