Compare commits

..

No commits in common. "1.10.3" and "1.10.2" have entirely different histories.

7 changed files with 178 additions and 200 deletions

View File

@ -2,17 +2,9 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [1.10.3](https://git.odit.services/lfk/frontend/compare/1.10.2...1.10.3)
- feat(pdf): Send selfservicelink for generation [`01e77a9`](https://git.odit.services/lfk/frontend/commit/01e77a97f3f28700e0249d35afd9641b56d9c55d)
- chore(deps): Bump @odit/lfk-client-js [`10824b5`](https://git.odit.services/lfk/frontend/commit/10824b5d9b207e14a37fa23e90d54337d76e60a9)
#### [1.10.2](https://git.odit.services/lfk/frontend/compare/1.10.1...1.10.2) #### [1.10.2](https://git.odit.services/lfk/frontend/compare/1.10.1...1.10.2)
> 11 April 2025
- refactor(runners): filter table for created_via [`785b9e0`](https://git.odit.services/lfk/frontend/commit/785b9e0b60a9961f99d0c519d6bb12dc735ac605) - refactor(runners): filter table for created_via [`785b9e0`](https://git.odit.services/lfk/frontend/commit/785b9e0b60a9961f99d0c519d6bb12dc735ac605)
- chore(release): 1.10.2 [`d9870e0`](https://git.odit.services/lfk/frontend/commit/d9870e03bc3175ee9b299174a19f257d6046a718)
#### [1.10.1](https://git.odit.services/lfk/frontend/compare/1.10.0...1.10.1) #### [1.10.1](https://git.odit.services/lfk/frontend/compare/1.10.0...1.10.1)

View File

@ -13,7 +13,7 @@
<body> <body>
<span style="display: none; visibility: hidden" id="buildinfo" <span style="display: none; visibility: hidden" id="buildinfo"
>RELEASE_INFO-1.10.3-RELEASE_INFO</span >RELEASE_INFO-1.10.2-RELEASE_INFO</span
> >
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
<script src="/env.js"></script> <script src="/env.js"></script>

View File

@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-frontend", "name": "@odit/lfk-frontend",
"version": "1.10.3", "version": "1.10.2",
"type": "module", "type": "module",
"scripts": { "scripts": {
"i18n-order": "node order.js", "i18n-order": "node order.js",
@ -43,7 +43,7 @@
}, },
"dependencies": { "dependencies": {
"@fontsource/athiti": "^5.2.5", "@fontsource/athiti": "^5.2.5",
"@odit/lfk-client-js": "1.2.4", "@odit/lfk-client-js": "1.2.3",
"@paralleldrive/cuid2": "2.2.2", "@paralleldrive/cuid2": "2.2.2",
"@tanstack/svelte-table": "8.9.1", "@tanstack/svelte-table": "8.9.1",
"bwip-js": "3.4.0", "bwip-js": "3.4.0",

10
pnpm-lock.yaml generated
View File

@ -12,8 +12,8 @@ importers:
specifier: ^5.2.5 specifier: ^5.2.5
version: 5.2.5 version: 5.2.5
'@odit/lfk-client-js': '@odit/lfk-client-js':
specifier: 1.2.4 specifier: 1.2.3
version: 1.2.4 version: 1.2.3
'@paralleldrive/cuid2': '@paralleldrive/cuid2':
specifier: 2.2.2 specifier: 2.2.2
version: 2.2.2 version: 2.2.2
@ -355,8 +355,8 @@ packages:
'@octokit/types@13.6.1': '@octokit/types@13.6.1':
resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==}
'@odit/lfk-client-js@1.2.4': '@odit/lfk-client-js@1.2.3':
resolution: {integrity: sha512-eJRsjtpMm/VsQ1v2I+inMWCZmzL+WoOvsA+hj8IGsyCVn0td+z/HAwQ0SuXXNZpLPL3qSlENHXjFNrgztExEgA==} resolution: {integrity: sha512-QXJUVfH57iwykKNHQQC4z18/f7rnpCNCjvxijrOmuBMLsBNuYSzvrrqXyno4ce1rr5f0PD4IYtKmhcgJsk49wQ==}
'@odit/license-exporter@0.2.0': '@odit/license-exporter@0.2.0':
resolution: {integrity: sha512-RRyfQzDLoyLQlGSd8ThJQ3h0fiCe4tkmm935AUvSVQWP+p88FcnI4iaktKBJJVBnIpDhkv/7sDSA5dFc/QMM5w==} resolution: {integrity: sha512-RRyfQzDLoyLQlGSd8ThJQ3h0fiCe4tkmm935AUvSVQWP+p88FcnI4iaktKBJJVBnIpDhkv/7sDSA5dFc/QMM5w==}
@ -2176,7 +2176,7 @@ snapshots:
dependencies: dependencies:
'@octokit/openapi-types': 22.2.0 '@octokit/openapi-types': 22.2.0
'@odit/lfk-client-js@1.2.4': {} '@odit/lfk-client-js@1.2.3': {}
'@odit/license-exporter@0.2.0': '@odit/license-exporter@0.2.0':
dependencies: dependencies:

View File

@ -100,7 +100,6 @@ class DocumentServer {
first_name: runners[i].firstname, first_name: runners[i].firstname,
middle_name: runners[i].middlename, middle_name: runners[i].middlename,
last_name: runners[i].lastname, last_name: runners[i].lastname,
self_service_link: runners[i].selfserviceLink,
group: { group: {
id: runners[i].group.id, id: runners[i].group.id,
name: runners[i].group.name, name: runners[i].group.name,

View File

@ -1,180 +1,175 @@
<script> <script>
import { _ } from "svelte-i18n"; import { _ } from "svelte-i18n";
import { import {
DonationService, DonationService,
RunnerTeamService, RunnerTeamService,
RunnerOrganizationService, RunnerOrganizationService,
RunnerService } from "@odit/lfk-client-js";
} from "@odit/lfk-client-js"; import { init } from "@paralleldrive/cuid2";
import { init } from "@paralleldrive/cuid2"; import toast from "svelte-french-toast";
import toast from "svelte-french-toast"; import DocumentServer from "./DocumentServer";
import DocumentServer from "./DocumentServer"; 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, config.documentserver_key
config.documentserver_key );
);
export let certificates_show = false; export let certificates_show = false;
export let generate_runners = []; export let generate_runners = [];
export let generate_orgs = []; export let generate_orgs = [];
export let generate_teams = []; export let generate_teams = [];
function generateCertificates(locale) { function generateCertificates(locale) {
if (generate_orgs.length > 0) { if (generate_orgs.length > 0) {
generateOrgCertificates(locale); generateOrgCertificates(locale);
} else if (generate_teams.length > 0) { } else if (generate_teams.length > 0) {
generateTeamCertificates(locale); generateTeamCertificates(locale);
} else { } else {
generateRunnerCertificates(locale); generateRunnerCertificates(locale);
} }
} }
function download(blob, fileName) { function download(blob, fileName) {
const url = window.URL.createObjectURL(blob); const url = window.URL.createObjectURL(blob);
let a = document.createElement("a"); let a = document.createElement("a");
a.href = url; a.href = url;
a.download = fileName; a.download = fileName;
document.body.appendChild(a); document.body.appendChild(a);
a.click(); a.click();
a.remove(); a.remove();
toast.dismiss(); toast.dismiss();
toast.success($_("pdf-successfully-generated")); toast.success($_("pdf-successfully-generated"));
} }
async function generateRunnerCertificates(locale) { async function generateRunnerCertificates(locale) {
toast.loading($_("generating-pdf")); toast.loading($_("generating-pdf"));
const current_donations = const current_donations =
(await DonationService.donationControllerGetAll()) || []; (await DonationService.donationControllerGetAll()) || [];
let certificateRunners = []; let certificateRunners = [];
for (let runner of generate_runners) { for (let runner of generate_runners) {
const linkRunner = await RunnerService.runnerControllerGetOne(runner.id) runner.distanceDonations =
linkRunner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
current_donations.filter((d) => d.runner?.id == runner.id) || []; certificateRunners.push(runner);
certificateRunners.push(linkRunner); }
} documentServer
documentServer .generateCertificates(certificateRunners, locale)
.generateCertificates(certificateRunners, locale) .then((blob) => {
.then((blob) => { let fileName = `${$_("certificates")}-${locale}.pdf`;
let fileName = `${$_("certificates")}-${locale}.pdf`; if (generate_runners.length == 1) {
if (generate_runners.length == 1) { fileName = `${$_("certificates")}_${
fileName = `${$_("certificates")}_${ generate_runners[0].firstname
generate_runners[0].firstname }_${generate_runners[0].lastname}-${locale}-${createId()}.pdf`;
}_${generate_runners[0].lastname}-${locale}-${createId()}.pdf`; }
} download(blob, fileName);
download(blob, fileName); })
}) .catch((err) => {});
.catch((err) => {}); }
}
async function generateTeamCertificates(locale) { async function generateTeamCertificates(locale) {
toast.loading($_("generating-pdfs")); toast.loading($_("generating-pdfs"));
let count = 0; let count = 0;
const current_donations = const current_donations =
(await DonationService.donationControllerGetAll()) || []; (await DonationService.donationControllerGetAll()) || [];
for (const t of generate_teams) { for (const t of generate_teams) {
const runners = await RunnerTeamService.runnerTeamControllerGetRunners( const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id, t.id
true );
); let certificateRunners = [];
let certificateRunners = []; for (let runner of runners) {
for (let runner of runners) { runner.distanceDonations =
runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
current_donations.filter((d) => d.runner?.id == runner.id) || []; certificateRunners.push(runner);
certificateRunners.push(runner); }
} documentServer
documentServer .generateCertificates(certificateRunners, locale)
.generateCertificates(certificateRunners, locale) .then((blob) => {
.then((blob) => { count++;
count++; download(
download( blob,
blob, `${$_("certificates")}_${t.name}-${locale}-${createId()}.pdf`
`${$_("certificates")}_${t.name}-${locale}-${createId()}.pdf` );
); })
}) .catch((err) => {});
.catch((err) => {}); }
} }
}
async function generateOrgCertificates(locale) { async function generateOrgCertificates(locale) {
toast.loading($_("generating-pdfs")); toast.loading($_("generating-pdfs"));
const current_donations = const current_donations =
(await DonationService.donationControllerGetAll()) || []; (await DonationService.donationControllerGetAll()) || [];
let count = 0; let count = 0;
let count_orgs = 0; let count_orgs = 0;
for (const o of generate_orgs) { for (const o of generate_orgs) {
count_orgs++; count_orgs++;
let count = 0; let count = 0;
let runners = let runners =
await RunnerOrganizationService.runnerOrganizationControllerGetRunners( await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
o.id, o.id,
true, true
true );
); let certificateRunners = [];
let certificateRunners = []; for (let runner of runners) {
for (let runner of runners) { runner.distanceDonations =
runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
current_donations.filter((d) => d.runner?.id == runner.id) || []; certificateRunners.push(runner);
certificateRunners.push(runner); }
} await documentServer
await documentServer .generateCertificates(certificateRunners, locale)
.generateCertificates(certificateRunners, locale) .then((blob) => {
.then((blob) => { download(
download( blob,
blob, `${$_("certificates")}_${o.name}-${locale}-${createId()}.pdf`
`${$_("certificates")}_${o.name}-${locale}-${createId()}.pdf` );
); })
}) .catch((err) => {});
.catch((err) => {}); for (const t of o.teams) {
for (const t of o.teams) { count++;
count++; let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
let runners = await RunnerTeamService.runnerTeamControllerGetRunners( t.id
t.id, );
true let certificateRunners = [];
); for (let runner of runners) {
let certificateRunners = []; runner.distanceDonations =
for (let runner of runners) { current_donations.filter((d) => d.runner?.id == runner.id) || [];
runner.distanceDonations = certificateRunners.push(runner);
current_donations.filter((d) => d.runner?.id == runner.id) || []; }
certificateRunners.push(runner); await documentServer
} .generateCertificates(certificateRunners, locale)
await documentServer .then((blob) => {
.generateCertificates(certificateRunners, locale) download(
.then((blob) => { blob,
download( `${$_("certificates")}_${o.name}_${
blob, t.name
`${$_("certificates")}_${o.name}_${ }-${locale}-${createId()}.pdf`
t.name );
}-${locale}-${createId()}.pdf` if (
); count === o.teams.length &&
if ( count_orgs === generate_orgs.length
count === o.teams.length && ) {
count_orgs === generate_orgs.length toast.dismiss();
) { toast.success($_("pdfs-successfully-generated"));
toast.dismiss(); }
toast.success($_("pdfs-successfully-generated")); })
} .catch((err) => {});
}) }
.catch((err) => {}); }
} }
}
}
</script> </script>
{#if certificates_show} {#if certificates_show}
<button <button
on:click={() => { on:click={() => {
generateCertificates("de"); generateCertificates("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" 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-runner-certificates")}: DE {$_("generate-runner-certificates")}: DE
</button> </button>
<button <button
on:click={() => { on:click={() => {
generateCertificates("en"); generateCertificates("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" 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-runner-certificates")}: EN {$_("generate-runner-certificates")}: EN
</button> </button>
{/if} {/if}

View File

@ -491,10 +491,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@odit/lfk-client-js@npm:1.2.4": "@odit/lfk-client-js@npm:1.1.3":
version: 1.2.4 version: 1.1.3
resolution: "@odit/lfk-client-js@npm:1.2.4" resolution: "@odit/lfk-client-js@npm:1.1.3"
checksum: 10c0/503b3eec7fe66f8d42b137660fd5a7cda2f067c6c79fbe3c15613fb7a06284adb3e186a645f8e48c6de015fb2c8c0a42074551201fd0244215e8ba444dfe17e2 checksum: 10c0/c5108400dc40b6eb5d4c467238c178779454bf46301559034fbfd2d7666e863af5d5df8208b501ec6dad1b97994e2005d879f2d5b5f3e0439f01f34ecd97f895
languageName: node languageName: node
linkType: hard linkType: hard
@ -503,7 +503,7 @@ __metadata:
resolution: "@odit/lfk-frontend@workspace:." resolution: "@odit/lfk-frontend@workspace:."
dependencies: dependencies:
"@fontsource/athiti": "npm:^5.2.5" "@fontsource/athiti": "npm:^5.2.5"
"@odit/lfk-client-js": "npm:1.2.4" "@odit/lfk-client-js": "npm:1.1.3"
"@odit/license-exporter": "npm:0.2.0" "@odit/license-exporter": "npm:0.2.0"
"@paralleldrive/cuid2": "npm:2.2.2" "@paralleldrive/cuid2": "npm:2.2.2"
"@sveltejs/vite-plugin-svelte": "npm:2.1.1" "@sveltejs/vite-plugin-svelte": "npm:2.1.1"
@ -513,7 +513,6 @@ __metadata:
bwip-js: "npm:3.4.0" bwip-js: "npm:3.4.0"
check-password-strength: "npm:2.0.10" check-password-strength: "npm:2.0.10"
csvtojson: "npm:2.0.10" csvtojson: "npm:2.0.10"
html5-qrcode: "npm:^2.3.8"
localforage: "npm:1.10.0" localforage: "npm:1.10.0"
marked: "npm:4.3.0" marked: "npm:4.3.0"
postcss: "npm:8.5.3" postcss: "npm:8.5.3"
@ -2033,13 +2032,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"html5-qrcode@npm:^2.3.8":
version: 2.3.8
resolution: "html5-qrcode@npm:2.3.8"
checksum: 10c0/3d7d0b3687e41a6fc0a06345f67e89ad3c7c00a3d0d8846d6fd31985e1ed2ac1c310e625f0b650dbc689f6b83469e3378417e7431ae5a9194178f1172bf6a93a
languageName: node
linkType: hard
"http-cache-semantics@npm:^4.1.1": "http-cache-semantics@npm:^4.1.1":
version: 4.1.1 version: 4.1.1
resolution: "http-cache-semantics@npm:4.1.1" resolution: "http-cache-semantics@npm:4.1.1"