Compare commits

..

28 Commits

Author SHA1 Message Date
fdc7d80bbf 🚀RELEASE v1.2.0 2023-04-19 16:56:09 +02:00
352551e168 feat(donorsoverview): Dynamicly add newly generated donors 2023-04-19 16:55:14 +02:00
7aec050419 feat(donorsoverview): Implemented delete confirmation with datatable 2023-04-19 16:49:54 +02:00
d98fb0d5b2 feat(donoroverview): Added datatable formatters 2023-04-19 16:39:30 +02:00
5014bf5bc5 feat(donors): Load donors paginated 2023-04-19 16:23:00 +02:00
0708cabc75 🚀RELEASE v1.1.0
Some checks failed
continuous-integration/drone/push Build is failing
2023-04-19 16:05:21 +02:00
4fcb26cf93 feat(dashboard): Updated stats icons 2023-04-19 16:04:02 +02:00
269def20d1 feat(dashboard): Added average sponsoring
Some checks failed
continuous-integration/drone/push Build is failing
2023-04-19 15:59:45 +02:00
b8de9e0e42 feat(dashboard): Added average distance 2023-04-19 15:57:46 +02:00
7b2b598588 feat(dashboard): Added total donations 2023-04-19 15:56:21 +02:00
e0b61486b0 feat(dashboar): Added total donors to overview 2023-04-19 15:54:39 +02:00
3f86f7412f Lockfile 2023-04-19 15:53:33 +02:00
6454d960de Bumped client 2023-04-19 15:53:28 +02:00
37154c188b Merge branch 'dev' of git.odit.services:lfk/frontend into dev
Some checks failed
continuous-integration/drone/push Build is failing
2023-04-19 15:38:15 +02:00
8da7578a0a 🚀RELEASE v1.0.0 2023-04-19 15:37:56 +02:00
2a64094006 new license file version [CI SKIP] 2023-04-19 13:37:32 +00:00
e9ce9644ff Merge pull request 'feature/175-request_pagination' (#176) from feature/175-request_pagination into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #176
2023-04-19 13:37:16 +00:00
52439aa5bc Allways set loaded to true
ref #175
2023-04-18 20:47:42 +02:00
ccf865687b Donation paginated loading
ref #175
2023-04-18 20:46:18 +02:00
cac34db1fd Paginated scan loading
ref #175
2023-04-18 20:43:04 +02:00
faf3893180 Paginated runner loading (1000 per page)
ref #175
2023-04-18 20:40:28 +02:00
c33dfcfddd Implemented Async loading of cards via pagination (500 cards per request)
ref #175
2023-04-18 20:38:01 +02:00
019e14ab1f Bumped lfk client
Some checks failed
continuous-integration/drone/push Build is failing
2023-04-18 20:18:46 +02:00
b5790196c6 Merge branch 'dev' of git.odit.services:lfk/frontend into dev
Some checks failed
continuous-integration/drone/push Build is failing
2023-04-17 17:56:42 +02:00
94a64ca690 🚀RELEASE v0.19.0 2023-04-17 17:56:34 +02:00
a6ce04c903 new license file version [CI SKIP] 2023-04-17 15:56:08 +00:00
165c154233 Merge pull request 'feature/173-scanstation_configcodes' (#174) from feature/173-scanstation_configcodes into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #174
2023-04-17 15:55:53 +00:00
318547db46 Adjusted size on smaller devices
ref #173
2023-04-17 17:55:33 +02:00
19 changed files with 1998 additions and 1637 deletions

View File

@@ -2,8 +2,60 @@
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.2.0](https://git.odit.services/lfk/frontend/compare/1.1.0...1.2.0)
- feat(donoroverview): Added datatable formatters [`d98fb0d`](https://git.odit.services/lfk/frontend/commit/d98fb0d5b288c987a45ccbf2bb026ccaab539a71)
- feat(donors): Load donors paginated [`5014bf5`](https://git.odit.services/lfk/frontend/commit/5014bf5bc5873cfe4ae04d71b4aff12b257dd2e3)
- feat(donorsoverview): Dynamicly add newly generated donors [`352551e`](https://git.odit.services/lfk/frontend/commit/352551e168b5dced5e7353e82655908d82d28af0)
- feat(donorsoverview): Implemented delete confirmation with datatable [`7aec050`](https://git.odit.services/lfk/frontend/commit/7aec050419f6f1bf853c3e1bc655b01725ed3b65)
#### [1.1.0](https://git.odit.services/lfk/frontend/compare/1.0.0...1.1.0)
> 19 April 2023
- 🚀RELEASE v1.1.0 [`0708cab`](https://git.odit.services/lfk/frontend/commit/0708cabc75e63a876e54a0b343318f8d934ae319)
- feat(dashboar): Added total donors to overview [`e0b6148`](https://git.odit.services/lfk/frontend/commit/e0b61486b089aa1e611ef3569b1521fc331ec0e4)
- feat(dashboard): Updated stats icons [`4fcb26c`](https://git.odit.services/lfk/frontend/commit/4fcb26cf9371e27e5d7e474b3558ef354e9114c0)
- feat(dashboard): Added average sponsoring [`269def2`](https://git.odit.services/lfk/frontend/commit/269def20d114ededaba3153bbd50ec2ddd70e1c6)
- feat(dashboard): Added total donations [`7b2b598`](https://git.odit.services/lfk/frontend/commit/7b2b59858839b98370af6fb1e6028ba0a1639186)
- feat(dashboard): Added average distance [`b8de9e0`](https://git.odit.services/lfk/frontend/commit/b8de9e0e427b3a8b56e6354ad7168ae12c7cce85)
- Lockfile [`3f86f74`](https://git.odit.services/lfk/frontend/commit/3f86f7412ffc4bc27328ad1f7d3c3118546e7e29)
- Bumped client [`6454d96`](https://git.odit.services/lfk/frontend/commit/6454d960de3f9f5ea86679f157b3b7e7cffde74d)
- new license file version [CI SKIP] [`2a64094`](https://git.odit.services/lfk/frontend/commit/2a640940062765a470387103a72ed14a2411d97b)
### [1.0.0](https://git.odit.services/lfk/frontend/compare/0.19.0...1.0.0)
> 19 April 2023
- 🚀RELEASE v1.0.0 [`8da7578`](https://git.odit.services/lfk/frontend/commit/8da7578a0a46a3e97d8c870e29399f6e8821c9fa)
- Merge pull request 'feature/175-request_pagination' (#176) from feature/175-request_pagination into dev [`e9ce964`](https://git.odit.services/lfk/frontend/commit/e9ce9644ff03f981cec6e9ad56aa5fdf0ff71ef4)
- Donation paginated loading [`ccf8656`](https://git.odit.services/lfk/frontend/commit/ccf865687b34016931a702c0a9b98a0a18e2b03a)
- Paginated scan loading [`cac34db`](https://git.odit.services/lfk/frontend/commit/cac34db1fd3bf5dc7c7be64b3a76ca4c8c77938d)
- Implemented Async loading of cards via pagination (500 cards per request) [`c33dfcf`](https://git.odit.services/lfk/frontend/commit/c33dfcfddddfed0902f3fa9b1d8a1d3e1560262f)
- Paginated runner loading (1000 per page) [`faf3893`](https://git.odit.services/lfk/frontend/commit/faf3893180bb735bea6f1ea58c896686b89949fe)
- Allways set loaded to true [`52439aa`](https://git.odit.services/lfk/frontend/commit/52439aa5bc8cfb1d78d5dfce55b1a0df640ad8f5)
- Bumped lfk client [`019e14a`](https://git.odit.services/lfk/frontend/commit/019e14ab1f99906f13d36c7148d0f4b7894072f2)
- new license file version [CI SKIP] [`a6ce04c`](https://git.odit.services/lfk/frontend/commit/a6ce04c90386f16abf235cc7b2f95aeea5011c7d)
#### [0.19.0](https://git.odit.services/lfk/frontend/compare/0.18.4...0.19.0)
> 17 April 2023
- 🚀RELEASE v0.19.0 [`94a64ca`](https://git.odit.services/lfk/frontend/commit/94a64ca69078c7fe2935eeb5f955fab95a79cb85)
- Merge pull request 'feature/173-scanstation_configcodes' (#174) from feature/173-scanstation_configcodes into dev [`165c154`](https://git.odit.services/lfk/frontend/commit/165c1542338c58f2abf42fef2e7b84b40d1e2d9c)
- I18n [`e60c09e`](https://git.odit.services/lfk/frontend/commit/e60c09e19c9cc20338906e84f4db4e009d926360)
- Implemented config code generation [`4b63427`](https://git.odit.services/lfk/frontend/commit/4b6342727ee0ea38597750d8c99edc301f1ccc2d)
- Styling [`4834d14`](https://git.odit.services/lfk/frontend/commit/4834d1484c3fb6ecd4a1b56aa9fbb8125c641a62)
- Adjusted size on smaller devices [`318547d`](https://git.odit.services/lfk/frontend/commit/318547db46045e41de64d5688368e85cd6fb8035)
- Lockfile [`947d01c`](https://git.odit.services/lfk/frontend/commit/947d01cf7fc7fe2ee88c56e017b0d663f1f3b4f9)
- Barcode placeholder [`cb5fa52`](https://git.odit.services/lfk/frontend/commit/cb5fa52cd9a97490b50fb0c02c26615b49650c08)
- Added bwip-js for barcode generation [`3563394`](https://git.odit.services/lfk/frontend/commit/3563394fb33d661890327e2ae08c400830b37844)
#### [0.18.4](https://git.odit.services/lfk/frontend/compare/0.18.3...0.18.4) #### [0.18.4](https://git.odit.services/lfk/frontend/compare/0.18.3...0.18.4)
> 15 April 2023
- 🚀RELEASE v0.18.4 [`269d7a7`](https://git.odit.services/lfk/frontend/commit/269d7a7defdde059ef2bb5103262cf734e9babe9)
- Hide address2 in orgs by default [`e95f233`](https://git.odit.services/lfk/frontend/commit/e95f2333b0b958ed00c0e097b43aac2e70ad0d38) - Hide address2 in orgs by default [`e95f233`](https://git.odit.services/lfk/frontend/commit/e95f2333b0b958ed00c0e097b43aac2e70ad0d38)
#### [0.18.3](https://git.odit.services/lfk/frontend/compare/0.18.2...0.18.3) #### [0.18.3](https://git.odit.services/lfk/frontend/compare/0.18.2...0.18.3)

View File

@@ -13,7 +13,7 @@
</head> </head>
<body> <body>
<span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.18.4-RELEASE_INFO</span> <span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-1.2.0-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>
<script type="module" src="/src/main.js"></script> <script type="module" src="/src/main.js"></script>

View File

@@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-frontend", "name": "@odit/lfk-frontend",
"version": "0.18.4", "version": "1.2.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"i18n-order": "node order.js", "i18n-order": "node order.js",
@@ -39,7 +39,7 @@
} }
}, },
"dependencies": { "dependencies": {
"@odit/lfk-client-js": "0.14.3", "@odit/lfk-client-js": "1.1.0",
"@paralleldrive/cuid2": "^2.2.0", "@paralleldrive/cuid2": "^2.2.0",
"@tanstack/svelte-table": "^8.8.5", "@tanstack/svelte-table": "^8.8.5",
"bwip-js": "^3.4.0", "bwip-js": "^3.4.0",

8
pnpm-lock.yaml generated
View File

@@ -2,8 +2,8 @@ lockfileVersion: '6.0'
dependencies: dependencies:
'@odit/lfk-client-js': '@odit/lfk-client-js':
specifier: 0.14.3 specifier: 1.1.0
version: 0.14.3 version: 1.1.0
'@paralleldrive/cuid2': '@paralleldrive/cuid2':
specifier: ^2.2.0 specifier: ^2.2.0
version: 2.2.0 version: 2.2.0
@@ -510,8 +510,8 @@ packages:
'@octokit/openapi-types': 16.0.0 '@octokit/openapi-types': 16.0.0
dev: true dev: true
/@odit/lfk-client-js@0.14.3: /@odit/lfk-client-js@1.1.0:
resolution: {integrity: sha512-oOZ9jjzqcbMA0Sfwxn4q9+8hHckMU2IhAn7v0OAS54zcnquYQANnY4RMEoNIyXd0oEe1z8QewBjyBvFEDg6BmA==} resolution: {integrity: sha512-yhjsi7YMzL9/fJ7o06yszzw15iZhao3VmX0G9oqZWFwYJd1M2td3Lvm76mXNzTVlbdG6W0W3+eEjcalBdo51Pg==}
dev: false dev: false
/@odit/license-exporter@0.0.12: /@odit/license-exporter@0.0.12:

File diff suppressed because one or more lines are too long

View File

@@ -32,7 +32,7 @@
export let original_data = {}; export let original_data = {};
export let current_cards = []; export let current_cards = [];
export const addCards = (cards) => { export const addCards = (cards) => {
console.log(cards) console.log(cards);
current_cards = current_cards.concat(...cards); current_cards = current_cards.concat(...cards);
options.update((options) => ({ options.update((options) => ({
...options, ...options,
@@ -155,15 +155,27 @@
}).showToast(); }).showToast();
} }
onMount(() => { onMount(async () => {
RunnerCardService.runnerCardControllerGetAll().then((val) => { let page = 0;
current_cards = val; while (page >= 0) {
const cards = await RunnerCardService.runnerCardControllerGetAll(
page,
500
);
if (cards.length == 0) {
page = -2;
}
current_cards = current_cards.concat(...cards);
options.update((options) => ({ options.update((options) => ({
...options, ...options,
data: current_cards, data: current_cards,
})); }));
dataLoaded = true; dataLoaded = true;
}); page++;
}
console.log("All cards loaded");
}); });
</script> </script>
@@ -229,7 +241,7 @@
...options, ...options,
data: current_cards, data: current_cards,
})); }));
$table.resetRowSelection() $table.resetRowSelection();
}} }}
> >
{$_("delete-cards")} {$_("delete-cards")}
@@ -249,7 +261,10 @@
</svg> </svg>
</button> </button>
{/if} {/if}
<GenerateRunnerCards cards_show={selected.length>0} bind:generate_cards={selectedCards} /> <GenerateRunnerCards
cards_show={selected.length > 0}
bind:generate_cards={selectedCards}
/>
</div> </div>
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<table class="w-full"> <table class="w-full">

View File

@@ -35,7 +35,9 @@
<p class="text-sm">{$_("this-might-take-a-moment")}</p> <p class="text-sm">{$_("this-might-take-a-moment")}</p>
</div> </div>
{:then stats} {:then stats}
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 2xl:grid-cols-6 gap-4"> <div
class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 2xl:grid-cols-6 gap-4"
>
<StatCard <StatCard
title={$_("runners")} title={$_("runners")}
value={stats.total_runners} value={stats.total_runners}
@@ -59,18 +61,67 @@
href="/scans/" href="/scans/"
> >
<svg <svg
stroke="currentColor"
fill="currentColor" fill="currentColor"
stroke-width="2"
viewBox="0 0 24 24"
stroke-linecap="round"
stroke-linejoin="round"
size="24"
class="stroke-current text-grey-500"
height="24"
width="24" width="24"
height="24"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
><polyline points="22 12 18 12 15 21 9 3 6 12 2 12" /></svg viewBox="0 0 24 24"
><path fill="none" d="M0 0h24v24H0z" />
<path
fill="currentColor"
d="M2 4h2v16H2V4zm4 0h1v16H6V4zm2 0h2v16H8V4zm3 0h2v16h-2V4zm3 0h2v16h-2V4zm3 0h1v16h-1V4zm2 0h3v16h-3V4z"
/></svg
>
</StatCard>
<StatCard
title={$_("total-donors")}
value={stats.total_donors}
href="/donors/"
>
<svg
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="24"
height="24"
><path fill="none" d="M0 0h24v24H0z" />
<path
d="M9.33 11.5h2.17A4.5 4.5 0 0 1 16 16H8.999L9 17h8v-1a5.578 5.578 0 0 0-.886-3H19a5 5 0 0 1 4.516 2.851C21.151 18.972 17.322 21 13 21c-2.761 0-5.1-.59-7-1.625L6 10.071A6.967 6.967 0 0 1 9.33 11.5zM5 19a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v9zM18 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm-7-3a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"
/></svg
>
</StatCard>
<StatCard
title={$_("total-donation-count")}
value={stats.total_donations}
href="/donations/"
>
<svg
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="24"
height="24"
><path fill="none" d="M0 0h24v24H0z" />
<path
d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z"
/></svg
>
</StatCard>
<StatCard
title={$_("average-donation")}
value={`${(stats.average_donation / 100).toFixed(2)} €`}
href="/donations/"
>
<svg
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="24"
height="24"
><path fill="none" d="M0 0h24v24H0z" />
<path
d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z"
/></svg
> >
</StatCard> </StatCard>
<StatCard <StatCard
@@ -105,6 +156,22 @@
/></svg /></svg
> >
</StatCard> </StatCard>
<StatCard
title={$_("average-distance")}
value={`${(stats.average_distance / 1000).toFixed(2)} km`}
href="#"
>
<svg
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
height="24"
width="24"
><path d="M0 0h24v24H0z" fill="none" />
<path
d="M21 6H3c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 10H3V8h2v4h2V8h2v4h2V8h2v4h2V8h2v4h2V8h2v8z"
/></svg
>
</StatCard>
<StatCard <StatCard
title={$_("count_teams")} title={$_("count_teams")}
value={stats.total_teams} value={stats.total_teams}

View File

@@ -5,18 +5,16 @@
import Toastify from "toastify-js"; import Toastify from "toastify-js";
import DonationsEmptyState from "./DonationsEmptyState.svelte"; import DonationsEmptyState from "./DonationsEmptyState.svelte";
import AddDonationPaymentModal from "./AddDonationPaymentModal.svelte"; import AddDonationPaymentModal from "./AddDonationPaymentModal.svelte";
import { onMount } from "svelte";
$: searchvalue = ""; $: searchvalue = "";
$: active_deletes = []; $: active_deletes = [];
$: dataLoaded = false;
export let current_donations = []; export let current_donations = [];
export let payment_modal_open = false; export let payment_modal_open = false;
export let editable = {}; export let editable = {};
export let original_data = {}; export let original_data = {};
export let paid_amount_input = 0; export let paid_amount_input = 0;
const donations_promise = DonationService.donationControllerGetAll().then(
(val) => {
current_donations = val;
}
);
function should_display_based_on_id(id) { function should_display_based_on_id(id) {
if (searchvalue.toString().slice(-1) === "*") { if (searchvalue.toString().slice(-1) === "*") {
return id.toString().startsWith(searchvalue.replace("*", "")); return id.toString().startsWith(searchvalue.replace("*", ""));
@@ -26,210 +24,250 @@
function open_payment_modal(donation) { function open_payment_modal(donation) {
editable = Object.assign({}, donation); editable = Object.assign({}, donation);
original_data = Object.assign({}, donation); original_data = Object.assign({}, donation);
paid_amount_input = (donation.paidAmount/100).toFixed(2); paid_amount_input = (donation.paidAmount / 100).toFixed(2);
payment_modal_open = true; payment_modal_open = true;
} }
onMount(async () => {
let page = 0;
while (page >= 0) {
const donations = await DonationService.donationControllerGetAll(
page,
500
);
if (donations.length == 0) {
page = -2;
}
current_donations = current_donations.concat(...donations);
dataLoaded = true;
page++;
}
console.log("All donations loaded");
});
</script> </script>
<AddDonationPaymentModal bind:current_donations bind:original_data bind:editable bind:paid_amount_input bind:payment_modal_open /> <AddDonationPaymentModal
{#if store.state.jwtinfo.userdetails.permissions.includes('DONATION:GET')} bind:current_donations
{#await donations_promise} bind:original_data
bind:editable
bind:paid_amount_input
bind:payment_modal_open
/>
{#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:GET")}
{#if !dataLoaded}
<div <div
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
role="alert"> role="alert"
>
<p class="font-bold">donations are being loaded</p> <p class="font-bold">donations are being loaded</p>
<p class="text-sm">{$_('this-might-take-a-moment')}</p> <p class="text-sm">{$_("this-might-take-a-moment")}</p>
</div> </div>
{:then} {:else if current_donations.length === 0}
{#if current_donations.length === 0} <DonationsEmptyState />
<DonationsEmptyState /> {:else}
{:else} <input
<input type="search"
type="search" bind:value={searchvalue}
bind:value={searchvalue} placeholder={$_("datatable.search")}
placeholder={$_('datatable.search')} aria-label={$_("datatable.search")}
aria-label={$_('datatable.search')} class="mb-4"
class="mb-4" /> />
<div <div
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"> class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"
<table class="divide-y divide-gray-200 w-full"> >
<thead class="bg-gray-50"> <table class="divide-y divide-gray-200 w-full">
<tr> <thead class="bg-gray-50">
<th <tr>
scope="col" <th
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> scope="col"
{$_('donor')} class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
</th> >
<th {$_("donor")}
scope="col" </th>
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> <th
{$_('runner')} scope="col"
</th> class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
<th >
scope="col" {$_("runner")}
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> </th>
{$_('amount-per-kilometer')} <th
</th> scope="col"
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
scope="col" >
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> {$_("amount-per-kilometer")}
{$_('donation-amount')} </th>
</th> <th
<th scope="col"
scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> >
{$_('paid-amount')} {$_("donation-amount")}
</th> </th>
<th <th
scope="col" scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
{$_('status')} >
</th> {$_("paid-amount")}
<th scope="col" class="relative px-6 py-3"> </th>
<span class="sr-only">{$_('action')}</span> <th
</th> scope="col"
</tr> class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
</thead> >
<tbody class="divide-y divide-gray-200"> {$_("status")}
{#each current_donations as donation} </th>
{#if donation.donor.firstname <th scope="col" class="relative px-6 py-3">
<span class="sr-only">{$_("action")}</span>
</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
{#each current_donations as donation}
{#if donation.donor.firstname
.toLowerCase()
.includes(searchvalue.toLowerCase()) || donation.donor.lastname
.toLowerCase() .toLowerCase()
.includes( .includes(searchvalue.toLowerCase()) || donation.runner?.firstname
searchvalue.toLowerCase() .toLowerCase()
) || donation.donor.lastname .includes(searchvalue.toLowerCase()) || donation.runner?.lastname
.toLowerCase() .toLowerCase()
.includes( .includes(searchvalue.toLowerCase()) || should_display_based_on_id(donation.id)}
searchvalue.toLowerCase() <tr data-rowid="donation_{donation.id}">
) || donation.runner?.firstname <td class="px-6 py-4 whitespace-nowrap">
.toLowerCase() <div class="flex items-center">
.includes( <a
searchvalue.toLowerCase() href="../donors/{donation.donor.id}"
) || donation.runner?.lastname class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
.toLowerCase() >{donation.donor.firstname}
.includes( {donation.donor.middlename || ""}
searchvalue.toLowerCase() {donation.donor.lastname}</a
) || should_display_based_on_id(donation.id)} >
<tr data-rowid="donation_{donation.id}"> </div>
<td class="px-6 py-4 whitespace-nowrap"> </td>
<div class="flex items-center"> <td class="px-6 py-4 whitespace-nowrap">
{#if donation.runner}
<div class="text-sm font-medium text-gray-900">
<a <a
href="../donors/{donation.donor.id}" href="../runners/{donation.runner.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{donation.donor.firstname} class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
{donation.donor.middlename || ''} >{donation.runner.firstname}
{donation.donor.lastname}</a> {donation.runner.middlename || ""}
{donation.runner.lastname}</a
>
</div> </div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
{#if donation.runner}
<div class="text-sm font-medium text-gray-900">
<a
href="../runners/{donation.runner.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{donation.runner.firstname}
{donation.runner.middlename || ''}
{donation.runner.lastname}</a>
</div>
{:else}
<div class="text-sm font-medium text-gray-900">
{$_('fixed-donation')}
</div>
{/if}
</td>
<td class="px-6 py-4 whitespace-nowrap">
{#if donation.amountPerDistance}
<div class="text-sm font-medium text-gray-900">
{(donation.amountPerDistance / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}
</div>
{:else}
<div class="text-sm font-medium text-gray-900">
{$_('fixed-donation')}
</div>
{/if}
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900">
{(donation.amount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900">
{(donation.paidAmount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
{#if donation.status =="PAID"}
<span
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">{$_('paid')}</span>
{:else}
<span
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">{$_('open')}</span>
{/if}
</td>
{#if active_deletes[donation.id] === true}
<td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button
on:click={() => {
active_deletes[donation.id] = false;
}}
tabindex="0"
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
<button
on:click={() => {
DonationService.donationControllerRemove(donation.id, false).then(
(resp) => {
current_donations = current_donations.filter(
(obj) => obj.id !== donation.id
);
Toastify({
text: $_('donation-deleted'),
duration: 500,
backgroundColor:
'linear-gradient(to right, #00b09b, #96c93d)',
}).showToast();
}
);
}}
tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
</td>
{:else} {:else}
<td <div class="text-sm font-medium text-gray-900">
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"> {$_("fixed-donation")}
<button </div>
on:click={() => {open_payment_modal(donation);}}
class="text-[#025a21] hover:text-green-900 mr-4">{$_('enter-payment')}</button>
<a
href="./{donation.id}"
class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a>
{#if store.state.jwtinfo.userdetails.permissions.includes('DONATION:DELETE')}
<button
on:click={() => {
active_deletes[donation.id] = true;
}}
tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
{/if}
</td>
{/if} {/if}
</tr> </td>
{/if} <td class="px-6 py-4 whitespace-nowrap">
{/each} {#if donation.amountPerDistance}
</tbody> <div class="text-sm font-medium text-gray-900">
</table> {(donation.amountPerDistance / 100)
</div> .toFixed(2)
{/if} .toLocaleString("de-DE", { valute: "EUR" })}
{:catch error} </div>
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"> {:else}
<span class="inline-block align-middle mr-8"> <div class="text-sm font-medium text-gray-900">
<b class="capitalize">{$_('general_promise_error')}</b> {$_("fixed-donation")}
{error} </div>
</span> {/if}
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900">
{(donation.amount / 100)
.toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900">
{(donation.paidAmount / 100)
.toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
{#if donation.status == "PAID"}
<span
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800"
>{$_("paid")}</span
>
{:else}
<span
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800"
>{$_("open")}</span
>
{/if}
</td>
{#if active_deletes[donation.id] === true}
<td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
>
<button
on:click={() => {
active_deletes[donation.id] = false;
}}
tabindex="0"
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer"
>{$_("cancel-delete")}</button
>
<button
on:click={() => {
DonationService.donationControllerRemove(
donation.id,
false
).then((resp) => {
current_donations = current_donations.filter(
(obj) => obj.id !== donation.id
);
Toastify({
text: $_("donation-deleted"),
duration: 500,
backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
});
}}
tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
>{$_("confirm-delete")}</button
>
</td>
{:else}
<td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
>
<button
on:click={() => {
open_payment_modal(donation);
}}
class="text-[#025a21] hover:text-green-900 mr-4"
>{$_("enter-payment")}</button
>
<a
href="./{donation.id}"
class="text-indigo-600 hover:text-indigo-900"
>{$_("details")}</a
>
{#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:DELETE")}
<button
on:click={() => {
active_deletes[donation.id] = true;
}}
tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
>{$_("delete")}</button
>
{/if}
</td>
{/if}
</tr>
{/if}
{/each}
</tbody>
</table>
</div> </div>
{/await} {/if}
{/if} {/if}

View File

@@ -2,14 +2,12 @@
import { _ } from "svelte-i18n"; import { _ } from "svelte-i18n";
import { clickOutside } from "../base/outsideclick"; import { clickOutside } from "../base/outsideclick";
import { import { DonorService } from "@odit/lfk-client-js";
DonorService
} from "@odit/lfk-client-js";
import isEmail from "validator/es/lib/isEmail"; import isEmail from "validator/es/lib/isEmail";
import isMobilePhone from "validator/es/lib/isMobilePhone"; import isMobilePhone from "validator/es/lib/isMobilePhone";
import Toastify from "toastify-js"; import Toastify from "toastify-js";
import { createEventDispatcher } from "svelte";
export let modal_open; export let modal_open;
export let current_donors;
let firstname_input; let firstname_input;
let lastname_input; let lastname_input;
let middlename_input; let middlename_input;
@@ -19,6 +17,7 @@
let address_input2; let address_input2;
let address_zipcode; let address_zipcode;
let address_city; let address_city;
const dispatch = createEventDispatcher();
function focus(el) { function focus(el) {
el.focus(); el.focus();
} }
@@ -75,7 +74,7 @@
if (processed_last_submit === true) { if (processed_last_submit === true) {
processed_last_submit = false; processed_last_submit = false;
const toast = Toastify({ const toast = Toastify({
text: $_('donor-is-being-added'), text: $_("donor-is-being-added"),
duration: -1, duration: -1,
}).showToast(); }).showToast();
let address = {}; let address = {};
@@ -92,7 +91,7 @@
firstname: firstname_input_value, firstname: firstname_input_value,
lastname: lastname_input_value, lastname: lastname_input_value,
address, address,
receiptNeeded: address_checked receiptNeeded: address_checked,
}; };
if (middlename_input_value) { if (middlename_input_value) {
postdata.middlename = middlename_input_value; postdata.middlename = middlename_input_value;
@@ -112,12 +111,11 @@
modal_open = false; modal_open = false;
// //
Toastify({ Toastify({
text: $_('donor-added'), text: $_("donor-added"),
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
current_donors.push(result); dispatch("created", { donors: [result] });
current_donors = current_donors;
}) })
.catch((err) => { .catch((err) => {
// //
@@ -134,58 +132,70 @@
{#if modal_open} {#if modal_open}
<div <div
class="fixed z-10 inset-0 overflow-y-auto" class="fixed z-10 inset-0 overflow-y-auto"
use:clickOutside use:clickOutside
on:click_outside={() => { on:click_outside={() => {
modal_open = false; modal_open = false;
}}> }}
>
<div <div
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"> class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"
>
<div class="fixed inset-0 transition-opacity" aria-hidden="true"> <div class="fixed inset-0 transition-opacity" aria-hidden="true">
<div <div
class="absolute inset-0 bg-gray-500 opacity-75" class="absolute inset-0 bg-gray-500 opacity-75"
data-id="modal_backdrop" /> data-id="modal_backdrop"
/>
</div> </div>
<span <span
class="hidden sm:inline-block sm:align-middle sm:h-screen" class="hidden sm:inline-block sm:align-middle sm:h-screen"
aria-hidden="true">&#8203;</span> aria-hidden="true">&#8203;</span
>
<div <div
class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full" class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
role="dialog" role="dialog"
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"> <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start"> <div class="sm:flex sm:items-start">
<div <div
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"> class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
>
<svg <svg
class="h-6 w-6 text-blue-600" class="h-6 w-6 text-blue-600"
fill="currentColor" fill="currentColor"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
height="24"><path fill="none" d="M0 0h24v24H0z" /> height="24"
><path fill="none" d="M0 0h24v24H0z" />
<path <path
d="M9.33 11.5h2.17A4.5 4.5 0 0 1 16 16H8.999L9 17h8v-1a5.578 5.578 0 0 0-.886-3H19a5 5 0 0 1 4.516 2.851C21.151 18.972 17.322 21 13 21c-2.761 0-5.1-.59-7-1.625L6 10.071A6.967 6.967 0 0 1 9.33 11.5zM5 19a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v9zM18 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm-7-3a3 3 0 1 1 0 6 3 3 0 0 1 0-6z" /></svg> d="M9.33 11.5h2.17A4.5 4.5 0 0 1 16 16H8.999L9 17h8v-1a5.578 5.578 0 0 0-.886-3H19a5 5 0 0 1 4.516 2.851C21.151 18.972 17.322 21 13 21c-2.761 0-5.1-.59-7-1.625L6 10.071A6.967 6.967 0 0 1 9.33 11.5zM5 19a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v9zM18 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm-7-3a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"
/></svg
>
</div> </div>
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left"> <div class="mt-3 text-center sm:mt-0 sm:ml-4 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">
{$_('create-a-new-donor')} {$_("create-a-new-donor")}
</h3> </h3>
<div class="mt-2 mb-6"> <div class="mt-2 mb-6">
<p class="text-sm text-gray-500"> <p class="text-sm text-gray-500">
{$_('please-provide-the-nessecary-information-to-add-a-new-donor')} {$_(
"please-provide-the-nessecary-information-to-add-a-new-donor"
)}
</p> </p>
</div> </div>
<div class="grid grid-cols-6 gap-6"> <div class="grid grid-cols-6 gap-6">
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="firstname" for="firstname"
class="block text-sm font-medium text-gray-700">{$_('first-name')}</label> class="block text-sm font-medium text-gray-700"
>{$_("first-name")}</label
>
<input <input
use:focus use:focus
autocomplete="off" autocomplete="off"
placeholder={$_('first-name')} placeholder={$_("first-name")}
class:border-red-500={!isFirstnameValid} class:border-red-500={!isFirstnameValid}
class:focus:border-red-500={!isFirstnameValid} class:focus:border-red-500={!isFirstnameValid}
class:focus:ring-red-500={!isFirstnameValid} class:focus:ring-red-500={!isFirstnameValid}
@@ -193,34 +203,41 @@
bind:this={firstname_input} bind:this={firstname_input}
type="text" type="text"
name="firstname" name="firstname"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
{#if !isFirstnameValid} {#if !isFirstnameValid}
<span <span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"> class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
{$_('first-name-is-required')} >
{$_("first-name-is-required")}
</span> </span>
{/if} {/if}
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="trackname" for="trackname"
class="block text-sm font-medium text-gray-700">{$_('middle-name')}</label> class="block text-sm font-medium text-gray-700"
>{$_("middle-name")}</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder={$_('middle-name')} placeholder={$_("middle-name")}
bind:value={middlename_input_value} bind:value={middlename_input_value}
bind:this={middlename_input} bind:this={middlename_input}
type="text" type="text"
name="trackname" name="trackname"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="lastname" for="lastname"
class="block text-sm font-medium text-gray-700">{$_('last-name')}</label> class="block text-sm font-medium text-gray-700"
>{$_("last-name")}</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder="{$_('last-name')}" placeholder={$_("last-name")}
class:border-red-500={!isLastnameValid} class:border-red-500={!isLastnameValid}
class:focus:border-red-500={!isLastnameValid} class:focus:border-red-500={!isLastnameValid}
class:focus:ring-red-500={!isLastnameValid} class:focus:ring-red-500={!isLastnameValid}
@@ -228,21 +245,25 @@
bind:this={lastname_input} bind:this={lastname_input}
type="text" type="text"
name="lastname" name="lastname"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
{#if !isLastnameValid} {#if !isLastnameValid}
<span <span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"> class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
{$_('last-name-is-required')} >
{$_("last-name-is-required")}
</span> </span>
{/if} {/if}
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="phone" for="phone"
class="block text-sm font-medium text-gray-700">{$_('phone')}</label> class="block text-sm font-medium text-gray-700"
>{$_("phone")}</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder={$_('phone')} placeholder={$_("phone")}
class:border-red-500={!isPhoneValidOrEmpty} class:border-red-500={!isPhoneValidOrEmpty}
class:focus:border-red-500={!isPhoneValidOrEmpty} class:focus:border-red-500={!isPhoneValidOrEmpty}
class:focus:ring-red-500={!isPhoneValidOrEmpty} class:focus:ring-red-500={!isPhoneValidOrEmpty}
@@ -250,21 +271,27 @@
bind:this={phone_input} bind:this={phone_input}
type="tel" type="tel"
name="phone" name="phone"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
{#if !isPhoneValidOrEmpty} {#if !isPhoneValidOrEmpty}
<span <span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"> class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
{@html $_('the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number')} >
{@html $_(
"the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number"
)}
</span> </span>
{/if} {/if}
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="email" for="email"
class="block text-sm font-medium text-gray-700">{$_('e-mail-adress')}</label> class="block text-sm font-medium text-gray-700"
>{$_("e-mail-adress")}</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder={$_('e-mail-adress')} placeholder={$_("e-mail-adress")}
class:border-red-500={!isEmailValidOrEmpty} class:border-red-500={!isEmailValidOrEmpty}
class:focus:border-red-500={!isEmailValidOrEmpty} class:focus:border-red-500={!isEmailValidOrEmpty}
class:focus:ring-red-500={!isEmailValidOrEmpty} class:focus:ring-red-500={!isEmailValidOrEmpty}
@@ -272,11 +299,13 @@
bind:this={email_input} bind:this={email_input}
type="email" type="email"
name="email" name="email"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
{#if !isEmailValidOrEmpty} {#if !isEmailValidOrEmpty}
<span <span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"> class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
{$_('valid-email-is-required')} >
{$_("valid-email-is-required")}
</span> </span>
{/if} {/if}
</div> </div>
@@ -287,19 +316,22 @@
id="comments" id="comments"
name="comments" name="comments"
type="checkbox" type="checkbox"
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" /> class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
/>
</div> </div>
<div class="ml-3 text-sm"> <div class="ml-3 text-sm">
<label <label for="comments" class="font-medium text-gray-700"
for="comments" >{$_("receipt-needed")}</label
class="font-medium text-gray-700">{$_('receipt-needed')}</label> >
</div> </div>
</div> </div>
{#if address_checked === true} {#if address_checked === true}
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="address1" for="address1"
class="block text-sm font-medium text-gray-700">{$_('address')}</label> class="block text-sm font-medium text-gray-700"
>{$_("address")}</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder="Address" placeholder="Address"
@@ -310,34 +342,41 @@
bind:this={address_input1} bind:this={address_input1}
type="text" type="text"
name="address1" name="address1"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
{#if !isAddress1Valid} {#if !isAddress1Valid}
<span <span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"> class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
{$_('address-is-required')} >
{$_("address-is-required")}
</span> </span>
{/if} {/if}
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="address2" for="address2"
class="block text-sm font-medium text-gray-700">{$_('apartment-suite-etc')}</label> class="block text-sm font-medium text-gray-700"
>{$_("apartment-suite-etc")}</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder={$_('apartment-suite-etc')} placeholder={$_("apartment-suite-etc")}
bind:value={address_input2_value} bind:value={address_input2_value}
bind:this={address_input2} bind:this={address_input2}
type="text" type="text"
name="address2" name="address2"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="zipcode" for="zipcode"
class="block text-sm font-medium text-gray-700">{$_('zip-postal-code')}</label> class="block text-sm font-medium text-gray-700"
>{$_("zip-postal-code")}</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder={$_('zip-postal-code')} placeholder={$_("zip-postal-code")}
class:border-red-500={!iszipcodevalid} class:border-red-500={!iszipcodevalid}
class:focus:border-red-500={!iszipcodevalid} class:focus:border-red-500={!iszipcodevalid}
class:focus:ring-red-500={!iszipcodevalid} class:focus:ring-red-500={!iszipcodevalid}
@@ -345,18 +384,22 @@
bind:this={address_zipcode} bind:this={address_zipcode}
type="text" type="text"
name="zipcode" name="zipcode"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
{#if !iszipcodevalid} {#if !iszipcodevalid}
<span <span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"> class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
{$_('valid-zipcode-postal-code-is-required')} >
{$_("valid-zipcode-postal-code-is-required")}
</span> </span>
{/if} {/if}
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label <label
for="city" for="city"
class="block text-sm font-medium text-gray-700">City</label> class="block text-sm font-medium text-gray-700"
>City</label
>
<input <input
autocomplete="off" autocomplete="off"
placeholder="City" placeholder="City"
@@ -367,11 +410,13 @@
bind:this={address_city} bind:this={address_city}
type="text" type="text"
name="city" name="city"
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-gray-500 rounded-md p-2" /> 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-gray-500 rounded-md p-2"
/>
{#if !iscityvalid} {#if !iscityvalid}
<span <span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"> class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
{$_('valid-city-is-required')} >
{$_("valid-city-is-required")}
</span> </span>
{/if} {/if}
</div> </div>
@@ -386,16 +431,18 @@
class:opacity-50={!createbtnenabled} class:opacity-50={!createbtnenabled}
on:click={submit} on:click={submit}
type="button" type="button"
class="w-full inline-flex 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:ml-3 sm:w-auto sm:text-sm"> class="w-full inline-flex 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:ml-3 sm:w-auto sm:text-sm"
{$_('create')} >
{$_("create")}
</button> </button>
<button <button
on:click={() => { on:click={() => {
modal_open = false; modal_open = false;
}} }}
type="button" type="button"
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm"> class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm"
{$_('cancel')} >
{$_("cancel")}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -13,60 +13,61 @@
dispatch("cancelDelete", { id: delete_donor.id }); dispatch("cancelDelete", { id: delete_donor.id });
} }
function deleteDonor() { function deleteDonor() {
DonorService.donorControllerRemove( dispatch("delete", { id: delete_donor.id });
delete_donor.id,
true
)
.then((resp) => {
Toastify({
text: $_('donor-deleted'),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
location.replace("./");
})
.catch((err) => {});
} }
</script> </script>
{#if modal_open} {#if modal_open}
<div <div
class="fixed z-10 inset-0 overflow-y-auto" class="fixed z-10 inset-0 overflow-y-auto"
use:clickOutside use:clickOutside
on:click_outside={cancelDelete}> on:click_outside={cancelDelete}
>
<div <div
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"> class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0"
>
<div class="fixed inset-0 transition-opacity" aria-hidden="true"> <div class="fixed inset-0 transition-opacity" aria-hidden="true">
<div <div
class="absolute inset-0 bg-gray-500 opacity-75" class="absolute inset-0 bg-gray-500 opacity-75"
data-id="modal_backdrop" /> data-id="modal_backdrop"
/>
</div> </div>
<span <span
class="hidden sm:inline-block sm:align-middle sm:h-screen" class="hidden sm:inline-block sm:align-middle sm:h-screen"
aria-hidden="true">&#8203;</span> aria-hidden="true">&#8203;</span
>
<div <div
class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full" class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
role="dialog" role="dialog"
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"> <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start"> <div class="sm:flex sm:items-start">
<div <div
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"> class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
<svg class="h-6 w-6 text-blue-600" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M9.33 11.5h2.17A4.5 4.5 0 0116 16H9v1h8v-1a5.58 5.58 0 00-.89-3H19a5 5 0 014.52 2.85A13.15 13.15 0 0113 21c-2.76 0-5.1-.59-7-1.63v-9.3a6.97 6.97 0 013.33 1.43zM5 19a1 1 0 01-1 1H2a1 1 0 01-1-1v-9a1 1 0 011-1h2a1 1 0 011 1v9zM18 5a3 3 0 110 6 3 3 0 010-6zm-7-3a3 3 0 110 6 3 3 0 010-6z"/></svg> >
<svg
class="h-6 w-6 text-blue-600"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path fill="none" d="M0 0h24v24H0z" /><path
d="M9.33 11.5h2.17A4.5 4.5 0 0116 16H9v1h8v-1a5.58 5.58 0 00-.89-3H19a5 5 0 014.52 2.85A13.15 13.15 0 0113 21c-2.76 0-5.1-.59-7-1.63v-9.3a6.97 6.97 0 013.33 1.43zM5 19a1 1 0 01-1 1H2a1 1 0 01-1-1v-9a1 1 0 011-1h2a1 1 0 011 1v9zM18 5a3 3 0 110 6 3 3 0 010-6zm-7-3a3 3 0 110 6 3 3 0 010-6z"
/></svg
>
</div> </div>
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left"> <div class="mt-3 text-center sm:mt-0 sm:ml-4 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">
{$_('attention')} {$_("attention")}
</h3> </h3>
<div class="mt-2 mb-6"> <div class="mt-2 mb-6">
<p class="text-sm text-gray-500"> <p class="text-sm text-gray-500">
{$_( {$_(
'do-you-want-to-delete-this-donor-with-all-related-donations' "do-you-want-to-delete-this-donor-with-all-related-donations"
)} )}
<br /> <br />
{$_('all-associated-donations-will-get-deleted-as-well')} {$_("all-associated-donations-will-get-deleted-as-well")}
</p> </p>
</div> </div>
</div> </div>
@@ -76,14 +77,16 @@
<button <button
on:click={deleteDonor} on:click={deleteDonor}
type="button" type="button"
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm"> class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm"
{$_('confirm-delete-donor-with-all-donations')} >
{$_("confirm-delete-donor-with-all-donations")}
</button> </button>
<button <button
on:click={cancelDelete} on:click={cancelDelete}
type="button" type="button"
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm"> class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm"
{$_('cancel-keep-donor')} >
{$_("cancel-keep-donor")}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,14 @@
<script>
import { _ } from "svelte-i18n";
export let address;
</script>
{#if !address || !address.address1}
{$_("no-address")}
{:else}
{address.address1}<br />
<!-- {address.address2 || ''}<br /> -->
{address.postalcode}
{address.city}
{address.country}
{/if}

View File

@@ -0,0 +1,29 @@
<script>
import { _ } from "svelte-i18n";
export let donations;
</script>
{#if !donations || donations.length == 0}
{$_('donor-has-no-associated-donations')}
{:else}
{#each donations as donation}
{#if donation.responseType === "DISTANCEDONATION"}
<a
href="../donations/{donation.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-600 text-white mr-1"
>{donation.runner.firstname}
{donation.runner.middlename || ""}
{donation.runner.lastname}</a
>
{:else}
<a
href="../donations/{d.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-700 text-white mr-1"
>{$_("fixed-donation")}:
{(d.amount / 100)
.toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}</a
>
{/if}
{/each}
{/if}

View File

@@ -5,50 +5,73 @@
import DonorsOverview from "./DonorsOverview.svelte"; import DonorsOverview from "./DonorsOverview.svelte";
$: current_donors = []; $: current_donors = [];
export let modal_open = false; export let modal_open = false;
let addDonors;
</script> </script>
<section class="container p-5"> <section class="container p-5">
<span class="mb-1 text-3xl font-extrabold leading-tight"> <span class="mb-1 text-3xl font-extrabold leading-tight">
{$_('donors')} {$_("donors")}
{#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:CREATE')} {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:CREATE")}
<button <button
on:click={() => { on:click={() => {
modal_open = true; modal_open = true;
}} }}
type="button" type="button"
class="w-full inline-flex 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:ml-3 sm:w-auto sm:text-sm"> class="w-full inline-flex 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:ml-3 sm:w-auto sm:text-sm"
{$_('add-donor')} >
{$_("add-donor")}
</button> </button>
{/if} {/if}
{#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:GET')} {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")}
<button <button
on:click={() => { on:click={() => {
const data = (current_donors.filter(d=>d.receiptNeeded===true)).map(function (d) { const data = current_donors
d.address.address2=d.address.address2===""?"":" "+d.address.address2; .filter((d) => d.receiptNeeded === true)
const address=`${d.address.address1}${d.address.address2}, ${d.address.postalcode} ${d.address.city}, ${d.address.country}`; .map(function (d) {
return [d.firstname,d.middlename,d.lastname,d.paidDonationAmount,address]; d.address.address2 =
}) d.address.address2 === "" ? "" : " " + d.address.address2;
let csv = `${$_('csv_import__firstname')};${$_('csv_import__middlename')};${$_('csv_import__lastname')};${$_('total_donation_amount_in_eur')};${$_('address')}\n`; const address = `${d.address.address1}${d.address.address2}, ${d.address.postalcode} ${d.address.city}, ${d.address.country}`;
data.forEach(function(row) { return [
csv += row.join(';'); d.firstname,
d.middlename,
d.lastname,
d.paidDonationAmount,
address,
];
});
let csv = `${$_("csv_import__firstname")};${$_(
"csv_import__middlename"
)};${$_("csv_import__lastname")};${$_(
"total_donation_amount_in_eur"
)};${$_("address")}\n`;
data.forEach(function (row) {
csv += row.join(";");
csv += "\n"; csv += "\n";
}); });
let hiddenElement = document.createElement('a'); let hiddenElement = document.createElement("a");
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv); hiddenElement.href = "data:text/csv;charset=utf-8," + encodeURI(csv);
hiddenElement.target = '_blank'; hiddenElement.target = "_blank";
hiddenElement.download = `${$_('filename_sponsoringquittungsliste')}.csv`; hiddenElement.download = `${$_(
hiddenElement.click(); "filename_sponsoringquittungsliste"
hiddenElement.remove(); )}.csv`;
hiddenElement.click();
hiddenElement.remove();
}} }}
type="button" type="button"
class="w-full inline-flex 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:ml-3 sm:w-auto sm:text-sm"> class="w-full inline-flex 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:ml-3 sm:w-auto sm:text-sm"
{$_('sponsoring-quittungs-liste_herunterladen')} >
{$_("sponsoring-quittungs-liste_herunterladen")}
</button> </button>
{/if} {/if}
</span> </span>
<DonorsOverview bind:current_donors /> <DonorsOverview bind:current_donors bind:addDonors />
</section> </section>
{#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:CREATE')} {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:CREATE")}
<AddDonorModal bind:current_donors bind:modal_open /> <AddDonorModal
on:created={(event) => {
addDonors(event.detail.donors);
}}
bind:modal_open
/>
{/if} {/if}

View File

@@ -5,214 +5,262 @@
import DonorsEmptyState from "./DonorsEmptyState.svelte"; import DonorsEmptyState from "./DonorsEmptyState.svelte";
import ConfirmDonorDeletion from "./ConfirmDonorDeletion.svelte"; import ConfirmDonorDeletion from "./ConfirmDonorDeletion.svelte";
import Toastify from "toastify-js"; import Toastify from "toastify-js";
import TableBottom from "../shared/TableBottom.svelte";
import {
createSvelteTable,
flexRender,
getCoreRowModel,
getFilteredRowModel,
getPaginationRowModel,
getSortedRowModel,
renderComponent,
} from "@tanstack/svelte-table";
import { writable } from "svelte/store";
import { onMount } from "svelte";
import InputElement from "../shared/InputElement.svelte";
import TableHeader from "../shared/TableHeader.svelte";
import TableActions from "../shared/TableActions.svelte";
import DonorAddress from "./DonorAddress.svelte";
import DonorDonations from "./DonorDonations.svelte";
$: searchvalue = ""; $: searchvalue = "";
$: active_deletes = []; $: active_deletes = [];
$: current_donations = []; $: current_donations = [];
$: selectedDonors =
$table?.getSelectedRowModel().rows.map((row) => row.original) || [];
$: selected =
$table?.getSelectedRowModel().rows.map((row) => row.index) || [];
$: dataLoaded = false;
let modal_open = false; let modal_open = false;
let delete_donor = {}; let delete_donor = {};
export let current_donors = []; export let current_donors = [];
const donors_promise = DonorService.donorControllerGetAll().then((val) => { export const addDonors = (donors) => {
current_donors = val; current_donors = current_donors.concat(...donors);
options.update((options) => ({
...options,
data: current_donors,
}));
};
//Section table
const columns = [
{
accessorKey: "id",
header: () => "id",
filterFn: `equalsString`,
},
{
accessorKey: "name",
header: () => $_("name"),
cell: (info) => {
const d = info.row.original;
if (d.middlename) {
return `${d.firstname} ${d.middlename} ${d.lastname}`;
} else {
return `${d.firstname} ${d.lastname}`;
}
},
filterFn: `includesString`,
},
{
accessorKey: "address",
header: () => $_("contact-information"),
cell: (info) => {
return renderComponent(DonorAddress, { address: info.getValue() });
},
filterFn: `includesString`,
},
{
accessorKey: "sponsorings",
header: () => $_("sponsorings"),
cell: (info) => {
const donations = current_donations.filter(
(d) => d?.donor?.id == info.row.original.id
);
return renderComponent(DonorDonations, { donations });
},
enableColumnFilter: false,
},
{
accessorKey: "donationAmount",
header: () => $_("total-donation-amount"),
cell: (info) => {
return `${(info.getValue() / 100)
.toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}€`;
},
enableColumnFilter: false,
},
{
accessorKey: "paidDonationAmount",
header: () => $_("total-paid-amount"),
cell: (info) => {
return `${(info.getValue() / 100)
.toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}€`;
},
enableColumnFilter: false,
},
{
accessorKey: "actions",
header: () => $_("action"),
cell: (info) => {
return renderComponent(TableActions, {
detailsLink: `./${info.row.original.id}`,
deleteAction: () => {
active_deletes = current_donors.filter(
(r) => r.id == info.row.original.id
);
},
deleteEnabled:
store.state.jwtinfo.userdetails.permissions.includes(
"DONOR:DELETE"
),
});
},
enableColumnFilter: false,
enableSorting: false,
},
];
const options = writable({
data: [],
columns: columns,
initialState: {
pagination: {
pageSize: 50,
},
},
enableRowSelection: true,
getCoreRowModel: getCoreRowModel(),
getFilteredRowModel: getFilteredRowModel(),
getPaginationRowModel: getPaginationRowModel(),
getSortedRowModel: getSortedRowModel(),
}); });
const donation_promise = DonationService.donationControllerGetAll().then( const table = createSvelteTable(options);
(val) => {
current_donations = val;
}
);
function should_display_based_on_id(id) { function should_display_based_on_id(id) {
if (searchvalue.toString().slice(-1) === "*") { if (searchvalue.toString().slice(-1) === "*") {
return id.toString().startsWith(searchvalue.replace("*", "")); return id.toString().startsWith(searchvalue.replace("*", ""));
} }
return id.toString() === searchvalue; return id.toString() === searchvalue;
} }
onMount(async () => {
let page = 0;
while (page >= 0) {
const donors = await DonorService.donorControllerGetAll(page, 500);
const donations = await DonationService.donationControllerGetAll(
page,
500
);
if (donors.length == 0 && donations.length == 0) {
page = -2;
}
current_donors = current_donors.concat(...donors);
current_donations = current_donations.concat(...donors);
options.update((options) => ({
...options,
data: current_donors,
}));
dataLoaded = true;
page++;
}
console.log("All donors loaded");
});
</script> </script>
<ConfirmDonorDeletion <ConfirmDonorDeletion
on:cancelDelete={(event) => { on:cancelDelete={(event) => {
modal_open = false; active_deletes = active_deletes.filter((a) => a.id !== event.detail.id);
active_deletes[event.detail.id] = false;
}} }}
bind:modal_open on:delete={async (event) => {
bind:delete_donor /> await DonorService.donorControllerRemove(event.detail.id, true);
{#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:GET')} Toastify({
{#await donors_promise && donation_promise} text: $_("donor-deleted"),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
current_donors = current_donors.filter((d) => d.id !== event.detail.id);
active_deletes = active_deletes.filter((a) => a.id !== event.detail.id);
options.update((options) => ({
...options,
data: current_donors,
}));
}}
modal_open={active_deletes.length > 0}
delete_donor={active_deletes[0]}
/>
{active_deletes.length}
{#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")}
{#if !dataLoaded}
<div <div
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
role="alert"> role="alert"
<p class="font-bold">{$_('donors-are-being-loaded')}</p> >
<p class="text-sm">{$_('this-might-take-a-moment')}</p> <p class="font-bold">{$_("donors-are-being-loaded")}</p>
<p class="text-sm">{$_("this-might-take-a-moment")}</p>
</div> </div>
{:then} {:else if current_donors.length === 0}
{#if current_donors.length === 0} <DonorsEmptyState />
<DonorsEmptyState /> {:else}
{:else} <input
<input type="search"
type="search" bind:value={searchvalue}
bind:value={searchvalue} placeholder={$_("datatable.search")}
placeholder={$_('datatable.search')} aria-label={$_("datatable.search")}
aria-label={$_('datatable.search')} class="mb-4"
class="mb-4" /> />
<div <div
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"> class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"
<table class="divide-y divide-gray-200 w-full"> >
<thead class="bg-gray-50"> <table class="w-full">
<tr> <thead>
<th {#each $table.getHeaderGroups() as headerGroup}
scope="col" <tr class="select-none">
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> <th class="inset-y-0 left-0 px-4 py-2 text-left w-px">
{$_('name')} <InputElement
</th> type="checkbox"
<th checked={$table.getIsAllRowsSelected()}
scope="col" indeterminate={$table.getIsSomeRowsSelected()}
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> on:change={() => $table.toggleAllRowsSelected()}
{$_('contact-information')} />
</th>
<th
scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
{$_('donations')}
</th>
<th
scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
{$_('total-donation-amount')}
</th>
<th
scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
{$_('total-paid-amount')}
</th>
<th scope="col" class="relative px-6 py-3">
<span class="sr-only">{$_('action')}</span>
</th> </th>
{#each headerGroup.headers as header}
<TableHeader {header} />
{/each}
</tr> </tr>
</thead> {/each}
<tbody class="divide-y divide-gray-200"> </thead>
{#each current_donors as donor} <tbody>
{#if donor.firstname {#each $table.getRowModel().rows as row}
.toLowerCase() <tr>
.includes( <td class="inset-y-0 left-0 px-4 py-2 text-center w-px">
searchvalue.toLowerCase() <InputElement
) || donor.lastname type="checkbox"
.toLowerCase() checked={row.getIsSelected()}
.includes( on:change={() => row.toggleSelected()}
searchvalue.toLowerCase() />
) || should_display_based_on_id(donor.id)} </td>
<tr data-rowid="donor_{donor.id}"> {#each row.getVisibleCells() as cell}
<td class="px-6 py-4 whitespace-nowrap"> <td>
<div class="flex items-center"> <svelte:component
<div class="ml-4"> this={flexRender(
<div class="text-sm font-medium text-gray-900"> cell.column.columnDef.cell,
{donor.firstname} cell.getContext()
{donor.middlename || ''} )}
{donor.lastname} />
</div> </td>
</div> {/each}
</div> </tr>
</td> {/each}
<td class="px-6 py-4 whitespace-nowrap"> </tbody>
{#if donor.email} </table>
<div class="text-sm text-gray-500">{donor.email}</div>
{/if}
{#if donor.phone}
<div class="text-sm text-gray-500">{donor.phone}</div>
{/if}
{#if donor.address.address1 !== null}
{donor.address.address1}<br />
<!-- {donor.address.address2 || ''}<br /> -->
{donor.address.postalcode}
{donor.address.city}
{donor.address.country}
{/if}
</td>
<td class="px-6 py-4 whitespace-nowrap">
{#if current_donations.filter((d) => d.donor.id == donor.id).length > 0}
{#each current_donations.filter((o) => o.donor.id == donor.id) as d}
{#if d.responseType === 'DISTANCEDONATION'}
<a
href="../donations/{d.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-600 text-white mr-1">{d.runner.firstname}
{d.runner.middlename || ''}
{d.runner.lastname}</a>
{:else}
<a
href="../donations/{d.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-700 text-white mr-1">{$_('fixed-donation')}:
{(d.amount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}</a>
{/if}
{/each}
{:else}{$_('donor-has-no-associated-donations')}{/if}
</td>
<td class="px-6 py-4 whitespace-nowrap">
{(donor.donationAmount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}
</td>
<td class="px-6 py-4 whitespace-nowrap">
{(donor.paidDonationAmount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}
</td>
{#if active_deletes[donor.id] === true}
<td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button
on:click={() => {
active_deletes[donor.id] = false;
}}
tabindex="0"
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
<button
on:click={() => {
DonorService.donorControllerRemove(donor.id, false)
.then((resp) => {
current_donors = current_donors.filter((obj) => obj.id !== donor.id);
Toastify({
text: 'Donor deleted',
duration: 500,
backgroundColor:
'linear-gradient(to right, #00b09b, #96c93d)',
}).showToast();
})
.catch((err) => {
modal_open = true;
delete_donor = donor;
});
}}
tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
</td>
{:else}
<td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<a
href="./{donor.id}"
class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a>
{#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:DELETE')}
<button
on:click={() => {
active_deletes[donor.id] = true;
}}
tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
{/if}
</td>
{/if}
</tr>
{/if}
{/each}
</tbody>
</table>
</div>
{/if}
{:catch error}
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
<span class="inline-block align-middle mr-8">
<b class="capitalize">{$_('general_promise_error')}</b>
{error}
</span>
</div> </div>
{/await} <div class="h-2" />
<TableBottom {table} {selected} />
{/if}
{/if} {/if}

View File

@@ -50,7 +50,6 @@
})); }));
}; };
//Section table //Section table
const columns = [ const columns = [
{ {
@@ -157,16 +156,7 @@
}).showToast(); }).showToast();
} }
onMount(() => { onMount(async () => {
RunnerService.runnerControllerGetAll().then((val) => {
current_runners = val;
dataLoaded = true;
options.update((options) => ({
...options,
data: current_runners,
}));
});
RunnerTeamService.runnerTeamControllerGetAll().then((val) => { RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
teams = val; teams = val;
}); });
@@ -175,6 +165,24 @@
orgs = val; orgs = val;
} }
); );
let page = 0;
while (page >= 0) {
const runners = await RunnerService.runnerControllerGetAll(page, 1000);
if (runners.length == 0) {
page = -2;
}
current_runners = current_runners.concat(...runners);
options.update((options) => ({
...options,
data: current_runners,
}));
dataLoaded = true;
page++;
}
console.log("All runners loaded");
}); });
</script> </script>

View File

@@ -30,6 +30,7 @@
$table?.getSelectedRowModel().rows.map((row) => row.index) || []; $table?.getSelectedRowModel().rows.map((row) => row.index) || [];
$: active_delete = undefined; $: active_delete = undefined;
$: dataLoaded = false;
export let current_scans = []; export let current_scans = [];
export const addScans = (scans) => { export const addScans = (scans) => {
current_scans = current_scans.concat(...scans); current_scans = current_scans.concat(...scans);
@@ -39,15 +40,6 @@
})); }));
}; };
const scans_promise = ScanService.scanControllerGetAll().then((val) => {
current_scans = val;
// handler.setRows(val);
current_scans = val;
options.update((options) => ({
...options,
data: current_scans,
}));
});
let allTracks = []; let allTracks = [];
TrackService.trackControllerGetAll().then((val) => { TrackService.trackControllerGetAll().then((val) => {
allTracks = val; allTracks = val;
@@ -99,7 +91,7 @@
accessorKey: "timestamp", accessorKey: "timestamp",
header: () => $_("timestamp"), header: () => $_("timestamp"),
cell: (info) => { cell: (info) => {
return (new Date(parseInt(info.getValue())*1000)).toLocaleString() return new Date(parseInt(info.getValue()) * 1000).toLocaleString();
}, },
enableColumnFilter: false, enableColumnFilter: false,
}, },
@@ -183,6 +175,26 @@
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
} }
onMount(async () => {
let page = 0;
while (page >= 0) {
const scans = await ScanService.scanControllerGetAll(page, 500);
if (scans.length == 0) {
page = -2;
}
current_scans = current_scans.concat(...scans);
options.update((options) => ({
...options,
data: current_scans,
}));
dataLoaded = true;
page++;
}
console.log("All scans loaded");
});
</script> </script>
<DeleteScanModal <DeleteScanModal
@@ -193,7 +205,7 @@
}} }}
/> />
{#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")} {#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")}
{#await scans_promise} {#if !dataLoaded}
<div <div
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
role="alert" role="alert"
@@ -201,105 +213,96 @@
<p class="font-bold">{$_("scans-are-being-loaded")}</p> <p class="font-bold">{$_("scans-are-being-loaded")}</p>
<p class="text-sm">{$_("this-might-take-a-moment")}</p> <p class="text-sm">{$_("this-might-take-a-moment")}</p>
</div> </div>
{:then} {:else if current_scans.length === 0}
{#if current_scans.length === 0} <ScansEmptyState />
<ScansEmptyState /> {:else}
{:else} {#if selected.length > 0}
{#if selected.length > 0} <button
<button type="button"
type="button" class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm inline-flex"
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm inline-flex" id="options-menu"
id="options-menu" on:click={async () => {
on:click={async () => { const prom = [];
const prom = []; for (const scan of selectedScans) {
for (const scan of selectedScans) { prom.push(ScanService.scanControllerRemove(scan.id, true));
prom.push(ScanService.scanControllerRemove(scan.id, true)); }
} await Promise.all(prom);
await Promise.all(prom); for (const scan of selectedScans) {
for (const scan of selectedScans) { current_scans = current_scans.filter((r) => r.id !== scan.id);
current_scans = current_scans.filter((r) => r.id !== scan.id); }
} options.update((options) => ({
options.update((options) => ({ ...options,
...options, data: current_scans,
data: current_scans, }));
})); $table.resetRowSelection();
$table.resetRowSelection(); Toastify({
Toastify({ text: $_("scan-deleted"),
text: $_("scan-deleted"), duration: 3500,
duration: 3500, backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", }).showToast();
}).showToast(); }}
}} >
{$_("delete-scans")}
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-5 h-5"
> >
{$_("delete-scans")} <path
<svg stroke-linecap="round"
xmlns="http://www.w3.org/2000/svg" stroke-linejoin="round"
fill="none" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
viewBox="0 0 24 24" />
stroke-width="1.5" </svg>
stroke="currentColor" </button>
class="w-5 h-5" {/if}
> <div class="overflow-x-auto">
<path <table class="w-full">
stroke-linecap="round" <thead>
stroke-linejoin="round" {#each $table.getHeaderGroups() as headerGroup}
d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" <tr class="select-none">
/> <th class="inset-y-0 left-0 px-4 py-2 text-left w-px">
</svg> <InputElement
</button> type="checkbox"
{/if} checked={$table.getIsAllRowsSelected()}
<div class="overflow-x-auto"> indeterminate={$table.getIsSomeRowsSelected()}
<table class="w-full"> on:change={() => $table.toggleAllRowsSelected()}
<thead> />
{#each $table.getHeaderGroups() as headerGroup} </th>
<tr class="select-none"> {#each headerGroup.headers as header}
<th class="inset-y-0 left-0 px-4 py-2 text-left w-px"> <TableHeader {header} />
<InputElement {/each}
type="checkbox" </tr>
checked={$table.getIsAllRowsSelected()} {/each}
indeterminate={$table.getIsSomeRowsSelected()} </thead>
on:change={() => $table.toggleAllRowsSelected()} <tbody>
/> {#each $table.getRowModel().rows as row}
</th> <tr>
{#each headerGroup.headers as header} <td class="inset-y-0 left-0 px-4 py-2 text-center w-px">
<TableHeader {header} /> <InputElement
{/each} type="checkbox"
</tr> checked={row.getIsSelected()}
{/each} on:change={() => row.toggleSelected()}
</thead> />
<tbody> </td>
{#each $table.getRowModel().rows as row} {#each row.getVisibleCells() as cell}
<tr> <td>
<td class="inset-y-0 left-0 px-4 py-2 text-center w-px"> <svelte:component
<InputElement this={flexRender(
type="checkbox" cell.column.columnDef.cell,
checked={row.getIsSelected()} cell.getContext()
on:change={() => row.toggleSelected()} )}
/> />
</td> </td>
{#each row.getVisibleCells() as cell} {/each}
<td> </tr>
<svelte:component {/each}
this={flexRender( </tbody>
cell.column.columnDef.cell, </table>
cell.getContext()
)}
/>
</td>
{/each}
</tr>
{/each}
</tbody>
</table>
</div>
<TableBottom {table} {selected} />
{/if}
{:catch error}
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
<span class="inline-block align-middle mr-8">
<b class="capitalize">{$_("general_promise_error")}</b>
{error}
</span>
</div> </div>
{/await} <TableBottom {table} {selected} />
{/if}
{/if} {/if}

View File

@@ -53,7 +53,7 @@
let codeconfig = { let codeconfig = {
bcid, bcid,
text: `${text}`, text: `${text}`,
scale: 3, scale: 4,
includetext: true, includetext: true,
textxalign: "center", textxalign: "center",
backgroundcolor: "ffffff", backgroundcolor: "ffffff",
@@ -178,13 +178,17 @@
{$_("api-endpoint")} {$_("api-endpoint")}
</h3> </h3>
<img <img
class="w-full md:w-auto mb-2 mx-auto" class:w-[50%]={is_qrcode}
class:w-full={!is_qrcode}
class="md:w-auto mb-2 mx-auto"
alt="Registrierungscode" alt="Registrierungscode"
src={textToBase64Barcode(config.baseurl, is_qrcode)} src={textToBase64Barcode(config.baseurl, is_qrcode)}
/> />
<h3 class="leading-6 font-medium text-gray-900">{$_("token")}</h3> <h3 class="leading-6 font-medium text-gray-900">{$_("token")}</h3>
<img <img
class="w-full md:w-auto mb-2 mx-auto" class:w-[50%]={is_qrcode}
class:w-full={!is_qrcode}
class="md:w-auto mb-2 mx-auto"
alt="Registrierungscode" alt="Registrierungscode"
src={barcode} src={barcode}
/> />

View File

@@ -1,493 +1,498 @@
{ {
"404message": "Die gesuchte Seite wurde leider nicht gefunden.", "404message": "Die gesuchte Seite wurde leider nicht gefunden.",
"404title": "Fehler 404", "404title": "Fehler 404",
"about": "Über", "about": "Über",
"action": "Aktionen", "action": "Aktionen",
"active": "Aktiv", "active": "Aktiv",
"add-card": "Karte erstellen", "add-card": "Karte erstellen",
"add-donation": "Sponsoring erstellen", "add-donation": "Sponsoring erstellen",
"add-donor": "Sponsor:in erstellen", "add-donor": "Sponsor:in erstellen",
"add-or-update-a-payment": "Zahlung hinzufügen oder bearbeiten", "add-or-update-a-payment": "Zahlung hinzufügen oder bearbeiten",
"add-scan": "Scan erstellen", "add-scan": "Scan erstellen",
"add-the-first-scanstation": "Erstelle deine erste Scannerstation.", "add-the-first-scanstation": "Erstelle deine erste Scannerstation.",
"add-the-first-statsclient": "Erstelle deinen ersten Statsclient.", "add-the-first-statsclient": "Erstelle deinen ersten Statsclient.",
"add-user-group": "Neue Gruppe erstellen", "add-user-group": "Neue Gruppe erstellen",
"add-your-first-card": "Erstelle deine erste Läuferkarte", "add-your-first-card": "Erstelle deine erste Läuferkarte",
"add-your-first-contact": "Erstelle den ersten Kontakt", "add-your-first-contact": "Erstelle den ersten Kontakt",
"add-your-first-donor": "Erstelle die erste Sponsor:in", "add-your-first-donor": "Erstelle die erste Sponsor:in",
"add-your-first-group": "Erstelle die erste Gruppe", "add-your-first-group": "Erstelle die erste Gruppe",
"add-your-first-organization": "Erstelle die erste Organisation", "add-your-first-organization": "Erstelle die erste Organisation",
"add-your-first-runner": "Erstelle die erste Läufer:in", "add-your-first-runner": "Erstelle die erste Läufer:in",
"add-your-first-team": "Erstelle das erste Team", "add-your-first-team": "Erstelle das erste Team",
"add-your-first-track": "Erstelle den ersten Track (Laufstrecke).", "add-your-first-track": "Erstelle den ersten Track (Laufstrecke).",
"add-your-first-user": "Erstelle die erste Benutzer:in", "add-your-first-user": "Erstelle die erste Benutzer:in",
"add-your-fist-donation": "Erstelle dein erstes Sponsoring", "add-your-fist-donation": "Erstelle dein erstes Sponsoring",
"add-your-fist-scan": "Füge deinen ersten Scan hinzu", "add-your-fist-scan": "Füge deinen ersten Scan hinzu",
"adding-card": "Karte wird erstellt", "adding-card": "Karte wird erstellt",
"adding-donation": "Sponsoring wird erstellt...", "adding-donation": "Sponsoring wird erstellt...",
"adding-scan": "Scan wird hinzugefügt", "adding-scan": "Scan wird hinzugefügt",
"address": "Adresse", "address": "Adresse",
"address-is-required": "Du musst eine Adresse angeben", "address-is-required": "Du musst eine Adresse angeben",
"after-deletion-we-cant-restore-your-old-profile": "Nach der Löschung können auch die Admins dein Profil nicht wiederherstellen!", "after-deletion-we-cant-restore-your-old-profile": "Nach der Löschung können auch die Admins dein Profil nicht wiederherstellen!",
"after-the-update-youll-get-logged-out-please-login-with-your-new-password-after-that": "Nach der Änderung wirst du abgemeldet - bitte melde dich dann mit deinem neuen Passwort an.", "after-the-update-youll-get-logged-out-please-login-with-your-new-password-after-that": "Nach der Änderung wirst du abgemeldet - bitte melde dich dann mit deinem neuen Passwort an.",
"all": "Alle", "all": "Alle",
"all-associated-donations-will-get-deleted-as-well": "Alle Sponsorings dieser Sponsor:in werden ebenfalls gelöscht", "all-associated-donations-will-get-deleted-as-well": "Alle Sponsorings dieser Sponsor:in werden ebenfalls gelöscht",
"all-associated-runners-will-be-deleted-too": "Alle zugehörigen Läufer:innen werden auch gelöscht!", "all-associated-runners-will-be-deleted-too": "Alle zugehörigen Läufer:innen werden auch gelöscht!",
"all-associated-scans-will-get-deleted-as-well": "Alle Scans dieser Station werden ebenfalls gelöscht", "all-associated-scans-will-get-deleted-as-well": "Alle Scans dieser Station werden ebenfalls gelöscht",
"all-associated-teams-and-runners-will-be-deleted-too": "Alle assoziierten Teams und Läufer:innen werden auch gelöscht!", "all-associated-teams-and-runners-will-be-deleted-too": "Alle assoziierten Teams und Läufer:innen werden auch gelöscht!",
"already-paid": "Bereits bezahlt", "already-paid": "Bereits bezahlt",
"amount": "Anzahl", "amount": "Anzahl",
"amount-per-kilometer": "Betrag pro Kilometer", "amount-per-kilometer": "Betrag pro Kilometer",
"apartment-suite-etc": "Apartment, Wohnung, etc.", "apartment-suite-etc": "Apartment, Wohnung, etc.",
"application_name": "Lauf für Kaya! - Admin", "api-endpoint": "API-Endpunkt",
"applying-changes": "Änderungen anwenden", "application_name": "Lauf für Kaya! - Admin",
"attention": "Achtung!", "applying-changes": "Änderungen anwenden",
"author": "Autor:in", "attention": "Achtung!",
"bitte-bestaetige-diese-laeufer-fuer-den-import": "Bitte die Läufer:innen für den Import bestätigen.", "author": "Autor:in",
"by": "von", "average-distance": "Durchschnittliche Strecke/Läufer:in",
"cancel": "Abbrechen", "average-donation": "Durchschnittliches Sponsoring",
"cancel-delete": "Löschen abbrechen", "bitte-bestaetige-diese-laeufer-fuer-den-import": "Bitte die Läufer:innen für den Import bestätigen.",
"cancel-keep-donor": "Abbrechen, Sponsor:in behalten", "by": "von",
"cancel-keep-my-profile": "Abbrechen, mein Profil behalten", "cancel": "Abbrechen",
"cancel-keep-organization": "Abbrechen und Organisation bearbeiten", "cancel-delete": "Löschen abbrechen",
"cancel-keep-station": "Abbrechen und Station behalten", "cancel-keep-donor": "Abbrechen, Sponsor:in behalten",
"cancel-keep-statsclient": "Abbrechen und Statsclient behalten", "cancel-keep-my-profile": "Abbrechen, mein Profil behalten",
"cancel-keep-team": "Abbrechen, Team behalten", "cancel-keep-organization": "Abbrechen und Organisation bearbeiten",
"cannot-reset-your-password-directly": "Schade. \nWir können das Passwort leider nicht direkt zurücksetzen.\nBitte sende uns eine Mail in der du deine Identität bestätigst.", "cancel-keep-station": "Abbrechen und Station behalten",
"card": "Läuferkarte", "cancel-keep-statsclient": "Abbrechen und Statsclient behalten",
"card-added": "Karte wurde hinzugefügt", "cancel-keep-team": "Abbrechen, Team behalten",
"card-deleted": "Karte gelöscht", "cannot-reset-your-password-directly": "Schade. \nWir können das Passwort leider nicht direkt zurücksetzen.\nBitte sende uns eine Mail in der du deine Identität bestätigst.",
"card-updated": "Karte aktualisiert", "card": "Läuferkarte",
"cards": "Läuferkarten", "card-added": "Karte wurde hinzugefügt",
"cards-deleted": "Karten gelöscht", "card-deleted": "Karte gelöscht",
"certificates": "Urkunden", "card-updated": "Karte aktualisiert",
"change-your-password-here": "Hier kannst du dein Passwort ändern", "cards": "Läuferkarten",
"changing-your-password": "Passwort wird geändert", "cards-deleted": "Karten gelöscht",
"city": "Stadt", "certificates": "Urkunden",
"click-to-copy-the-link-into-your-clipboard": "Klicke auf den Link, um ihn in deine Zwischenablage zu kopieren", "change-your-password-here": "Hier kannst du dein Passwort ändern",
"click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren", "changing-your-password": "Passwort wird geändert",
"close": "Schließen", "city": "Stadt",
"code": "Code", "click-to-copy-the-link-into-your-clipboard": "Klicke auf den Link, um ihn in deine Zwischenablage zu kopieren",
"configure-the-tracks-and-minimum-lap-times": "Bearbeite die Tracks und ihre minimale Rundenzeit", "click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren",
"confirm": "Bestätigen", "close": "Schließen",
"confirm-delete": "Löschung Bestätigen", "code": "Code",
"confirm-delete-donor-with-all-donations": "Bestätigen, Sponsor:in mit allen Sponsorings löschen", "config-codes": "Konfigurations-Codes",
"confirm-delete-my-user-profile": "Bestätigung, mein Benutzerprofil löschen", "configure-the-tracks-and-minimum-lap-times": "Bearbeite die Tracks und ihre minimale Rundenzeit",
"confirm-delete-organization-and-associated-teams-runners": "Bestätugung, lösche die Organisation und alle zugehörigen Teams und Läufer:innen.", "confirm": "Bestätigen",
"confirm-delete-station-with-all-scans": "Löschen der Scannerstation mit allen Scans bestätigen", "confirm-delete": "Löschung Bestätigen",
"confirm-delete-statsclient": "Bestätigung, Statsclient löschen", "confirm-delete-donor-with-all-donations": "Bestätigen, Sponsor:in mit allen Sponsorings löschen",
"confirm-delete-team-and-associated-runners": "Bestätigung, lösche das Team mitsamt seinen Läufer:innen.", "confirm-delete-my-user-profile": "Bestätigung, mein Benutzerprofil löschen",
"confirm-deletion": "Löschung Bestätigen", "confirm-delete-organization-and-associated-teams-runners": "Bestätugung, lösche die Organisation und alle zugehörigen Teams und Läufer:innen.",
"confirm-the-new-password": "Neues Passwort bestätigen", "confirm-delete-station-with-all-scans": "Löschen der Scannerstation mit allen Scans bestätigen",
"contact": "Kontakt", "confirm-delete-statsclient": "Bestätigung, Statsclient löschen",
"contact-added": "Kontakt wurde hinzugefügt", "confirm-delete-team-and-associated-runners": "Bestätigung, lösche das Team mitsamt seinen Läufer:innen.",
"contact-deleted": "Kontakt gelöscht", "confirm-deletion": "Löschung Bestätigen",
"contact-information": "Kontaktinformation", "confirm-the-new-password": "Neues Passwort bestätigen",
"contact-is-being-added": "Kontakt wird erstellt...", "contact": "Kontakt",
"contact-is-being-updated": "Kontakt wird aktualisiert ...", "contact-added": "Kontakt wurde hinzugefügt",
"contact-is-not-a-member-in-any-group": "Kontakt gehört zu keiner Gruppe", "contact-deleted": "Kontakt gelöscht",
"contacts": "Kontakte", "contact-information": "Kontaktinformation",
"contacts-are-being-loaded": "Kontakte werden geladen ...", "contact-is-being-added": "Kontakt wird erstellt...",
"copied-link-to-clipboard": "Link wurde in die Zwischenablage kopiert", "contact-is-being-updated": "Kontakt wird aktualisiert ...",
"copied-token-to-clipboard": "Token wurde in die Zwischenablage kopiert", "contact-is-not-a-member-in-any-group": "Kontakt gehört zu keiner Gruppe",
"count_organizations": "Organisationen (Anzahl)", "contacts": "Kontakte",
"count_teams": "Teams (Anzahl)", "contacts-are-being-loaded": "Kontakte werden geladen ...",
"create": "Erstellen", "copied-link-to-clipboard": "Link wurde in die Zwischenablage kopiert",
"create-a-new": "Erstelle eine neue", "copied-token-to-clipboard": "Token wurde in die Zwischenablage kopiert",
"create-a-new-card": "Neue Läuferkarte erstellen", "count_organizations": "Organisationen (Anzahl)",
"create-a-new-contact": "Kontakt erstellen", "count_teams": "Teams (Anzahl)",
"create-a-new-distance-donation": "Erstelle ein neues Sponsoring", "create": "Erstellen",
"create-a-new-donor": "Neue Sponsor:in erstellen", "create-a-new": "Erstelle eine neue",
"create-a-new-fixed-donation": "Erstelle eine neue Festbetragsspende", "create-a-new-card": "Neue Läuferkarte erstellen",
"create-a-new-organization": "Neue Organisation anlegen", "create-a-new-contact": "Kontakt erstellen",
"create-a-new-runner": "Neue Läufer:in erstellen", "create-a-new-distance-donation": "Erstelle ein neues Sponsoring",
"create-a-new-scan-fixed-only": "Neuen Scan erstellen (nur mit Festdistanz)", "create-a-new-donor": "Neue Sponsor:in erstellen",
"create-a-new-scanstation": "Neue Station erstellen", "create-a-new-fixed-donation": "Erstelle eine neue Festbetragsspende",
"create-a-new-statsclient": "Neuen Statsclient erstellen", "create-a-new-organization": "Neue Organisation anlegen",
"create-a-new-team": "Erstelle ein neues Team", "create-a-new-runner": "Neue Läufer:in erstellen",
"create-a-new-track": "Neuen Track erstellen", "create-a-new-scan-fixed-only": "Neuen Scan erstellen (nur mit Festdistanz)",
"create-a-new-user": "Neue Benutzer:in anlegen", "create-a-new-scanstation": "Neue Station erstellen",
"create-a-new-user-group": "Erstelle eine neue Gruppe", "create-a-new-statsclient": "Neuen Statsclient erstellen",
"create-and-generate-pdf": "Erstellen und PDF herunterladen", "create-a-new-team": "Erstelle ein neues Team",
"create-bulk-blanco-cards": "Blankokarten erstellen", "create-a-new-track": "Neuen Track erstellen",
"create-bulk-cards": "Blankokarten erstellen", "create-a-new-user": "Neue Benutzer:in anlegen",
"create-organization": "Organisation erstellen", "create-a-new-user-group": "Erstelle eine neue Gruppe",
"create-team": "Team erstellen", "create-and-generate-pdf": "Erstellen und PDF herunterladen",
"create-track": "Track erstellen", "create-bulk-blanco-cards": "Blankokarten erstellen",
"create-user": "Benutzer anlegen", "create-bulk-cards": "Blankokarten erstellen",
"create-without-pdf": "Ohne PDF erstellen", "create-organization": "Organisation erstellen",
"created-blanco-cards": "Blankokarten wurden erstellt", "create-team": "Team erstellen",
"creating-blanco-cards": "Erstelle Blankokarten", "create-track": "Track erstellen",
"credits": "Credits", "create-user": "Benutzer anlegen",
"csv_import__class": "Klasse", "create-without-pdf": "Ohne PDF erstellen",
"csv_import__firstname": "Vorname", "created-blanco-cards": "Blankokarten wurden erstellt",
"csv_import__lastname": "Nachname", "creating-blanco-cards": "Erstelle Blankokarten",
"csv_import__middlename": "Mittelname", "credits": "Credits",
"csv_import__team": "Team", "csv_import__class": "Klasse",
"danger-zone": "Gefahrenzone", "csv_import__firstname": "Vorname",
"dashboard-greeting": "Hallo", "csv_import__lastname": "Nachname",
"dashboard-title": "Dashboard", "csv_import__middlename": "Mittelname",
"datatable": { "csv_import__team": "Team",
"search": "🔍 Suche ...", "danger-zone": "Gefahrenzone",
"an_error_happened_while_fetching_the_data": "Beim Abrufen der Daten ist ein Fehler aufgetreten", "dashboard-greeting": "Hallo",
"loading": "Wird geladen...", "dashboard-title": "Dashboard",
"next": "Nächste", "datatable": {
"of": "von", "search": "🔍 Suche ...",
"previous": "Vorherige", "an_error_happened_while_fetching_the_data": "Beim Abrufen der Daten ist ein Fehler aufgetreten",
"to": "bis", "loading": "Wird geladen...",
"showing": "Zeige", "next": "Nächste",
"no_matching_records_found": "Keine passenden Einträge gefunden", "of": "von",
"page": "Seite", "previous": "Vorherige",
"records": "Einträge", "to": "bis",
"sort_column_ascending": "Spalte aufsteigend sortieren", "showing": "Zeige",
"sort_column_descending": "Spalte absteigend sortieren" "no_matching_records_found": "Keine passenden Einträge gefunden",
}, "page": "Seite",
"delete": "Löschen", "records": "Einträge",
"delete-cards": "Karten löschen", "sort_column_ascending": "Spalte aufsteigend sortieren",
"delete-contact": "Kontakt löschen", "sort_column_descending": "Spalte absteigend sortieren"
"delete-donation": "Sponsoring löschen", },
"delete-donor": "Sponsor:in löschen", "delete": "Löschen",
"delete-group": "Gruppe löschen", "delete-cards": "Karten löschen",
"delete-organization": "Organisation löschen", "delete-contact": "Kontakt löschen",
"delete-profile": "Profil löschen", "delete-donation": "Sponsoring löschen",
"delete-runner": "Läufer:in löschen", "delete-donor": "Sponsor:in löschen",
"delete-scan": "Scan löschen", "delete-group": "Gruppe löschen",
"delete-scans": "Scans löschen", "delete-organization": "Organisation löschen",
"delete-station": "Station löschen", "delete-profile": "Profil löschen",
"delete-statsclient": "Statsclient löschen", "delete-runner": "Läufer:in löschen",
"delete-team": "Team Löschen", "delete-scan": "Scan löschen",
"delete-user": "Benutzer:in löschen", "delete-scans": "Scans löschen",
"deleted-scan": "Scan wurde gelöscht", "delete-station": "Station löschen",
"dependency_name": "Name", "delete-statsclient": "Statsclient löschen",
"description": "Beschreibung", "delete-team": "Team Löschen",
"description-optional": "Beschreibung (optional)", "delete-user": "Benutzer:in löschen",
"deselect-all": "Alle abwählen", "deleted-scan": "Scan wurde gelöscht",
"details": "Details", "dependency_name": "Name",
"disabled": "deaktiviert", "description": "Beschreibung",
"distance": "Distanz", "description-optional": "Beschreibung (optional)",
"distance-donation": "Sponsoring", "deselect-all": "Alle abwählen",
"distance-in-km": "Distanz (in KM)", "details": "Details",
"distance-track": "Distanz (+Track)", "disabled": "deaktiviert",
"do-you-really-want-to-delete-your-profile": "Möchtest du dein Profil wirklich löschen?", "distance": "Distanz",
"do-you-want-to-delete-the-organization-delete_org-name": "Möchtest du die Organisation {orgname} löschen?", "distance-donation": "Sponsoring",
"do-you-want-to-delete-the-team-delete_team-name": "Möchtest du das Team {teamname} löschen?", "distance-in-km": "Distanz (in KM)",
"do-you-want-to-delete-this-donor-with-all-related-donations": "Möchtest du diese Sponsor:in mit all ihren Sponsorings löschen?", "distance-track": "Distanz (+Track)",
"documentation": "Dokumentation", "do-you-really-want-to-delete-your-profile": "Möchtest du dein Profil wirklich löschen?",
"donation-amount": "Sponsoringbetrag", "do-you-want-to-delete-the-organization-delete_org-name": "Möchtest du die Organisation {orgname} löschen?",
"donation-amount-must-be-greater-that-0-00eur": "Der Sponsoringbetrag muss größer als 0.00€ sein.", "do-you-want-to-delete-the-team-delete_team-name": "Möchtest du das Team {teamname} löschen?",
"donation-deleted": "Sponsoring gelöscht", "do-you-want-to-delete-this-donor-with-all-related-donations": "Möchtest du diese Sponsor:in mit all ihren Sponsorings löschen?",
"donation-updated": "Sponsoring wurde aktualisiert", "documentation": "Dokumentation",
"donation_added": "Sponsoring hinzugefügt", "donation-amount": "Sponsoringbetrag",
"donations": "Sponsorings", "donation-amount-must-be-greater-that-0-00eur": "Der Sponsoringbetrag muss größer als 0.00€ sein.",
"donor": "Sponsor:in", "donation-deleted": "Sponsoring gelöscht",
"donor-added": "Sponsor:in hinzugefügt", "donation-updated": "Sponsoring wurde aktualisiert",
"donor-deleted": "Sponsor:in gelöscht", "donation_added": "Sponsoring hinzugefügt",
"donor-has-no-associated-donations": "Zur Sponsor:in gibt es noch keine Sponsorings", "donations": "Sponsorings",
"donor-is-being-added": "Sponsor:in wird hinzugefügt...", "donor": "Sponsor:in",
"donor-is-being-updated": "Sponsor:in wird aktualisiert", "donor-added": "Sponsor:in hinzugefügt",
"donors": "Sponsor:innen", "donor-deleted": "Sponsor:in gelöscht",
"donors-are-being-loaded": "Sponsor:innen werden geladen", "donor-has-no-associated-donations": "Zur Sponsor:in gibt es noch keine Sponsorings",
"dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?", "donor-is-being-added": "Sponsor:in wird hinzugefügt...",
"dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌", "donor-is-being-updated": "Sponsor:in wird aktualisiert",
"e-mail-adress": "E-Mail-Adresse", "donors": "Sponsor:innen",
"edit": "Bearbeiten", "donors-are-being-loaded": "Sponsor:innen werden geladen",
"edit-a-card": "Läuferkarte bearbeiten", "dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?",
"edit-permissions": "Berechtigungen bearbeiten", "dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌",
"email_address_or_username": "E-Mail-Adresse/ Benutzername", "e-mail-adress": "E-Mail-Adresse",
"enabled": "aktiviert", "edit": "Bearbeiten",
"enabled_large": "Aktiviert", "edit-a-card": "Läuferkarte bearbeiten",
"english": "Englisch", "edit-permissions": "Berechtigungen bearbeiten",
"enter-payment": "Zahlung eingeben", "email_address_or_username": "E-Mail-Adresse/ Benutzername",
"error-during-import": "Fehler beim Importieren", "enabled": "aktiviert",
"error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage", "enabled_large": "Aktiviert",
"error_on_login": "😢Fehler beim Login", "english": "Englisch",
"erteilte": "Direkt erteilte", "enter-payment": "Zahlung eingeben",
"everything-concerning-your-profile": "Alles zu deinem Profil", "error-during-import": "Fehler beim Importieren",
"everything-is-more-fun-together": "Im Team macht's mehr Spaß 🏃‍♂️🏃‍♀️🏃‍♂️", "error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage",
"faq": "FAQ", "error_on_login": "😢Fehler beim Login",
"filename_sponsoringquittungsliste": "SponsoringQuittungsListe", "erteilte": "Direkt erteilte",
"filter-by-organization-team": "Filtern nach Organisation / Team", "everything-concerning-your-profile": "Alles zu deinem Profil",
"first-name": "Vorname", "everything-is-more-fun-together": "Im Team macht's mehr Spaß 🏃‍♂️🏃‍♀️🏃‍♂️",
"first-name-is-required": "Vorname muss angegeben werden", "faq": "FAQ",
"first-scan-of-the-day": "Erster Scan des Tages", "filename_sponsoringquittungsliste": "SponsoringQuittungsListe",
"fixed-donation": "Festbetragsspende", "filter-by-organization-team": "Filtern nach Organisation / Team",
"forgot_password": "Passwort vergessen?", "first-name": "Vorname",
"geerbte": "geerbte", "first-name-is-required": "Vorname muss angegeben werden",
"general-stats": "Allgemeine Statistiken", "first-scan-of-the-day": "Erster Scan des Tages",
"general_promise_error": "😢 Ein unbekannter Fehler ist aufgetreten", "fixed-donation": "Festbetragsspende",
"generate-runner-certificate": "Urkunde generieren", "forgot_password": "Passwort vergessen?",
"generate-runner-certificates": "Urkunden generieren", "geerbte": "geerbte",
"generate-runnercards": "Läuferkarten generieren", "general-stats": "Allgemeine Statistiken",
"generate-sponsoring-contract": "Sponsoringvertrag generieren", "general_promise_error": "😢 Ein unbekannter Fehler ist aufgetreten",
"generate-sponsoring-contracts": "Sponsoringverträge generieren", "generate-runner-certificate": "Urkunde generieren",
"generating-pdf": "PDF wird generiert...", "generate-runner-certificates": "Urkunden generieren",
"generating-pdfs": "PDFs werden generiert...", "generate-runnercards": "Läuferkarten generieren",
"generic-ui-logic-error": "Etwas ist in der Benutzeroberfläche schiefgelaufen.", "generate-sponsoring-contract": "Sponsoringvertrag generieren",
"german": "Deutsch", "generate-sponsoring-contracts": "Sponsoringverträge generieren",
"go-to-login": "Zum Login", "generating-pdf": "PDF wird generiert...",
"goback": "Zur Startseite", "generating-pdfs": "PDFs werden generiert...",
"granted": "Gewährt", "generic-ui-logic-error": "Etwas ist in der Benutzeroberfläche schiefgelaufen.",
"group": "Gruppe", "german": "Deutsch",
"group-added": "Gruppe hinzugefügt", "go-to-login": "Zum Login",
"group-is-being-added": "Gruppe wird erstellt", "goback": "Zur Startseite",
"group-name-is-required": "Der Gruppenname muss angegeben werden.", "granted": "Gewährt",
"group-updated": "Gruppe aktualisiert", "group": "Gruppe",
"groups": "Gruppen", "group-added": "Gruppe hinzugefügt",
"groups-are-being-loaded": "Gruppen werden geladen", "group-is-being-added": "Gruppe wird erstellt",
"home": "Start", "group-name-is-required": "Der Gruppenname muss angegeben werden.",
"icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:", "group-updated": "Gruppe aktualisiert",
"if-you-want-to-create-multiple-blanco-cards-try-the-add-bulk-button": "Wenn du mehrere Blankokarten erstellen willst, nutze doch den \"Blankokarten erstellen\" Knopf.", "groups": "Gruppen",
"import-finished": "Import abgeschlossen", "groups-are-being-loaded": "Gruppen werden geladen",
"import-runners": "Läufer:innen importieren", "home": "Start",
"import__target-organization": "Ziel Organisation", "icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:",
"imprint": "Impressum ", "if-you-want-to-create-multiple-blanco-cards-try-the-add-bulk-button": "Wenn du mehrere Blankokarten erstellen willst, nutze doch den \"Blankokarten erstellen\" Knopf.",
"imprint-loading": "Impressum lädt...", "import-finished": "Import abgeschlossen",
"inactive": "Inaktiv", "import-runners": "Läufer:innen importieren",
"installed-version": "Installierte Version", "import__target-organization": "Ziel Organisation",
"internal-error": "Interner Fehler", "imprint": "Impressum ",
"invalid": "Ungültig", "imprint-loading": "Impressum lädt...",
"invalid-mail-reset": "Das ist keine gültige E-Mail", "inactive": "Inaktiv",
"just-enter-how-many-you-want-and-the-system-will-create-them": "Gebe einfach ein, wie viele Blankokarten das System erstellen soll.", "installed-version": "Installierte Version",
"key": "Schlüssel", "internal-error": "Interner Fehler",
"laeufer-hinzufuegen": "Läufer:in hinzufügen", "invalid": "Ungültig",
"laeufer-importieren": "Läufer:innen importieren", "invalid-mail-reset": "Das ist keine gültige E-Mail",
"laptime": "Rundenzeit", "just-enter-how-many-you-want-and-the-system-will-create-them": "Gebe einfach ein, wie viele Blankokarten das System erstellen soll.",
"last-name": "Nachname", "key": "Schlüssel",
"last-name-is-required": "Nachname muss angegeben werden", "laeufer-hinzufuegen": "Läufer:in hinzufügen",
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.", "laeufer-importieren": "Läufer:innen importieren",
"license": "Lizenz", "laptime": "Rundenzeit",
"licenses-are-being-loaded": "Lizenzen werden geladen...", "last-name": "Nachname",
"loading-cards": "Läuferkarten werden geladen", "last-name-is-required": "Nachname muss angegeben werden",
"loading-contact-details": "Kontaktdaten werden geladen ...", "lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
"loading-donation-details": "Lade Sponsoringdetails", "license": "Lizenz",
"loading-donor-details": "Lade Details", "licenses-are-being-loaded": "Lizenzen werden geladen...",
"loading-group-detail": "Lade Gruppendetails...", "loading-cards": "Läuferkarten werden geladen",
"loading-profile-data": "Lade Profildaten", "loading-contact-details": "Kontaktdaten werden geladen ...",
"loading-runners": "Läufer:innen werden geladen...", "loading-donation-details": "Lade Sponsoringdetails",
"loading-station-details": "Lade Scanstation-Details ...", "loading-donor-details": "Lade Details",
"log_in": "Anmelden", "loading-group-detail": "Lade Gruppendetails...",
"log_in_to_your_account": "Bitte melde dich an", "loading-profile-data": "Lade Profildaten",
"login_is_checked": "Login wird überprüft", "loading-runners": "Läufer:innen werden geladen...",
"logout": "Abmelden", "loading-station-details": "Lade Scanstation-Details ...",
"mail-validation-in-progress": "E-Mail Verifizierung läuft... ", "log_in": "Anmelden",
"manage-admin-users": "Nutzer verwalten", "log_in_to_your_account": "Bitte melde dich an",
"middle-name": "Mittelname", "login_is_checked": "Login wird überprüft",
"minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)", "logout": "Abmelden",
"minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein", "mail-validation-in-progress": "E-Mail Verifizierung läuft... ",
"must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!", "manage-admin-users": "Nutzer verwalten",
"must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!", "middle-name": "Mittelname",
"must-contain-a-number": "Passwort muss eine Zahl enthalten!", "minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)",
"must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!", "minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein",
"name": "Name", "must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!",
"name-is-required": "Der Gruppenname muss angegeben werden", "must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!",
"new-password": "Neues Passwort", "must-contain-a-number": "Passwort muss eine Zahl enthalten!",
"no-contact-found": "Keine Kontakte gefunden", "must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!",
"no-contact-selected": "Kein Kontakt ausgewählt", "name": "Name",
"no-contact-specified": "Kein Kontakt angegeben", "name-is-required": "Der Gruppenname muss angegeben werden",
"no-donors-found": "Keine Spender:innen gefunden", "new-password": "Neues Passwort",
"no-license-text-could-be-found": "Kein Lizenz-Text gefunden 😢", "no-address": "Keine Adresse hinterlegt",
"no-organization-or-team-found": "Keine Organisationen oder Teams gefunden", "no-contact-found": "Keine Kontakte gefunden",
"no-organization-specified": "Keine Organisation angegeben", "no-contact-selected": "Kein Kontakt ausgewählt",
"no-organizations-found": "Keine Organisationen gefunden", "no-contact-specified": "Kein Kontakt angegeben",
"no-runners-found": "Keine Läufer:innen gefunden", "no-donors-found": "Keine Spender:innen gefunden",
"no-tracks-added-yet": "Es wurden noch keine Tracks erstellt.", "no-license-text-could-be-found": "Kein Lizenz-Text gefunden 😢",
"non-blanko": "Keine/Blankokarte", "no-organization-or-team-found": "Keine Organisationen oder Teams gefunden",
"open": "OFFEN", "no-organization-specified": "Keine Organisation angegeben",
"organization": "Organisation", "no-organizations-found": "Keine Organisationen gefunden",
"organization-added": "Organisation hinzugefügt", "no-runners-found": "Keine Läufer:innen gefunden",
"organization-deleted": "Organisation gelöscht", "no-tracks-added-yet": "Es wurden noch keine Tracks erstellt.",
"organization-detail-is-being-loaded": "Organisationsdetails werden geladen ...", "non-blanko": "Keine/Blankokarte",
"organization-is-being-added": "Organisation wird hinzugefügt ...", "open": "OFFEN",
"organization-name-is-required": "Der Name muss angegeben werden", "organization": "Organisation",
"organizations": "Organisationen", "organization-added": "Organisation hinzugefügt",
"organizations-are-being-loaded": "Organisationen werden geladen ...", "organization-deleted": "Organisation gelöscht",
"orgs": "Organisationen", "organization-detail-is-being-loaded": "Organisationsdetails werden geladen ...",
"oss_credit_description": "Wir verwenden eine Menge Open Source-Software bei diesen Projekten und möchten uns bei den folgenden Projekten und Mitwirkenden bedanken, die dazu beitragen, Open Source großartig zu machen!", "organization-is-being-added": "Organisation wird hinzugefügt ...",
"paid": "BEZAHLT", "organization-name-is-required": "Der Name muss angegeben werden",
"paid-amount": "Gezahlter Betrag", "organizations": "Organisationen",
"password": "Passwort", "organizations-are-being-loaded": "Organisationen werden geladen ...",
"password-changed": "Passwort wurde aktualisiert!", "orgs": "Organisationen",
"password-is-required": "Passwort muss angegeben werden", "oss_credit_description": "Wir verwenden eine Menge Open Source-Software bei diesen Projekten und möchten uns bei den folgenden Projekten und Mitwirkenden bedanken, die dazu beitragen, Open Source großartig zu machen!",
"password-reset-failed": "Passwort zurücksetzen ist fehlgeschlagen!", "paid": "BEZAHLT",
"password-reset-in-progress": "Passwort wird zurückgesetzt...", "paid-amount": "Gezahlter Betrag",
"password-reset-mail-sent": "Passwort-Reset Mail wurde an \"{usersEmail}\" geschickt.", "password": "Passwort",
"password-reset-successful": "Passwort erfolgreich zurückgesetzt!", "password-changed": "Passwort wurde aktualisiert!",
"passwords-dont-match": "Die Passwörter stimmen nicht überein!", "password-is-required": "Passwort muss angegeben werden",
"payment-amount-must-be-greater-than-0-00eur": "Der Zahlungsbetrag muss größer als 0.00€ sein!", "password-reset-failed": "Passwort zurücksetzen ist fehlgeschlagen!",
"pdf-generation-failed": "PDF Generierung fehlgeschlagen!", "password-reset-in-progress": "Passwort wird zurückgesetzt...",
"pdf-successfully-generated": "PDF wurde erfolgreich generiert!", "password-reset-mail-sent": "Passwort-Reset Mail wurde an \"{usersEmail}\" geschickt.",
"pdfs-successfully-generated": "Alle PDFs wurden generiert!", "password-reset-successful": "Passwort erfolgreich zurückgesetzt!",
"per-kilometer": "pro Kilometer", "passwords-dont-match": "Die Passwörter stimmen nicht überein!",
"permissions": "Berechtigungen", "payment-amount-must-be-greater-than-0-00eur": "Der Zahlungsbetrag muss größer als 0.00€ sein!",
"permissions-updated": "Berechtigungen aktualisiert!", "pdf-generation-failed": "PDF Generierung fehlgeschlagen!",
"phone": "Telefon", "pdf-successfully-generated": "PDF wurde erfolgreich generiert!",
"please-confirm-the-deletion-of-card": "Bitte bestätige die Löschung der Karte", "pdfs-successfully-generated": "Alle PDFs wurden generiert!",
"please-confirm-the-deletion-of-runner": "Bitte bestätige die Löschung der Läufer:in", "per-kilometer": "pro Kilometer",
"please-confirm-the-deletion-of-scan": "Bitte bestätige die Löschung des Scans", "permissions": "Berechtigungen",
"please-copy-the-token-and-store-it-somewhere-save": "Bitte kopiere dir den Token und bewahre ihn gut auf.", "permissions-updated": "Berechtigungen aktualisiert!",
"please-provide-a-password": "Bitte gebe ein Passwort an...", "phone": "Telefon",
"please-provide-the-nessecary-information-to-add-a-new-donor": "Bitte mach die Notwendigen Angaben, um eine neue Sponsor:in zu erstellen", "please-confirm-the-deletion-of-card": "Bitte bestätige die Löschung der Karte",
"please-provide-the-nessecary-information-to-create-a-new-donation": "Bitte gebe alle für das Sponsoring notwendigen Daten an.", "please-confirm-the-deletion-of-runner": "Bitte bestätige die Löschung der Läufer:in",
"please-provide-the-nessecary-information-to-create-a-new-scan": "Bitte gebe alle notwendigen Informationen an, um einen neuen Scan zu erstellen.", "please-confirm-the-deletion-of-scan": "Bitte bestätige die Löschung des Scans",
"please-provide-the-required-csv-xlsx-file": "Bitte eine CSV oder XLSX Datei hochladen.", "please-copy-the-token-and-store-it-somewhere-save": "Bitte kopiere dir den Token und bewahre ihn gut auf.",
"please-provide-the-required-information-for-creating-a-new-user-group": "Bitte gebe alle für eine neue Gruppe notwendigen Informationen an.", "please-provide-a-password": "Bitte gebe ein Passwort an...",
"please-provide-the-required-information-to-add-a-new-contact": "Bitte gebe alle nötigen Informationen an, im den neuen Kontakt zu erstellen.", "please-provide-the-nessecary-information-to-add-a-new-donor": "Bitte mach die Notwendigen Angaben, um eine neue Sponsor:in zu erstellen",
"please-provide-the-required-information-to-add-a-new-organization": "Bitte gebe alle nötigen Informationen an, im die neue Organisation zu erstellen.", "please-provide-the-nessecary-information-to-create-a-new-donation": "Bitte gebe alle für das Sponsoring notwendigen Daten an.",
"please-provide-the-required-information-to-add-a-new-runner": "Bitte die benötigten Informationen angeben.", "please-provide-the-nessecary-information-to-create-a-new-scan": "Bitte gebe alle notwendigen Informationen an, um einen neuen Scan zu erstellen.",
"please-provide-the-required-information-to-add-a-new-team": "Bitte gebe alle nötigen Informationen an, im das neue Team zu erstellen.", "please-provide-the-required-csv-xlsx-file": "Bitte eine CSV oder XLSX Datei hochladen.",
"please-provide-the-required-information-to-add-a-new-track": "Bitte die benötigten Informationen angeben.", "please-provide-the-required-information-for-creating-a-new-user-group": "Bitte gebe alle für eine neue Gruppe notwendigen Informationen an.",
"please-provide-the-required-information-to-add-a-new-user": "Bitte gebe alle nötigen Informationen an, im die neue Benutzer:in zu erstellen.", "please-provide-the-required-information-to-add-a-new-contact": "Bitte gebe alle nötigen Informationen an, im den neuen Kontakt zu erstellen.",
"please-provide-the-required-information-to-create-a-new-scanstation": "Bitte gebe alle für eine Scannerstation notwendigen Informationen an", "please-provide-the-required-information-to-add-a-new-organization": "Bitte gebe alle nötigen Informationen an, im die neue Organisation zu erstellen.",
"please-provide-the-required-information-to-create-a-new-statsclient": "Bitte gebe alle für einen Statsclient notwendigen Informationen an", "please-provide-the-required-information-to-add-a-new-runner": "Bitte die benötigten Informationen angeben.",
"please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...", "please-provide-the-required-information-to-add-a-new-team": "Bitte gebe alle nötigen Informationen an, im das neue Team zu erstellen.",
"please-wait-a-moment-your-login-is-still-being-processed": "Bitte warte einen Moment, deine Anmeldung wird verarbeitet", "please-provide-the-required-information-to-add-a-new-track": "Bitte die benötigten Informationen angeben.",
"prefix": "Prefix", "please-provide-the-required-information-to-add-a-new-user": "Bitte gebe alle nötigen Informationen an, im die neue Benutzer:in zu erstellen.",
"privacy": "Datenschutz", "please-provide-the-required-information-to-create-a-new-scanstation": "Bitte gebe alle für eine Scannerstation notwendigen Informationen an",
"privacy-loading": "Datenschutzerklärung lädt...", "please-provide-the-required-information-to-create-a-new-statsclient": "Bitte gebe alle für einen Statsclient notwendigen Informationen an",
"profile": "Profil", "please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...",
"profile-deleted": "Profil gelöscht!", "please-wait-a-moment-your-login-is-still-being-processed": "Bitte warte einen Moment, deine Anmeldung wird verarbeitet",
"profile-picture": "Profilbild", "prefix": "Prefix",
"profile-updated": "Profil wurde aktualisiert!", "privacy": "Datenschutz",
"read-license": "Lizenz-Text lesen", "privacy-loading": "Datenschutzerklärung lädt...",
"receipt-needed": "Spendenquittung benötigt", "profile": "Profil",
"repo_link": "Link", "profile-deleted": "Profil gelöscht!",
"request-a-new-reset-mail": "Neue Reset-Mail anfordern", "profile-picture": "Profilbild",
"reset-my-password": "Passwort zurücksetzen", "profile-updated": "Profil wurde aktualisiert!",
"reset-password": "Passwort zurücksetzen", "read-license": "Lizenz-Text lesen",
"runner": "Läufer:in", "receipt-needed": "Spendenquittung benötigt",
"runner-added": "Läufer:in hinzugefügt", "repo_link": "Link",
"runner-deleted": "Läufer:in gelöscht", "request-a-new-reset-mail": "Neue Reset-Mail anfordern",
"runner-import": "Läufer:innen Import", "reset-my-password": "Passwort zurücksetzen",
"runner-is-being-added": "Läufer:in wird hinzugefügt...", "reset-password": "Passwort zurücksetzen",
"runner-updated": "Läufer:in aktualisiert!", "runner": "Läufer:in",
"runnercards": "Laeuferkarten", "runner-added": "Läufer:in hinzugefügt",
"runnerimport_verify_runners_org": "Bitte die Läufer:innen für den Import in die Organisation \"{org_name}\" bestätigen", "runner-deleted": "Läufer:in gelöscht",
"runners": "Läufer", "runner-import": "Läufer:innen Import",
"runners-are-being-imported": "Läufer:innen werden importiert ...", "runner-is-being-added": "Läufer:in wird hinzugefügt...",
"runners-are-being-loaded": "Läufer:innen werden geladen ...", "runner-updated": "Läufer:in aktualisiert!",
"save": "Speichern", "runnercards": "Laeuferkarten",
"save-changes": "Änderungen speichern", "runnerimport_verify_runners_org": "Bitte die Läufer:innen für den Import in die Organisation \"{org_name}\" bestätigen",
"scan-added": "Scan hinzugefügt", "runners": "Läufer",
"scan-deleted": "Scan gelöscht", "runners-are-being-imported": "Läufer:innen werden importiert ...",
"scan-is-being-updated": "Scan wird aktualisiert", "runners-are-being-loaded": "Läufer:innen werden geladen ...",
"scan-with-fixed-distance": "Scan mit Festdistanz", "save": "Speichern",
"scans": "Scans", "save-changes": "Änderungen speichern",
"scans-are-being-loaded": "Scans werden geladen", "scan-added": "Scan hinzugefügt",
"scanstation": "Scanner Station", "scan-deleted": "Scan gelöscht",
"scanstation-added": "Station wurde erstellt", "scan-is-being-updated": "Scan wird aktualisiert",
"scanstation-is-being-added": "Scannerstation wird angelegt...", "scan-with-fixed-distance": "Scan mit Festdistanz",
"scanstations": "Scanner Stationen", "scans": "Scans",
"scanstations-are-being-loaded": "Scannerstationen werden geladen...", "scans-are-being-loaded": "Scans werden geladen",
"search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder Id)", "scanstation": "Scanner Station",
"search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder Id)", "scanstation-added": "Station wurde erstellt",
"search-for-donor-name-or-id": "Suche eine Spender:in (via Name oder Id)", "scanstation-is-being-added": "Scannerstation wird angelegt...",
"search-for-permission": "Berechtigungen durchsuchen", "scanstations": "Scanner Stationen",
"search-for-runner-by-name-or-id": "Suche eine Läufer:in (via Name oder Id)", "scanstations-are-being-loaded": "Scannerstationen werden geladen...",
"select-all": "Alle auswählen", "search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder Id)",
"select-language": "Sprache auswählen", "search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder Id)",
"selfservice-registration": "Selfservice Registrierung", "search-for-donor-name-or-id": "Suche eine Spender:in (via Name oder Id)",
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services", "search-for-permission": "Berechtigungen durchsuchen",
"set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen", "search-for-runner-by-name-or-id": "Suche eine Läufer:in (via Name oder Id)",
"settings": "Einstellungen", "select-all": "Alle auswählen",
"settings-for-your-profile": "Die Einstellungen deines Accounts", "select-language": "Sprache auswählen",
"something-about-the-group": "Infos zur Gruppe", "selfservice-registration": "Selfservice Registrierung",
"sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen", "send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
"sponsorings": "Sponsoringerklaerungen", "set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen",
"station-deleted": "Scannerstation gelöscht", "settings": "Einstellungen",
"stats-are-being-loaded": "Die Statistiken werden geladen...", "settings-for-your-profile": "Die Einstellungen deines Accounts",
"statsclient-deleted": "Statsclient wurde gelöscht", "something-about-the-group": "Infos zur Gruppe",
"statsclient-is-being-added": "Statsclient wird angelegt...", "sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen",
"statsclients": "Statsclient (aka Beamershow)", "sponsorings": "Sponsoringerklaerungen",
"statsclients-are-being-loaded": "Statsclients werden geladen", "station-deleted": "Scannerstation gelöscht",
"status": "Status", "stats-are-being-loaded": "Die Statistiken werden geladen...",
"stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können", "statsclient-deleted": "Statsclient wurde gelöscht",
"successful-password-reset": "Passwort erfolgreich zurückgesetzt!", "statsclient-is-being-added": "Statsclient wird angelegt...",
"team": "Team", "statsclients": "Statsclient (aka Beamershow)",
"team-added": "Team wurde hinzugefügt", "statsclients-are-being-loaded": "Statsclients werden geladen",
"team-deleted": "Team gelöscht", "status": "Status",
"team-detail-is-being-loaded": "Team wird geladen...", "stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können",
"team-is-being-added": "Team wird erstellt...", "successful-password-reset": "Passwort erfolgreich zurückgesetzt!",
"team-name": "Teamname", "team": "Team",
"team-name-is-required": "Teamname ist erforderlich", "team-added": "Team wurde hinzugefügt",
"teams": "Teams", "team-deleted": "Team gelöscht",
"teams-are-being-loaded": "Teams werden geladen ...", "team-detail-is-being-loaded": "Team wird geladen...",
"the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "Die angegebene Telefonnummer ist nicht korrekt. <br /> Bitte gebe eine Telefonnummer im internationalen Format an...", "team-is-being-added": "Team wird erstellt...",
"the-scans-distance-must-be-greater-than-0m": "Die Distanz muss größer als 0m sein.", "team-name": "Teamname",
"the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "Der Scannerstation Token wird nur einmal angezeigt - du kannst ihn nicht ändern oder ihn dir nochmal anzeigen lassen!", "team-name-is-required": "Teamname ist erforderlich",
"the-statsclient-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "Der Statsclient Token wird nur einmal angezeigt - du kannst ihn nicht ändern oder ihn dir nochmal anzeigen lassen!", "teams": "Teams",
"there-are-no-cards-yet": "Es gibt noch keine Läuferkarten.", "teams-are-being-loaded": "Teams werden geladen ...",
"there-are-no-contacts-added-yet": "Es wurden noch keine Kontakte hinzugefügt.", "the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "Die angegebene Telefonnummer ist nicht korrekt. <br /> Bitte gebe eine Telefonnummer im internationalen Format an...",
"there-are-no-donations-yet": "Es gibt noch keine Sponsorings", "the-scans-distance-must-be-greater-than-0m": "Die Distanz muss größer als 0m sein.",
"there-are-no-donors-yet": "Es gibt noch keine Sponsor:innen", "the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "Der Scannerstation Token wird nur einmal angezeigt - du kannst ihn nicht ändern oder ihn dir nochmal anzeigen lassen!",
"there-are-no-groups-yet": "Es gibt noch keine Gruppen", "the-statsclient-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "Der Statsclient Token wird nur einmal angezeigt - du kannst ihn nicht ändern oder ihn dir nochmal anzeigen lassen!",
"there-are-no-organizations-added-yet": "Es wurden noch keine Organisationen hinzugefügt.", "there-are-no-cards-yet": "Es gibt noch keine Läuferkarten.",
"there-are-no-runners-added-yet": "Es wurden noch keine Läufer:innen hinzugefügt.", "there-are-no-contacts-added-yet": "Es wurden noch keine Kontakte hinzugefügt.",
"there-are-no-scans-yet": "Es gibt noch keine Scans", "there-are-no-donations-yet": "Es gibt noch keine Sponsorings",
"there-are-no-teams-added-yet": "Es wurden noch keine Teams hinzugefügt.", "there-are-no-donors-yet": "Es gibt noch keine Sponsor:innen",
"there-are-no-users-added-yet": "Es wurden noch keine Benutzer hinzugefügt.", "there-are-no-groups-yet": "Es gibt noch keine Gruppen",
"this-card-is": "Diese Karte ist", "there-are-no-organizations-added-yet": "Es wurden noch keine Organisationen hinzugefügt.",
"this-might-take-a-moment": "Das könnte einen kleinen Moment dauern", "there-are-no-runners-added-yet": "Es wurden noch keine Läufer:innen hinzugefügt.",
"this-scanstation-is": "Diese Station ist", "there-are-no-scans-yet": "Es gibt noch keine Scans",
"timestamp": "Timestamp", "there-are-no-teams-added-yet": "Es wurden noch keine Teams hinzugefügt.",
"token": "Token", "there-are-no-users-added-yet": "Es wurden noch keine Benutzer hinzugefügt.",
"total-distance": "gelaufene Strecke", "this-card-is": "Diese Karte ist",
"total-donation-amount": "Gesamtbetrag", "this-might-take-a-moment": "Das könnte einen kleinen Moment dauern",
"total-donations": "Spendensumme", "this-scanstation-is": "Diese Station ist",
"total-paid-amount": "Gezahlter Gesamtbetrag", "timestamp": "Timestamp",
"total-scans": "gesamte Scans", "token": "Token",
"total_donation_amount_in_eur": "Gesamtbetrag in €", "total-distance": "gelaufene Strecke",
"track": "Track", "total-donation-amount": "Gesamtbetrag",
"track-added": "Track hinzugefügt", "total-donation-count": "Gesamte Sponsorings",
"track-data-is-being-loaded": "Trackdaten werden geladen", "total-donations": "Spendensumme",
"track-is-being-added": "Track wird hinzugefügt...", "total-donors": "gesamte Sponsor:innen",
"track-is-being-updated": "Track wird aktualisiert...", "total-paid-amount": "Gezahlter Gesamtbetrag",
"track-length-in-m": "Tracklänge (in Metern)", "total-scans": "gesamte Scans",
"track-length-must-be-greater-than-0": "Die Länge muss größer als 0 (Meter) sein", "total_donation_amount_in_eur": "Gesamtbetrag in €",
"track-name": "Trackname", "track": "Track",
"track-name-must-not-be-empty": "Der Name muss angegeben werden", "track-added": "Track hinzugefügt",
"track-was-updated": "Track wurde aktualisiert", "track-data-is-being-loaded": "Trackdaten werden geladen",
"tracks": "Tracks", "track-is-being-added": "Track wird hinzugefügt...",
"unpaid": "Offen", "track-is-being-updated": "Track wird aktualisiert...",
"update-card": "Karte aktualisieren", "track-length-in-m": "Tracklänge (in Metern)",
"update-password": "Passwort ändern", "track-length-must-be-greater-than-0": "Die Länge muss größer als 0 (Meter) sein",
"updated-contact": "Kontakt aktualisiert!", "track-name": "Trackname",
"updated-donor": "Sponsor:in wurde aktualisiert", "track-name-must-not-be-empty": "Der Name muss angegeben werden",
"updated-organization": "Organisation wurde aktualisiert", "track-was-updated": "Track wurde aktualisiert",
"updated-scan": "Scan wurde aktualisiert", "tracks": "Tracks",
"updated-team": "Team wurde aktualisiert", "unpaid": "Offen",
"updateing-group": "Gruppe wird aktualisiert...", "update-card": "Karte aktualisieren",
"updating-card": "Karte wird aktualisiert", "update-password": "Passwort ändern",
"updating-donation": "Sponsoring wird aktualisiert", "updated-contact": "Kontakt aktualisiert!",
"updating-organization": "Organisation wird aktualisiert", "updated-donor": "Sponsor:in wurde aktualisiert",
"updating-permissions": "Berechtigungen werden aktualisiert...", "updated-organization": "Organisation wurde aktualisiert",
"updating-runner": "Läufer:in wird aktualisiert.", "updated-scan": "Scan wurde aktualisiert",
"updating-team": "Team wird aktualisiert", "updated-team": "Team wurde aktualisiert",
"updating-user": "Benutzer:in wird aktualisiert...", "updateing-group": "Gruppe wird aktualisiert...",
"updating-your-profile": "Profil wird aktualisiert...", "updating-card": "Karte wird aktualisiert",
"user-added": "Benutzer hinzugefügt", "updating-donation": "Sponsoring wird aktualisiert",
"user-groups": "Benutzergruppen", "updating-organization": "Organisation wird aktualisiert",
"user-is-being-added": "Benutzer wird hinzugefügt ...", "updating-permissions": "Berechtigungen werden aktualisiert...",
"user-updated": "Benutzer:in wurde aktualisiert", "updating-runner": "Läufer:in wird aktualisiert.",
"username": "Benutzername", "updating-team": "Team wird aktualisiert",
"users": "Benutzer", "updating-user": "Benutzer:in wird aktualisiert...",
"valid": "Gültig", "updating-your-profile": "Profil wird aktualisiert...",
"valid-city-is-required": "Du musst eine Stadt angeben", "user-added": "Benutzer hinzugefügt",
"valid-email-is-required": "Es wird eine valide E-Mail Adresse benötigt", "user-groups": "Benutzergruppen",
"valid-international-phone-number-is-required": "Du musst eine Telefonnummer im internationalen Format angeben...", "user-is-being-added": "Benutzer wird hinzugefügt ...",
"valid-zipcode-postal-code-is-required": "Du musst eine valide Postleitzahl angeben", "user-updated": "Benutzer:in wurde aktualisiert",
"verfuegbare": "Verfügbar", "username": "Benutzername",
"welcome_wavinghand": "Willkommen 👋", "users": "Benutzer",
"yes-i-copied-the-token": "Ja, ich habe den Token kopiert", "valid": "Gültig",
"you-are-going-to-loose-all-permissions-and-access-to-the-runner-system": "Du wirst all deine Berechtigungen und den Zugriff aufs Läufersystem verlieren!", "valid-city-is-required": "Du musst eine Stadt angeben",
"you-can-enter-the-donations-paid-amount-manually-or-use-the-max-button-to-use-the-donations-exact-amount": "Du kannst den Betrag der Zahlung entweder manuell eingeben oder über den MAX Button auf den Spendenbetrag setzen", "valid-email-is-required": "Es wird eine valide E-Mail Adresse benötigt",
"you-can-now-use-your-new-password-to-log-in-to-your-account": "Du kannst dich jetzt mit deinem neuen Passwort anmelden! 🎉", "valid-international-phone-number-is-required": "Du musst eine Telefonnummer im internationalen Format angeben...",
"you-can-provide-a-runner-but-you-dont-have-to": "Du kannst eine Läufer:in angeben, musst aber nicht.", "valid-zipcode-postal-code-is-required": "Du musst eine valide Postleitzahl angeben",
"you-dont-have-any-scanclients-yet": "Es gibt noch keine Statsclients", "verfuegbare": "Verfügbar",
"you-dont-have-any-scanstations-yet": "Es gibt noch keine Scannerstationen", "welcome_wavinghand": "Willkommen 👋",
"you-have-to-provide-an-organization": "Du musst eine Organisation angeben", "yes-i-copied-the-token": "Ja, ich habe den Token kopiert",
"you-have-to-save-your-changes-to-generate-a-link": "Du musst deine Änderungen speichern, um einen Link zu generieren.", "you-are-going-to-loose-all-permissions-and-access-to-the-runner-system": "Du wirst all deine Berechtigungen und den Zugriff aufs Läufersystem verlieren!",
"you-must-create-at-least-one-card-or-cancel": "Du musst mindestens eine Blankokarte erstellen (oder abbrechen).", "you-can-enter-the-donations-paid-amount-manually-or-use-the-max-button-to-use-the-donations-exact-amount": "Du kannst den Betrag der Zahlung entweder manuell eingeben oder über den MAX Button auf den Spendenbetrag setzen",
"zip-postal-code": "Postleitzahl", "you-can-now-use-your-new-password-to-log-in-to-your-account": "Du kannst dich jetzt mit deinem neuen Passwort anmelden! 🎉",
"config-codes": "Konfigurations-Codes", "you-can-provide-a-runner-but-you-dont-have-to": "Du kannst eine Läufer:in angeben, musst aber nicht.",
"api-endpoint": "API-Endpunkt" "you-dont-have-any-scanclients-yet": "Es gibt noch keine Statsclients",
"you-dont-have-any-scanstations-yet": "Es gibt noch keine Scannerstationen",
"you-have-to-provide-an-organization": "Du musst eine Organisation angeben",
"you-have-to-save-your-changes-to-generate-a-link": "Du musst deine Änderungen speichern, um einen Link zu generieren.",
"you-must-create-at-least-one-card-or-cancel": "Du musst mindestens eine Blankokarte erstellen (oder abbrechen).",
"zip-postal-code": "Postleitzahl"
} }

View File

@@ -1,493 +1,498 @@
{ {
"404message": "Sorry, the page you are looking for could not be found.", "404message": "Sorry, the page you are looking for could not be found.",
"404title": "Error 404", "404title": "Error 404",
"about": "About", "about": "About",
"action": "Action", "action": "Action",
"active": "Active", "active": "Active",
"add-card": "Add Card", "add-card": "Add Card",
"add-donation": "Add donation", "add-donation": "Add donation",
"add-donor": "Add donor", "add-donor": "Add donor",
"add-or-update-a-payment": "Add or update a payment", "add-or-update-a-payment": "Add or update a payment",
"add-scan": "Add scan", "add-scan": "Add scan",
"add-the-first-scanstation": "Add your first scanstation.", "add-the-first-scanstation": "Add your first scanstation.",
"add-the-first-statsclient": "Add your first statsclient.", "add-the-first-statsclient": "Add your first statsclient.",
"add-user-group": "Add User Group", "add-user-group": "Add User Group",
"add-your-first-card": "Add your first card", "add-your-first-card": "Add your first card",
"add-your-first-contact": "Add your first contact", "add-your-first-contact": "Add your first contact",
"add-your-first-donor": "add your first donor", "add-your-first-donor": "add your first donor",
"add-your-first-group": "Add your first group", "add-your-first-group": "Add your first group",
"add-your-first-organization": "Add your first organization", "add-your-first-organization": "Add your first organization",
"add-your-first-runner": "Add your first runner", "add-your-first-runner": "Add your first runner",
"add-your-first-team": "Add your first team", "add-your-first-team": "Add your first team",
"add-your-first-track": "Add your first track.", "add-your-first-track": "Add your first track.",
"add-your-first-user": "Add your first user", "add-your-first-user": "Add your first user",
"add-your-fist-donation": "Add your fist donation", "add-your-fist-donation": "Add your fist donation",
"add-your-fist-scan": "Add your fist scan", "add-your-fist-scan": "Add your fist scan",
"adding-card": "Adding Card", "adding-card": "Adding Card",
"adding-donation": "Adding donation...", "adding-donation": "Adding donation...",
"adding-scan": "Adding Scan", "adding-scan": "Adding Scan",
"address": "Address", "address": "Address",
"address-is-required": "Address is required", "address-is-required": "Address is required",
"after-deletion-we-cant-restore-your-old-profile": "After deletion we can't restore your old profile!", "after-deletion-we-cant-restore-your-old-profile": "After deletion we can't restore your old profile!",
"after-the-update-youll-get-logged-out-please-login-with-your-new-password-after-that": "After the update you'll get logged out - Please login with your new password after that.", "after-the-update-youll-get-logged-out-please-login-with-your-new-password-after-that": "After the update you'll get logged out - Please login with your new password after that.",
"all": "all", "all": "all",
"all-associated-donations-will-get-deleted-as-well": "All associated donations will get deleted as well", "all-associated-donations-will-get-deleted-as-well": "All associated donations will get deleted as well",
"all-associated-runners-will-be-deleted-too": "All associated runners will be deleted too!", "all-associated-runners-will-be-deleted-too": "All associated runners will be deleted too!",
"all-associated-scans-will-get-deleted-as-well": "All associated scans will get deleted as well", "all-associated-scans-will-get-deleted-as-well": "All associated scans will get deleted as well",
"all-associated-teams-and-runners-will-be-deleted-too": "All associated teams and runners will be deleted too!", "all-associated-teams-and-runners-will-be-deleted-too": "All associated teams and runners will be deleted too!",
"already-paid": "Already paid", "already-paid": "Already paid",
"amount": "Amount", "amount": "Amount",
"amount-per-kilometer": "Amount per kilometer", "amount-per-kilometer": "Amount per kilometer",
"apartment-suite-etc": "Apartment, suite, etc.", "apartment-suite-etc": "Apartment, suite, etc.",
"application_name": "Lauf für Kaya! - Admin", "api-endpoint": "API-Endpoint",
"applying-changes": "Applying Changes", "application_name": "Lauf für Kaya! - Admin",
"attention": "Attention!", "applying-changes": "Applying Changes",
"author": "Author", "attention": "Attention!",
"bitte-bestaetige-diese-laeufer-fuer-den-import": "Please confirm these runners for import.", "author": "Author",
"by": "by", "average-distance": "average distance",
"cancel": "Cancel", "average-donation": "average donation",
"cancel-delete": "Cancel Delete", "bitte-bestaetige-diese-laeufer-fuer-den-import": "Please confirm these runners for import.",
"cancel-keep-donor": "Cancel, keep donor", "by": "by",
"cancel-keep-my-profile": "Cancel, keep my profile", "cancel": "Cancel",
"cancel-keep-organization": "Cancel, keep organization", "cancel-delete": "Cancel Delete",
"cancel-keep-station": "Cancel, keep station", "cancel-keep-donor": "Cancel, keep donor",
"cancel-keep-statsclient": "Cancel and keep statsclient", "cancel-keep-my-profile": "Cancel, keep my profile",
"cancel-keep-team": "Cancel, keep team", "cancel-keep-organization": "Cancel, keep organization",
"cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity", "cancel-keep-station": "Cancel, keep station",
"card": "card", "cancel-keep-statsclient": "Cancel and keep statsclient",
"card-added": "Card added", "cancel-keep-team": "Cancel, keep team",
"card-deleted": "Card deleted", "cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity",
"card-updated": "Card updated", "card": "card",
"cards": "Cards", "card-added": "Card added",
"cards-deleted": "Cards deleted", "card-deleted": "Card deleted",
"certificates": "Certificates", "card-updated": "Card updated",
"change-your-password-here": "Change your password here", "cards": "Cards",
"changing-your-password": "Changing your password", "cards-deleted": "Cards deleted",
"city": "City", "certificates": "Certificates",
"click-to-copy-the-link-into-your-clipboard": "Click to copy the link into your clipboard", "change-your-password-here": "Change your password here",
"click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard", "changing-your-password": "Changing your password",
"close": "Close", "city": "City",
"code": "Code", "click-to-copy-the-link-into-your-clipboard": "Click to copy the link into your clipboard",
"configure-the-tracks-and-minimum-lap-times": "configure the tracks & minimum lap times", "click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard",
"confirm": "Confirm", "close": "Close",
"confirm-delete": "Confirm Delete", "code": "Code",
"confirm-delete-donor-with-all-donations": "Confirm, delete donor with all donations", "config-codes": "Config codes",
"confirm-delete-my-user-profile": "Confirm, delete my user profile", "configure-the-tracks-and-minimum-lap-times": "configure the tracks & minimum lap times",
"confirm-delete-organization-and-associated-teams-runners": "Confirm, delete organization and associated teams+runners.", "confirm": "Confirm",
"confirm-delete-station-with-all-scans": "Confirm deletion of station with all scans", "confirm-delete": "Confirm Delete",
"confirm-delete-statsclient": "Confirm, delete statsclient", "confirm-delete-donor-with-all-donations": "Confirm, delete donor with all donations",
"confirm-delete-team-and-associated-runners": "Confirm, delete team and associated runners.", "confirm-delete-my-user-profile": "Confirm, delete my user profile",
"confirm-deletion": "Confirm Deletion", "confirm-delete-organization-and-associated-teams-runners": "Confirm, delete organization and associated teams+runners.",
"confirm-the-new-password": "Confirm the new password", "confirm-delete-station-with-all-scans": "Confirm deletion of station with all scans",
"contact": "Contact", "confirm-delete-statsclient": "Confirm, delete statsclient",
"contact-added": "Contact added", "confirm-delete-team-and-associated-runners": "Confirm, delete team and associated runners.",
"contact-deleted": "Contact deleted", "confirm-deletion": "Confirm Deletion",
"contact-information": "Contact Information", "confirm-the-new-password": "Confirm the new password",
"contact-is-being-added": "Contact is being added...", "contact": "Contact",
"contact-is-being-updated": "Contact is being updated...", "contact-added": "Contact added",
"contact-is-not-a-member-in-any-group": "Contact is not a member in any group", "contact-deleted": "Contact deleted",
"contacts": "Contacts", "contact-information": "Contact Information",
"contacts-are-being-loaded": "contacts are being loaded...", "contact-is-being-added": "Contact is being added...",
"copied-link-to-clipboard": "Copied link to clipboard", "contact-is-being-updated": "Contact is being updated...",
"copied-token-to-clipboard": "Copied token to clipboard", "contact-is-not-a-member-in-any-group": "Contact is not a member in any group",
"count_organizations": "# Organizations", "contacts": "Contacts",
"count_teams": "# Teams", "contacts-are-being-loaded": "contacts are being loaded...",
"create": "Create", "copied-link-to-clipboard": "Copied link to clipboard",
"create-a-new": "Create a new", "copied-token-to-clipboard": "Copied token to clipboard",
"create-a-new-card": "Create a new card", "count_organizations": "# Organizations",
"create-a-new-contact": "Create a new contact", "count_teams": "# Teams",
"create-a-new-distance-donation": "Create a new distance donation", "create": "Create",
"create-a-new-donor": "Create a new donor", "create-a-new": "Create a new",
"create-a-new-fixed-donation": "Create a new fixed donation", "create-a-new-card": "Create a new card",
"create-a-new-organization": "Create a new Organization", "create-a-new-contact": "Create a new contact",
"create-a-new-runner": "Create a new Runner", "create-a-new-distance-donation": "Create a new distance donation",
"create-a-new-scan-fixed-only": "Create a new scan (fixed only)", "create-a-new-donor": "Create a new donor",
"create-a-new-scanstation": "Create a new station", "create-a-new-fixed-donation": "Create a new fixed donation",
"create-a-new-statsclient": "Create a new statsclient", "create-a-new-organization": "Create a new Organization",
"create-a-new-team": "Create a new team", "create-a-new-runner": "Create a new Runner",
"create-a-new-track": "Create a new Track", "create-a-new-scan-fixed-only": "Create a new scan (fixed only)",
"create-a-new-user": "Create a new User", "create-a-new-scanstation": "Create a new station",
"create-a-new-user-group": "Create a new user group", "create-a-new-statsclient": "Create a new statsclient",
"create-and-generate-pdf": "Create and generate PDF", "create-a-new-team": "Create a new team",
"create-bulk-blanco-cards": "Create bulk blanco cards", "create-a-new-track": "Create a new Track",
"create-bulk-cards": "Add blanco cards", "create-a-new-user": "Create a new User",
"create-organization": "Create Organization", "create-a-new-user-group": "Create a new user group",
"create-team": "Create Team", "create-and-generate-pdf": "Create and generate PDF",
"create-track": "Create Track", "create-bulk-blanco-cards": "Create bulk blanco cards",
"create-user": "Create User", "create-bulk-cards": "Add blanco cards",
"create-without-pdf": "Create without PDF", "create-organization": "Create Organization",
"created-blanco-cards": "Created blanco cards", "create-team": "Create Team",
"creating-blanco-cards": "Creating blanco cards", "create-track": "Create Track",
"credits": "Credits", "create-user": "Create User",
"csv_import__class": "Class", "create-without-pdf": "Create without PDF",
"csv_import__firstname": "Firstname", "created-blanco-cards": "Created blanco cards",
"csv_import__lastname": "Lastname", "creating-blanco-cards": "Creating blanco cards",
"csv_import__middlename": "Middlename", "credits": "Credits",
"csv_import__team": "Team", "csv_import__class": "Class",
"danger-zone": "Danger zone", "csv_import__firstname": "Firstname",
"dashboard-greeting": "Hello", "csv_import__lastname": "Lastname",
"dashboard-title": "Dashboard", "csv_import__middlename": "Middlename",
"datatable": { "csv_import__team": "Team",
"search": "🔍 Search...", "danger-zone": "Danger zone",
"sort_column_ascending": "Sort column ascending", "dashboard-greeting": "Hello",
"sort_column_descending": "Sort column descending", "dashboard-title": "Dashboard",
"previous": "Previous", "datatable": {
"next": "Next", "search": "🔍 Search...",
"page": "Page", "sort_column_ascending": "Sort column ascending",
"showing": "Showing", "sort_column_descending": "Sort column descending",
"records": "Records", "previous": "Previous",
"of": "of", "next": "Next",
"to": "to", "page": "Page",
"loading": "Loading...", "showing": "Showing",
"no_matching_records_found": "No matching records found", "records": "Records",
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data" "of": "of",
}, "to": "to",
"delete": "Delete", "loading": "Loading...",
"delete-cards": "Delete cards", "no_matching_records_found": "No matching records found",
"delete-contact": "Delete Contact", "an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
"delete-donation": "Delete Donation", },
"delete-donor": "Delete donor", "delete": "Delete",
"delete-group": "Delete Group", "delete-cards": "Delete cards",
"delete-organization": "Delete Organization", "delete-contact": "Delete Contact",
"delete-profile": "Delete Profile", "delete-donation": "Delete Donation",
"delete-runner": "Delete Runner", "delete-donor": "Delete donor",
"delete-scan": "Delete scan", "delete-group": "Delete Group",
"delete-scans": "Delete scans", "delete-organization": "Delete Organization",
"delete-station": "Delete station", "delete-profile": "Delete Profile",
"delete-statsclient": "Delete statsclient", "delete-runner": "Delete Runner",
"delete-team": "Delete Team", "delete-scan": "Delete scan",
"delete-user": "Delete User", "delete-scans": "Delete scans",
"deleted-scan": "Deleted scan", "delete-station": "Delete station",
"dependency_name": "Name", "delete-statsclient": "Delete statsclient",
"description": "description", "delete-team": "Delete Team",
"description-optional": "Description (optional)", "delete-user": "Delete User",
"deselect-all": "deselect all", "deleted-scan": "Deleted scan",
"details": "Details", "dependency_name": "Name",
"disabled": "disabled", "description": "description",
"distance": "Distance", "description-optional": "Description (optional)",
"distance-donation": "distance donation", "deselect-all": "deselect all",
"distance-in-km": "Distance in km", "details": "Details",
"distance-track": "Distance (+Track)", "disabled": "disabled",
"do-you-really-want-to-delete-your-profile": "Do you really want to delete your profile?", "distance": "Distance",
"do-you-want-to-delete-the-organization-delete_org-name": "Do you want to delete the organization {orgname}?", "distance-donation": "distance donation",
"do-you-want-to-delete-the-team-delete_team-name": "Do you want to delete the team {teamname}?", "distance-in-km": "Distance in km",
"do-you-want-to-delete-this-donor-with-all-related-donations": "Do you want to delete this donor with all related donations", "distance-track": "Distance (+Track)",
"documentation": "Documentation", "do-you-really-want-to-delete-your-profile": "Do you really want to delete your profile?",
"donation-amount": "Donation amount", "do-you-want-to-delete-the-organization-delete_org-name": "Do you want to delete the organization {orgname}?",
"donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€", "do-you-want-to-delete-the-team-delete_team-name": "Do you want to delete the team {teamname}?",
"donation-deleted": "Donation deleted", "do-you-want-to-delete-this-donor-with-all-related-donations": "Do you want to delete this donor with all related donations",
"donation-updated": "Donation updated", "documentation": "Documentation",
"donation_added": "Donation_added", "donation-amount": "Donation amount",
"donations": "Donations", "donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€",
"donor": "Donor", "donation-deleted": "Donation deleted",
"donor-added": "Donor added", "donation-updated": "Donation updated",
"donor-deleted": "donor deleted", "donation_added": "Donation_added",
"donor-has-no-associated-donations": "Donor has no associated donations.", "donations": "Donations",
"donor-is-being-added": "Donor is being added...", "donor": "Donor",
"donor-is-being-updated": "Donor is being updated", "donor-added": "Donor added",
"donors": "Donors", "donor-deleted": "donor deleted",
"donors-are-being-loaded": "donors are being loaded", "donor-has-no-associated-donations": "Donor has no associated donations.",
"dont-have-your-email-connected": "Don't have your email connected?", "donor-is-being-added": "Donor is being added...",
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌", "donor-is-being-updated": "Donor is being updated",
"e-mail-adress": "E-Mail Adress", "donors": "Donors",
"edit": "Edit", "donors-are-being-loaded": "donors are being loaded",
"edit-a-card": "Edit a card", "dont-have-your-email-connected": "Don't have your email connected?",
"edit-permissions": "edit permissions", "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
"email_address_or_username": "Email / username", "e-mail-adress": "E-Mail Adress",
"enabled": "enabled", "edit": "Edit",
"enabled_large": "Enabled", "edit-a-card": "Edit a card",
"english": "English", "edit-permissions": "edit permissions",
"enter-payment": "Enter payment", "email_address_or_username": "Email / username",
"error-during-import": "Error during import", "enabled": "enabled",
"error-whyile-copying-to-clipboard": "Error while copying to clipboard", "enabled_large": "Enabled",
"error_on_login": "Error on login", "english": "English",
"erteilte": "Directly granted", "enter-payment": "Enter payment",
"everything-concerning-your-profile": "Everything concerning your profile", "error-during-import": "Error during import",
"everything-is-more-fun-together": "everything is more fun together 🏃‍♂️🏃‍♀️🏃‍♂️", "error-whyile-copying-to-clipboard": "Error while copying to clipboard",
"faq": "FAQ", "error_on_login": "Error on login",
"filename_sponsoringquittungsliste": "DonorReceiptList", "erteilte": "Directly granted",
"filter-by-organization-team": "Filter by Organization/ Team", "everything-concerning-your-profile": "Everything concerning your profile",
"first-name": "First name", "everything-is-more-fun-together": "everything is more fun together 🏃‍♂️🏃‍♀️🏃‍♂️",
"first-name-is-required": "First Name is required", "faq": "FAQ",
"first-scan-of-the-day": "First scan of the day.", "filename_sponsoringquittungsliste": "DonorReceiptList",
"fixed-donation": "fixed donation", "filter-by-organization-team": "Filter by Organization/ Team",
"forgot_password": "Forgot your password?", "first-name": "First name",
"geerbte": "inherited", "first-name-is-required": "First Name is required",
"general-stats": "General Stats", "first-scan-of-the-day": "First scan of the day.",
"general_promise_error": "😢 Error", "fixed-donation": "fixed donation",
"generate-runner-certificate": "Generate runner certificate", "forgot_password": "Forgot your password?",
"generate-runner-certificates": "Generate runner certificates", "geerbte": "inherited",
"generate-runnercards": "Generate Runnercards", "general-stats": "General Stats",
"generate-sponsoring-contract": "generate sponsoring contract", "general_promise_error": "😢 Error",
"generate-sponsoring-contracts": "generate sponsoring contracts", "generate-runner-certificate": "Generate runner certificate",
"generating-pdf": "generating PDF...", "generate-runner-certificates": "Generate runner certificates",
"generating-pdfs": "generating PDFs...", "generate-runnercards": "Generate Runnercards",
"generic-ui-logic-error": "Something went wrong in the UI logic", "generate-sponsoring-contract": "generate sponsoring contract",
"german": "German", "generate-sponsoring-contracts": "generate sponsoring contracts",
"go-to-login": "Go To Login", "generating-pdf": "generating PDF...",
"goback": "Go Home", "generating-pdfs": "generating PDFs...",
"granted": "granted", "generic-ui-logic-error": "Something went wrong in the UI logic",
"group": "Group", "german": "German",
"group-added": "Group added", "go-to-login": "Go To Login",
"group-is-being-added": "Group is being added...", "goback": "Go Home",
"group-name-is-required": "Group name is required", "granted": "granted",
"group-updated": "group updated", "group": "Group",
"groups": "Groups", "group-added": "Group added",
"groups-are-being-loaded": "Groups are being loaded", "group-is-being-added": "Group is being added...",
"home": "Home", "group-name-is-required": "Group name is required",
"icon-image-credits": "We also want to thank these projects for illustrations and icons:", "group-updated": "group updated",
"if-you-want-to-create-multiple-blanco-cards-try-the-add-bulk-button": "If you want to create multiple blanco cards: Try the 'Add blanco cards' button.", "groups": "Groups",
"import-finished": "Import finished", "groups-are-being-loaded": "Groups are being loaded",
"import-runners": "Import runners", "home": "Home",
"import__target-organization": "Target Organization", "icon-image-credits": "We also want to thank these projects for illustrations and icons:",
"imprint": "Imprint", "if-you-want-to-create-multiple-blanco-cards-try-the-add-bulk-button": "If you want to create multiple blanco cards: Try the 'Add blanco cards' button.",
"imprint-loading": "Imprint loading...", "import-finished": "Import finished",
"inactive": "Inactive", "import-runners": "Import runners",
"installed-version": "Installed version", "import__target-organization": "Target Organization",
"internal-error": "Internal Error", "imprint": "Imprint",
"invalid": "Invalid", "imprint-loading": "Imprint loading...",
"invalid-mail-reset": "the provided email is invalid", "inactive": "Inactive",
"just-enter-how-many-you-want-and-the-system-will-create-them": "Just enter how many you want and the system will create them", "installed-version": "Installed version",
"key": "Key", "internal-error": "Internal Error",
"laeufer-hinzufuegen": "Add runner", "invalid": "Invalid",
"laeufer-importieren": "Läufer importieren", "invalid-mail-reset": "the provided email is invalid",
"laptime": "Laptime", "just-enter-how-many-you-want-and-the-system-will-create-them": "Just enter how many you want and the system will create them",
"last-name": "Last name", "key": "Key",
"last-name-is-required": "Last Name is required", "laeufer-hinzufuegen": "Add runner",
"lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.", "laeufer-importieren": "Läufer importieren",
"license": "License", "laptime": "Laptime",
"licenses-are-being-loaded": "Licenses are being loaded...", "last-name": "Last name",
"loading-cards": "Loading cards", "last-name-is-required": "Last Name is required",
"loading-contact-details": "Loading contact details...", "lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.",
"loading-donation-details": "Loading donation details", "license": "License",
"loading-donor-details": "Loading donor details", "licenses-are-being-loaded": "Licenses are being loaded...",
"loading-group-detail": "Loading group detail...", "loading-cards": "Loading cards",
"loading-profile-data": "Loading profile data", "loading-contact-details": "Loading contact details...",
"loading-runners": "loading runners...", "loading-donation-details": "Loading donation details",
"loading-station-details": "Loading station details", "loading-donor-details": "Loading donor details",
"log_in": "Log in", "loading-group-detail": "Loading group detail...",
"log_in_to_your_account": "Log in to your account", "loading-profile-data": "Loading profile data",
"login_is_checked": "Login is being checked...", "loading-runners": "loading runners...",
"logout": "Logout", "loading-station-details": "Loading station details",
"mail-validation-in-progress": "mail validation in progress...", "log_in": "Log in",
"manage-admin-users": "manage admin users", "log_in_to_your_account": "Log in to your account",
"middle-name": "Middle name", "login_is_checked": "Login is being checked...",
"minimum-lap-time-in-s": "minimum lap time in s", "logout": "Logout",
"minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0", "mail-validation-in-progress": "mail validation in progress...",
"must-be-at-least-10-characters-long": "Must be at least 10 characters long!", "manage-admin-users": "manage admin users",
"must-contain-a-lowercase-letter": "Must contain a lowercase letter!", "middle-name": "Middle name",
"must-contain-a-number": "Must contain a number!", "minimum-lap-time-in-s": "minimum lap time in s",
"must-contain-a-uppercase-letter": "Must contain a uppercase letter!", "minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0",
"name": "Name", "must-be-at-least-10-characters-long": "Must be at least 10 characters long!",
"name-is-required": "Name is required", "must-contain-a-lowercase-letter": "Must contain a lowercase letter!",
"new-password": "New password", "must-contain-a-number": "Must contain a number!",
"no-contact-found": "No contacts found", "must-contain-a-uppercase-letter": "Must contain a uppercase letter!",
"no-contact-selected": "No contact selected", "name": "Name",
"no-contact-specified": "no contact specified", "name-is-required": "Name is required",
"no-donors-found": "No donors found", "new-password": "New password",
"no-license-text-could-be-found": "No license text could be found 😢", "no-address": "no address",
"no-organization-or-team-found": "No organization or team found", "no-contact-found": "No contacts found",
"no-organization-specified": "no organization specified", "no-contact-selected": "No contact selected",
"no-organizations-found": "No organizations found", "no-contact-specified": "no contact specified",
"no-runners-found": "No runners found", "no-donors-found": "No donors found",
"no-tracks-added-yet": "there are no tracks added yet.", "no-license-text-could-be-found": "No license text could be found 😢",
"non-blanko": "Non/Blanko", "no-organization-or-team-found": "No organization or team found",
"open": "OPEN", "no-organization-specified": "no organization specified",
"organization": "Organization", "no-organizations-found": "No organizations found",
"organization-added": "Organization added", "no-runners-found": "No runners found",
"organization-deleted": "Organization deleted", "no-tracks-added-yet": "there are no tracks added yet.",
"organization-detail-is-being-loaded": "organization detail is being loaded...", "non-blanko": "Non/Blanko",
"organization-is-being-added": "Organization is being added...", "open": "OPEN",
"organization-name-is-required": "Organization name is required", "organization": "Organization",
"organizations": "Organizations", "organization-added": "Organization added",
"organizations-are-being-loaded": "organizations are being loaded...", "organization-deleted": "Organization deleted",
"orgs": "Organizations", "organization-detail-is-being-loaded": "organization detail is being loaded...",
"oss_credit_description": "We use a lot of open source software on these projects, and would like to thank the following projects and contributors who help make open source great!", "organization-is-being-added": "Organization is being added...",
"paid": "PAID", "organization-name-is-required": "Organization name is required",
"paid-amount": "Paid amount", "organizations": "Organizations",
"password": "Password", "organizations-are-being-loaded": "organizations are being loaded...",
"password-changed": "Password changed!", "orgs": "Organizations",
"password-is-required": "Password is required", "oss_credit_description": "We use a lot of open source software on these projects, and would like to thank the following projects and contributors who help make open source great!",
"password-reset-failed": "Password reset failed!", "paid": "PAID",
"password-reset-in-progress": "Password Reset in Progress...", "paid-amount": "Paid amount",
"password-reset-mail-sent": "Password reset mail was sent to \"{usersEmail}\".", "password": "Password",
"password-reset-successful": "Password Reset successful!", "password-changed": "Password changed!",
"passwords-dont-match": "Passwords don't match!", "password-is-required": "Password is required",
"payment-amount-must-be-greater-than-0-00eur": "Payment amount must be greater than 0.00€!", "password-reset-failed": "Password reset failed!",
"pdf-generation-failed": "PDF generation failed!", "password-reset-in-progress": "Password Reset in Progress...",
"pdf-successfully-generated": "PDF successfully generated!", "password-reset-mail-sent": "Password reset mail was sent to \"{usersEmail}\".",
"pdfs-successfully-generated": "PDFs successfully generated!", "password-reset-successful": "Password Reset successful!",
"per-kilometer": "per Kilometer", "passwords-dont-match": "Passwords don't match!",
"permissions": "Permissions", "payment-amount-must-be-greater-than-0-00eur": "Payment amount must be greater than 0.00€!",
"permissions-updated": "Permissions updated!", "pdf-generation-failed": "PDF generation failed!",
"phone": "Phone", "pdf-successfully-generated": "PDF successfully generated!",
"please-confirm-the-deletion-of-card": "Please confirm the deletion of this card", "pdfs-successfully-generated": "PDFs successfully generated!",
"please-confirm-the-deletion-of-runner": "Please confirm the deletion of this runner", "per-kilometer": "per Kilometer",
"please-confirm-the-deletion-of-scan": "Please confirm the deletion of scan", "permissions": "Permissions",
"please-copy-the-token-and-store-it-somewhere-save": "Please copy the token and store it somewhere safe.", "permissions-updated": "Permissions updated!",
"please-provide-a-password": "Please provide a password...", "phone": "Phone",
"please-provide-the-nessecary-information-to-add-a-new-donor": "Please provide the nessecary information to add a new donor", "please-confirm-the-deletion-of-card": "Please confirm the deletion of this card",
"please-provide-the-nessecary-information-to-create-a-new-donation": "Please provide the nessecary information to create a new donation", "please-confirm-the-deletion-of-runner": "Please confirm the deletion of this runner",
"please-provide-the-nessecary-information-to-create-a-new-scan": "Please provide the nessecary information to create a new scan.", "please-confirm-the-deletion-of-scan": "Please confirm the deletion of scan",
"please-provide-the-required-csv-xlsx-file": "Please provide the required csv/ xlsx file", "please-copy-the-token-and-store-it-somewhere-save": "Please copy the token and store it somewhere safe.",
"please-provide-the-required-information-for-creating-a-new-user-group": "Please provide the required information for creating a new user group.", "please-provide-a-password": "Please provide a password...",
"please-provide-the-required-information-to-add-a-new-contact": "Please provide the required information to add a new contact.", "please-provide-the-nessecary-information-to-add-a-new-donor": "Please provide the nessecary information to add a new donor",
"please-provide-the-required-information-to-add-a-new-organization": "Please provide the required information to add a new organization.", "please-provide-the-nessecary-information-to-create-a-new-donation": "Please provide the nessecary information to create a new donation",
"please-provide-the-required-information-to-add-a-new-runner": "Please provide the required information to add a new runner.", "please-provide-the-nessecary-information-to-create-a-new-scan": "Please provide the nessecary information to create a new scan.",
"please-provide-the-required-information-to-add-a-new-team": "Please provide the required information to add a new team.", "please-provide-the-required-csv-xlsx-file": "Please provide the required csv/ xlsx file",
"please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.", "please-provide-the-required-information-for-creating-a-new-user-group": "Please provide the required information for creating a new user group.",
"please-provide-the-required-information-to-add-a-new-user": "Please provide the required information to add a new user.", "please-provide-the-required-information-to-add-a-new-contact": "Please provide the required information to add a new contact.",
"please-provide-the-required-information-to-create-a-new-scanstation": "Please provide the required information to create a new scanstation", "please-provide-the-required-information-to-add-a-new-organization": "Please provide the required information to add a new organization.",
"please-provide-the-required-information-to-create-a-new-statsclient": "Please provide the required information to create a new statsclient", "please-provide-the-required-information-to-add-a-new-runner": "Please provide the required information to add a new runner.",
"please-request-a-new-reset-mail": "Please request a new reset mail...", "please-provide-the-required-information-to-add-a-new-team": "Please provide the required information to add a new team.",
"please-wait-a-moment-your-login-is-still-being-processed": "Please wait a moment, your login is still being processed", "please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.",
"prefix": "Prefix", "please-provide-the-required-information-to-add-a-new-user": "Please provide the required information to add a new user.",
"privacy": "Privacy", "please-provide-the-required-information-to-create-a-new-scanstation": "Please provide the required information to create a new scanstation",
"privacy-loading": "Privacy loading...", "please-provide-the-required-information-to-create-a-new-statsclient": "Please provide the required information to create a new statsclient",
"profile": "Profile", "please-request-a-new-reset-mail": "Please request a new reset mail...",
"profile-deleted": "Profile deleted!", "please-wait-a-moment-your-login-is-still-being-processed": "Please wait a moment, your login is still being processed",
"profile-picture": "Profile Picture", "prefix": "Prefix",
"profile-updated": "Profile updated!", "privacy": "Privacy",
"read-license": "Read License", "privacy-loading": "Privacy loading...",
"receipt-needed": "Receipt needed", "profile": "Profile",
"repo_link": "Link", "profile-deleted": "Profile deleted!",
"request-a-new-reset-mail": "Request a new reset mail", "profile-picture": "Profile Picture",
"reset-my-password": "Reset my password", "profile-updated": "Profile updated!",
"reset-password": "Reset your password", "read-license": "Read License",
"runner": "Runner", "receipt-needed": "Receipt needed",
"runner-added": "Runner added", "repo_link": "Link",
"runner-deleted": "runner deleted", "request-a-new-reset-mail": "Request a new reset mail",
"runner-import": "Runner Import", "reset-my-password": "Reset my password",
"runner-is-being-added": "Runner is being added...", "reset-password": "Reset your password",
"runner-updated": "Runner updated!", "runner": "Runner",
"runnercards": "Runnercards", "runner-added": "Runner added",
"runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"", "runner-deleted": "runner deleted",
"runners": "Runners", "runner-import": "Runner Import",
"runners-are-being-imported": "Runners are being imported...", "runner-is-being-added": "Runner is being added...",
"runners-are-being-loaded": "runners are being loaded...", "runner-updated": "Runner updated!",
"save": "Save", "runnercards": "Runnercards",
"save-changes": "Save Changes", "runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"",
"scan-added": "Scan added", "runners": "Runners",
"scan-deleted": "scan deleted", "runners-are-being-imported": "Runners are being imported...",
"scan-is-being-updated": "Scan is being updated", "runners-are-being-loaded": "runners are being loaded...",
"scan-with-fixed-distance": "Scan with fixed distance", "save": "Save",
"scans": "Scans", "save-changes": "Save Changes",
"scans-are-being-loaded": "Scans are being loaded", "scan-added": "Scan added",
"scanstation": "Scanstation", "scan-deleted": "scan deleted",
"scanstation-added": "Scanstation added", "scan-is-being-updated": "Scan is being updated",
"scanstation-is-being-added": "Adding scanstation...", "scan-with-fixed-distance": "Scan with fixed distance",
"scanstations": "Scanstations", "scans": "Scans",
"scanstations-are-being-loaded": "Loading scanstations...", "scans-are-being-loaded": "Scans are being loaded",
"search-for-an-organization-by-name-or-id": "Search for an organization (by name or id)", "scanstation": "Scanstation",
"search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or id)", "scanstation-added": "Scanstation added",
"search-for-donor-name-or-id": "Search for donor (by name or id)", "scanstation-is-being-added": "Adding scanstation...",
"search-for-permission": "Search for permission", "scanstations": "Scanstations",
"search-for-runner-by-name-or-id": "Search for runner (by name or id)", "scanstations-are-being-loaded": "Loading scanstations...",
"select-all": "select all", "search-for-an-organization-by-name-or-id": "Search for an organization (by name or id)",
"select-language": "Select language", "search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or id)",
"selfservice-registration": "Selfservice registration", "search-for-donor-name-or-id": "Search for donor (by name or id)",
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services", "search-for-permission": "Search for permission",
"set-the-user-active-inactive": "set the user active/ inactive", "search-for-runner-by-name-or-id": "Search for runner (by name or id)",
"settings": "Settings", "select-all": "select all",
"settings-for-your-profile": "Settings for your profile", "select-language": "Select language",
"something-about-the-group": "Something about the group...", "selfservice-registration": "Selfservice registration",
"sponsoring-quittungs-liste_herunterladen": "Download donor receipt list", "send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
"sponsorings": "Sponsorings", "set-the-user-active-inactive": "set the user active/ inactive",
"station-deleted": "station deleted", "settings": "Settings",
"stats-are-being-loaded": "stats are being loaded...", "settings-for-your-profile": "Settings for your profile",
"statsclient-deleted": "Deleted statsclient", "something-about-the-group": "Something about the group...",
"statsclient-is-being-added": "Statsclient is being added...", "sponsoring-quittungs-liste_herunterladen": "Download donor receipt list",
"statsclients": "Statsclients (aka Beamershow)", "sponsorings": "Sponsorings",
"statsclients-are-being-loaded": "Loading statsclients", "station-deleted": "station deleted",
"status": "Status", "stats-are-being-loaded": "stats are being loaded...",
"stuff-that-could-harm-your-profile": "Stuff that could harm your profile", "statsclient-deleted": "Deleted statsclient",
"successful-password-reset": "Successful password reset!", "statsclient-is-being-added": "Statsclient is being added...",
"team": "Team", "statsclients": "Statsclients (aka Beamershow)",
"team-added": "Team added", "statsclients-are-being-loaded": "Loading statsclients",
"team-deleted": "Team deleted", "status": "Status",
"team-detail-is-being-loaded": "team detail is being loaded...", "stuff-that-could-harm-your-profile": "Stuff that could harm your profile",
"team-is-being-added": "Team is being added...", "successful-password-reset": "Successful password reset!",
"team-name": "Team name", "team": "Team",
"team-name-is-required": "team name is required", "team-added": "Team added",
"teams": "Teams", "team-deleted": "Team deleted",
"teams-are-being-loaded": "teams are being loaded...", "team-detail-is-being-loaded": "team detail is being loaded...",
"the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "the provided phone number is invalid.<br />please enter a valid international number...", "team-is-being-added": "Team is being added...",
"the-scans-distance-must-be-greater-than-0m": "The scan's distance must be greater than 0m", "team-name": "Team name",
"the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "The scanstation api token will only get displayed once - you won't be able to change or view it again!", "team-name-is-required": "team name is required",
"the-statsclient-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "The statsclient api token will only get displayed once - you won't be able to change or view it again!", "teams": "Teams",
"there-are-no-cards-yet": "There are no cards yet.", "teams-are-being-loaded": "teams are being loaded...",
"there-are-no-contacts-added-yet": "There are no contacts added yet.", "the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "the provided phone number is invalid.<br />please enter a valid international number...",
"there-are-no-donations-yet": "There are no donations yet", "the-scans-distance-must-be-greater-than-0m": "The scan's distance must be greater than 0m",
"there-are-no-donors-yet": "There are no donors yet", "the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "The scanstation api token will only get displayed once - you won't be able to change or view it again!",
"there-are-no-groups-yet": "There are no groups yet", "the-statsclient-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "The statsclient api token will only get displayed once - you won't be able to change or view it again!",
"there-are-no-organizations-added-yet": "There are no organizations added yet.", "there-are-no-cards-yet": "There are no cards yet.",
"there-are-no-runners-added-yet": "There are no runners added yet.", "there-are-no-contacts-added-yet": "There are no contacts added yet.",
"there-are-no-scans-yet": "There are no scans yet", "there-are-no-donations-yet": "There are no donations yet",
"there-are-no-teams-added-yet": "There are no teams added yet.", "there-are-no-donors-yet": "There are no donors yet",
"there-are-no-users-added-yet": "There are no users added yet.", "there-are-no-groups-yet": "There are no groups yet",
"this-card-is": "This card is", "there-are-no-organizations-added-yet": "There are no organizations added yet.",
"this-might-take-a-moment": "This might take a moment 👀", "there-are-no-runners-added-yet": "There are no runners added yet.",
"this-scanstation-is": "This scanstation is", "there-are-no-scans-yet": "There are no scans yet",
"timestamp": "timestamp", "there-are-no-teams-added-yet": "There are no teams added yet.",
"token": "Token", "there-are-no-users-added-yet": "There are no users added yet.",
"total-distance": "total distance", "this-card-is": "This card is",
"total-donation-amount": "total donation amount", "this-might-take-a-moment": "This might take a moment 👀",
"total-donations": "total donations", "this-scanstation-is": "This scanstation is",
"total-paid-amount": "Total paid amount", "timestamp": "timestamp",
"total-scans": "total scans", "token": "Token",
"total_donation_amount_in_eur": "Total donation amount in €", "total-distance": "total distance",
"track": "Track", "total-donation-amount": "total donation amount",
"track-added": "Track added", "total-donation-count": "total donations (count)",
"track-data-is-being-loaded": "Track data is being loaded", "total-donations": "total donations",
"track-is-being-added": "Track is being added...", "total-donors": "total donors",
"track-is-being-updated": "Track is being updated...", "total-paid-amount": "Total paid amount",
"track-length-in-m": "Track Length in m", "total-scans": "total scans",
"track-length-must-be-greater-than-0": "Track length must be greater than 0", "total_donation_amount_in_eur": "Total donation amount in ",
"track-name": "Track name", "track": "Track",
"track-name-must-not-be-empty": "Track name must not be empty", "track-added": "Track added",
"track-was-updated": "Track was updated!", "track-data-is-being-loaded": "Track data is being loaded",
"tracks": "Tracks", "track-is-being-added": "Track is being added...",
"unpaid": "Unpaid", "track-is-being-updated": "Track is being updated...",
"update-card": "Update Card", "track-length-in-m": "Track Length in m",
"update-password": "Update password", "track-length-must-be-greater-than-0": "Track length must be greater than 0",
"updated-contact": "Updated contact!", "track-name": "Track name",
"updated-donor": "updated donor", "track-name-must-not-be-empty": "Track name must not be empty",
"updated-organization": "updated organization", "track-was-updated": "Track was updated!",
"updated-scan": "updated scan", "tracks": "Tracks",
"updated-team": "Updated team", "unpaid": "Unpaid",
"updateing-group": "updateing group...", "update-card": "Update Card",
"updating-card": "Updating card", "update-password": "Update password",
"updating-donation": "Updating donation", "updated-contact": "Updated contact!",
"updating-organization": "updating organization", "updated-donor": "updated donor",
"updating-permissions": "updating permissions...", "updated-organization": "updated organization",
"updating-runner": "Updating runner...", "updated-scan": "updated scan",
"updating-team": "Updating team", "updated-team": "Updated team",
"updating-user": "updating user...", "updateing-group": "updateing group...",
"updating-your-profile": "Updating your profile...", "updating-card": "Updating card",
"user-added": "User added", "updating-donation": "Updating donation",
"user-groups": "User Groups", "updating-organization": "updating organization",
"user-is-being-added": "User is being added...", "updating-permissions": "updating permissions...",
"user-updated": "User updated", "updating-runner": "Updating runner...",
"username": "Username", "updating-team": "Updating team",
"users": "Users", "updating-user": "updating user...",
"valid": "Valid", "updating-your-profile": "Updating your profile...",
"valid-city-is-required": "Valid city is required", "user-added": "User added",
"valid-email-is-required": "valid email is required", "user-groups": "User Groups",
"valid-international-phone-number-is-required": "valid international phone number is required...", "user-is-being-added": "User is being added...",
"valid-zipcode-postal-code-is-required": "Valid zipcode/ postal code is required", "user-updated": "User updated",
"verfuegbare": "availdable", "username": "Username",
"welcome_wavinghand": "Welcome 👋", "users": "Users",
"yes-i-copied-the-token": "Yes, I copied the token", "valid": "Valid",
"you-are-going-to-loose-all-permissions-and-access-to-the-runner-system": "You are going to loose all permissions and access to the runner system!", "valid-city-is-required": "Valid city is required",
"you-can-enter-the-donations-paid-amount-manually-or-use-the-max-button-to-use-the-donations-exact-amount": "You can enter the donation's paid amount manually or use the MAX button to use the donation's exact amount.", "valid-email-is-required": "valid email is required",
"you-can-now-use-your-new-password-to-log-in-to-your-account": "You can now use your new password to log in to your account! 🎉", "valid-international-phone-number-is-required": "valid international phone number is required...",
"you-can-provide-a-runner-but-you-dont-have-to": "You can provide a runner, but you don't have to.", "valid-zipcode-postal-code-is-required": "Valid zipcode/ postal code is required",
"you-dont-have-any-scanclients-yet": "You don't have any statsclients yet", "verfuegbare": "availdable",
"you-dont-have-any-scanstations-yet": "You don't have any scanstations yet", "welcome_wavinghand": "Welcome 👋",
"you-have-to-provide-an-organization": "You have to provide an organization", "yes-i-copied-the-token": "Yes, I copied the token",
"you-have-to-save-your-changes-to-generate-a-link": "You have to save your changes to generate a link.", "you-are-going-to-loose-all-permissions-and-access-to-the-runner-system": "You are going to loose all permissions and access to the runner system!",
"you-must-create-at-least-one-card-or-cancel": "You must create at least one card (or cancel).", "you-can-enter-the-donations-paid-amount-manually-or-use-the-max-button-to-use-the-donations-exact-amount": "You can enter the donation's paid amount manually or use the MAX button to use the donation's exact amount.",
"zip-postal-code": "ZIP/ postal code", "you-can-now-use-your-new-password-to-log-in-to-your-account": "You can now use your new password to log in to your account! 🎉",
"config-codes": "Config codes", "you-can-provide-a-runner-but-you-dont-have-to": "You can provide a runner, but you don't have to.",
"api-endpoint": "API-Endpoint" "you-dont-have-any-scanclients-yet": "You don't have any statsclients yet",
"you-dont-have-any-scanstations-yet": "You don't have any scanstations yet",
"you-have-to-provide-an-organization": "You have to provide an organization",
"you-have-to-save-your-changes-to-generate-a-link": "You have to save your changes to generate a link.",
"you-must-create-at-least-one-card-or-cancel": "You must create at least one card (or cancel).",
"zip-postal-code": "ZIP/ postal code"
} }