Compare commits
9 Commits
1.9.5
...
feature/sp
| Author | SHA1 | Date | |
|---|---|---|---|
|
c3226c37c9
|
|||
|
210140fd67
|
|||
|
35e58d233e
|
|||
|
a09bf31e22
|
|||
|
7c31fba83a
|
|||
|
c00497d776
|
|||
|
766eeab49f
|
|||
|
3c9b404234
|
|||
|
9c56b3883e
|
14
CHANGELOG.md
14
CHANGELOG.md
@@ -2,9 +2,23 @@
|
|||||||
|
|
||||||
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.9.7](https://git.odit.services/lfk/frontend/compare/1.9.6...1.9.7)
|
||||||
|
|
||||||
|
- fix: ImportRunnerModal scrolling & team select [`766eeab`](https://git.odit.services/lfk/frontend/commit/766eeab49fb3ca5715c19dbf9bc53cb71124d3df)
|
||||||
|
|
||||||
|
#### [1.9.6](https://git.odit.services/lfk/frontend/compare/1.9.5...1.9.6)
|
||||||
|
|
||||||
|
> 29 March 2025
|
||||||
|
|
||||||
|
- chore(release): 1.9.6 [`3c9b404`](https://git.odit.services/lfk/frontend/commit/3c9b404234c7d7d2f0c48256be2130a0ed8ae047)
|
||||||
|
- pnpm allow builds [`9c56b38`](https://git.odit.services/lfk/frontend/commit/9c56b3883eeab9e1a5e1c4921bfb6528c230e0d4)
|
||||||
|
|
||||||
#### [1.9.5](https://git.odit.services/lfk/frontend/compare/1.9.4...1.9.5)
|
#### [1.9.5](https://git.odit.services/lfk/frontend/compare/1.9.4...1.9.5)
|
||||||
|
|
||||||
|
> 29 March 2025
|
||||||
|
|
||||||
- feat: modal improvements [`d7e84a7`](https://git.odit.services/lfk/frontend/commit/d7e84a79a892294d532cc93aa3391c14a7a5ce99)
|
- feat: modal improvements [`d7e84a7`](https://git.odit.services/lfk/frontend/commit/d7e84a79a892294d532cc93aa3391c14a7a5ce99)
|
||||||
|
- chore(release): 1.9.5 [`3d506db`](https://git.odit.services/lfk/frontend/commit/3d506db97502399e8b381b4cf38af2f07a584aec)
|
||||||
|
|
||||||
#### [1.9.4](https://git.odit.services/lfk/frontend/compare/1.9.3...1.9.4)
|
#### [1.9.4](https://git.odit.services/lfk/frontend/compare/1.9.3...1.9.4)
|
||||||
|
|
||||||
|
|||||||
@@ -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.9.5-RELEASE_INFO</span
|
>RELEASE_INFO-1.9.7-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>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@odit/lfk-frontend",
|
"name": "@odit/lfk-frontend",
|
||||||
"version": "1.9.5",
|
"version": "1.9.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"i18n-order": "node order.js",
|
"i18n-order": "node order.js",
|
||||||
|
|||||||
3
pnpm-workspace.yaml
Normal file
3
pnpm-workspace.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
onlyBuiltDependencies:
|
||||||
|
- es5-ext
|
||||||
|
- esbuild
|
||||||
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++;
|
||||||
|
for (const t of o.teams) {
|
||||||
|
totalCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log({ totalCount });
|
||||||
let count = 0;
|
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");
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
/></svg
|
/></svg
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
|
<div class="mt-3 sm:text-left">
|
||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
{$_('delete_runner')}
|
{$_('delete_runner')}
|
||||||
</h3>
|
</h3>
|
||||||
|
|||||||
@@ -212,7 +212,9 @@
|
|||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
>
|
>
|
||||||
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl lg:rounded-xl">
|
<div
|
||||||
|
class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl lg:rounded-xl"
|
||||||
|
>
|
||||||
<div class="">
|
<div class="">
|
||||||
<div
|
<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"
|
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"
|
||||||
@@ -278,24 +280,14 @@
|
|||||||
{/if}
|
{/if}
|
||||||
{#if opened_from === "RunnerOverview"}
|
{#if opened_from === "RunnerOverview"}
|
||||||
<p>{$_("group")}</p>
|
<p>{$_("group")}</p>
|
||||||
<Select
|
<select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
bind:value={selected_org_or_team}
|
||||||
itemFilter={(label, filterText, option) =>
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
>
|
||||||
option.id.value
|
{#each groups as g}
|
||||||
.toString()
|
<option value={g.value}>{g.label}</option>
|
||||||
.startsWith(filterText.toLowerCase())}
|
{/each}
|
||||||
items={groups}
|
</select>
|
||||||
showChevron={true}
|
|
||||||
placeholder={$_(
|
|
||||||
"search-for-an-organization-or-team-by-name-or-id"
|
|
||||||
)}
|
|
||||||
noOptionsMessage={$_("no-organization-or-team-found")}
|
|
||||||
on:select={(selectedValue) => {
|
|
||||||
selected_org_or_team = selectedValue.detail.value;
|
|
||||||
}}
|
|
||||||
on:clear={() => (selected_org_or_team = null)}
|
|
||||||
/>
|
|
||||||
{/if}
|
{/if}
|
||||||
{#if opened_from === "OrgDetail"}
|
{#if opened_from === "OrgDetail"}
|
||||||
<p>
|
<p>
|
||||||
@@ -304,15 +296,8 @@
|
|||||||
})}
|
})}
|
||||||
</p>
|
</p>
|
||||||
{/if}
|
{/if}
|
||||||
<input
|
|
||||||
type="search"
|
|
||||||
bind:value={searchvalue}
|
|
||||||
placeholder={$_("datatable.search")}
|
|
||||||
aria-label={$_("datatable.search")}
|
|
||||||
class="p-2 w-full"
|
|
||||||
/>
|
|
||||||
<div class="relative w-full mt-4 mb-4">
|
<div class="relative w-full mt-4 mb-4">
|
||||||
<div class="w-full overflow-x-auto">
|
<div class="w-full overflow-x-auto max-h-[50vh]">
|
||||||
<table class="divide-y divide-gray-200 w-full">
|
<table class="divide-y divide-gray-200 w-full">
|
||||||
<thead class="bg-gray-50">
|
<thead class="bg-gray-50">
|
||||||
<tr class="odd:bg-white even:bg-gray-100">
|
<tr class="odd:bg-white even:bg-gray-100">
|
||||||
|
|||||||
@@ -180,6 +180,7 @@
|
|||||||
import store from "../../store";
|
import store from "../../store";
|
||||||
import AddRunnerModal from "./AddRunnerModal.svelte";
|
import AddRunnerModal from "./AddRunnerModal.svelte";
|
||||||
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
||||||
|
import toast from "svelte-french-toast";
|
||||||
$: current_runners = [];
|
$: current_runners = [];
|
||||||
export let modal_open = false;
|
export let modal_open = false;
|
||||||
export let import_modal_open = false;
|
export let import_modal_open = false;
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user