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:
parent
c00497d776
commit
e261d5e345
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 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");
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user