Compare commits

...

15 Commits

Author SHA1 Message Date
868dc3f7e2 chore(release): 1.12.2
All checks were successful
Build release images / build-container (push) Successful in 1m3s
2025-04-28 21:12:35 +02:00
9e8c236281 feat(cardassignment): Now with hand scanner support 2025-04-28 21:07:42 +02:00
827fb317bc chore(release): 1.12.1
All checks were successful
Build release images / build-container (push) Successful in 1m1s
2025-04-28 20:08:44 +02:00
edd5da89a7 fix(donations): Move amount to extra line 2025-04-28 20:08:08 +02:00
27187b428d fix(donations): Support anon donations in deletion modal 2025-04-28 20:06:27 +02:00
e28f543d89 feat(donation): Use new endpoint for creating anon donations 2025-04-28 20:06:07 +02:00
1ec8e2186b chore(deps): Fresh lock 2025-04-28 20:05:21 +02:00
657fb04f1b refactor(i18n): Shortened translation 2025-04-28 19:57:28 +02:00
dc1e6b7a67 fix(donations): Translate modal title 2025-04-28 19:56:47 +02:00
77a432817e refactor(i18n): Update translations 2025-04-28 19:56:00 +02:00
31a4ff9d90 fix(donations): Remove paid from anon donations 2025-04-28 19:55:47 +02:00
cb315d94fd chore(deps): Bump @odit/lfk-client-js 2025-04-28 19:52:39 +02:00
32f72df105 fix(donations): Don't show enter payment for anon donations 2025-04-28 19:40:57 +02:00
724e84441e feat(shared): Hide link while keeping width 2025-04-28 19:39:02 +02:00
ecd418c5db fix(donations): Don't show details for anon donations 2025-04-28 19:38:43 +02:00
12 changed files with 613 additions and 528 deletions

View File

@@ -2,10 +2,35 @@
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.12.2](https://git.odit.services/lfk/frontend/compare/1.12.1...1.12.2)
- feat(cardassignment): Now with hand scanner support [`9e8c236`](https://git.odit.services/lfk/frontend/commit/9e8c236281f6686318c27dcb1bd02dfbc2b30ee8)
#### [1.12.1](https://git.odit.services/lfk/frontend/compare/1.12.0...1.12.1)
> 28 April 2025
- chore(release): 1.12.1 [`827fb31`](https://git.odit.services/lfk/frontend/commit/827fb317bc946268e4a1d60b15f3805b67b240f6)
- fix(donations): Don't show enter payment for anon donations [`32f72df`](https://git.odit.services/lfk/frontend/commit/32f72df10583a08efb26e0983c0c5c829ab03e19)
- chore(deps): Fresh lock [`1ec8e21`](https://git.odit.services/lfk/frontend/commit/1ec8e2186bdcd69c2acbc785feef4927973bc986)
- fix(donations): Support anon donations in deletion modal [`27187b4`](https://git.odit.services/lfk/frontend/commit/27187b428da1e757f85392d77d49670f51a19829)
- fix(donations): Don't show details for anon donations [`ecd418c`](https://git.odit.services/lfk/frontend/commit/ecd418c5db0910d64cdf5336d72a10ebff38e065)
- refactor(i18n): Update translations [`77a4328`](https://git.odit.services/lfk/frontend/commit/77a432817ef644ff1be8a5ebcd284b7d67f742bd)
- fix(donations): Remove paid from anon donations [`31a4ff9`](https://git.odit.services/lfk/frontend/commit/31a4ff9d909742df3ed3d6cecae57870e287afcc)
- fix(donations): Move amount to extra line [`edd5da8`](https://git.odit.services/lfk/frontend/commit/edd5da89a7e741d48078125f68b6dd6d3d88a7a1)
- refactor(i18n): Shortened translation [`657fb04`](https://git.odit.services/lfk/frontend/commit/657fb04f1b5b439ef5fac834740ba00548b758de)
- feat(donation): Use new endpoint for creating anon donations [`e28f543`](https://git.odit.services/lfk/frontend/commit/e28f543d89efff80a84131df59bfb26a5ea92d14)
- fix(donations): Translate modal title [`dc1e6b7`](https://git.odit.services/lfk/frontend/commit/dc1e6b7a67c4761a007ffe3b71fd851fb569fb7c)
- chore(deps): Bump @odit/lfk-client-js [`cb315d9`](https://git.odit.services/lfk/frontend/commit/cb315d94fd2331bd49aa6d54b9ca0bfbf11f00d9)
- feat(shared): Hide link while keeping width [`724e844`](https://git.odit.services/lfk/frontend/commit/724e84441e8b71b7d89a8c3804467edebfd58365)
#### [1.12.0](https://git.odit.services/lfk/frontend/compare/1.11.5...1.12.0) #### [1.12.0](https://git.odit.services/lfk/frontend/compare/1.11.5...1.12.0)
> 28 April 2025
- feat: anonymous donations [`9c03e35`](https://git.odit.services/lfk/frontend/commit/9c03e359a4e8f43452475b02bcabcb354987ab75) - feat: anonymous donations [`9c03e35`](https://git.odit.services/lfk/frontend/commit/9c03e359a4e8f43452475b02bcabcb354987ab75)
- refactor: use modern tailwindcss features [`1505080`](https://git.odit.services/lfk/frontend/commit/1505080afdd8b272b76584e2777df732001ce004) - refactor: use modern tailwindcss features [`1505080`](https://git.odit.services/lfk/frontend/commit/1505080afdd8b272b76584e2777df732001ce004)
- chore(release): 1.12.0 [`5dcb4cb`](https://git.odit.services/lfk/frontend/commit/5dcb4cb508b204c5634804811a9f37db78e764ce)
#### [1.11.5](https://git.odit.services/lfk/frontend/compare/1.11.4...1.11.5) #### [1.11.5](https://git.odit.services/lfk/frontend/compare/1.11.4...1.11.5)

View File

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

View File

@@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-frontend", "name": "@odit/lfk-frontend",
"version": "1.12.0", "version": "1.12.2",
"type": "module", "type": "module",
"scripts": { "scripts": {
"i18n-order": "node order.js", "i18n-order": "node order.js",
@@ -43,7 +43,7 @@
"dependencies": { "dependencies": {
"@bwip-js/browser": "^4.6.0", "@bwip-js/browser": "^4.6.0",
"@fontsource/athiti": "^5.2.5", "@fontsource/athiti": "^5.2.5",
"@odit/lfk-client-js": "1.2.4", "@odit/lfk-client-js": "1.2.5",
"@paralleldrive/cuid2": "2.2.2", "@paralleldrive/cuid2": "2.2.2",
"@tailwindcss/vite": "^4.1.4", "@tailwindcss/vite": "^4.1.4",
"@tanstack/svelte-table": "8.9.1", "@tanstack/svelte-table": "8.9.1",

10
pnpm-lock.yaml generated
View File

@@ -15,8 +15,8 @@ importers:
specifier: ^5.2.5 specifier: ^5.2.5
version: 5.2.5 version: 5.2.5
'@odit/lfk-client-js': '@odit/lfk-client-js':
specifier: 1.2.4 specifier: 1.2.5
version: 1.2.4 version: 1.2.5
'@paralleldrive/cuid2': '@paralleldrive/cuid2':
specifier: 2.2.2 specifier: 2.2.2
version: 2.2.2 version: 2.2.2
@@ -491,8 +491,8 @@ packages:
'@octokit/types@13.10.0': '@octokit/types@13.10.0':
resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==}
'@odit/lfk-client-js@1.2.4': '@odit/lfk-client-js@1.2.5':
resolution: {integrity: sha512-eJRsjtpMm/VsQ1v2I+inMWCZmzL+WoOvsA+hj8IGsyCVn0td+z/HAwQ0SuXXNZpLPL3qSlENHXjFNrgztExEgA==} resolution: {integrity: sha512-a5vwqpjFXB5cVOCmjC/tZVi9OXJS8aMesNidSqwK2cwA/oC5yTJAqxKXGDhq9k/JLLipVGDJdaKMYmYVzRWkgA==}
'@odit/license-exporter@0.2.0': '@odit/license-exporter@0.2.0':
resolution: {integrity: sha512-RRyfQzDLoyLQlGSd8ThJQ3h0fiCe4tkmm935AUvSVQWP+p88FcnI4iaktKBJJVBnIpDhkv/7sDSA5dFc/QMM5w==} resolution: {integrity: sha512-RRyfQzDLoyLQlGSd8ThJQ3h0fiCe4tkmm935AUvSVQWP+p88FcnI4iaktKBJJVBnIpDhkv/7sDSA5dFc/QMM5w==}
@@ -2412,7 +2412,7 @@ snapshots:
dependencies: dependencies:
'@octokit/openapi-types': 24.2.0 '@octokit/openapi-types': 24.2.0
'@odit/lfk-client-js@1.2.4': {} '@odit/lfk-client-js@1.2.5': {}
'@odit/license-exporter@0.2.0': '@odit/license-exporter@0.2.0':
dependencies: dependencies:

View File

@@ -75,12 +75,8 @@
} else if (type === "anonymous") { } else if (type === "anonymous") {
let postdata = { let postdata = {
amount: amount_cent, amount: amount_cent,
paidAmount: 0,
}; };
if (is_paid) { DonationService.donationControllerPostAnonymous(postdata)
postdata.paidAmount = amount_cent;
}
DonationService.donationControllerPostFixed(postdata)
.then((result) => { .then((result) => {
amount_input = 0; amount_input = 0;
modal_open = false; modal_open = false;
@@ -179,7 +175,7 @@
</div> </div>
<div class="mt-3"> <div class="mt-3">
<h3 class="text-xl leading-6 font-medium text-neutral-900"> <h3 class="text-xl leading-6 font-medium text-neutral-900">
Sponsoring erstellen {$_("add-donation")}
</h3> </h3>
<nav <nav
class="relative z-0 flex border border-neutral-200 rounded-xl overflow-hidden mb-2" class="relative z-0 flex border border-neutral-200 rounded-xl overflow-hidden mb-2"
@@ -337,7 +333,7 @@
{/if} {/if}
</div> </div>
{/if} {/if}
{#if type === "fixed" || type === "anonymous"} {#if type === "fixed"}
<div class="flex"> <div class="flex">
<input <input
bind:checked={is_paid} bind:checked={is_paid}

View File

@@ -13,6 +13,7 @@
firstname: "", firstname: "",
lastname: "", lastname: "",
}, },
amount: 0,
}; };
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
onMount(() => { onMount(() => {
@@ -86,8 +87,12 @@
</h3> </h3>
<div class="w-full"> <div class="w-full">
<span class="inline-block" <span class="inline-block"
><b>{$_("donor")}</b>: {delete_donation.donor.firstname} >{#if delete_donation.donor}<b>{$_("donor")}</b>: {delete_donation.donor.firstname}
{delete_donation.donor.lastname}</span {delete_donation.donor.lastname}{:else}{$_("anonymer_sponsor")}{/if}
<br>
<b>{$_("amount")}</b>: {`${(delete_donation.amount / 100)
.toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}€`}</span
> >
</div> </div>
</div> </div>

View File

@@ -9,10 +9,15 @@
export let paymentAction; export let paymentAction;
</script> </script>
{#if paymentAction}
<button <button
on:click={paymentAction} on:click={paymentAction}
class="text-[#025a21] hover:text-green-900 mr-4">{$_("enter-payment")}</button class="text-[#025a21] hover:text-green-900 mr-4">{$_("enter-payment")}</button
> >
{:else}
<span class="inline-block opacity-0 cursor-default mr-4" style="">{$_("enter-payment")}</span>
{/if}
<TableActions <TableActions
bind:detailsAction bind:detailsAction
bind:detailsLink bind:detailsLink

View File

@@ -112,18 +112,25 @@
accessorKey: "actions", accessorKey: "actions",
header: () => $_("action"), header: () => $_("action"),
cell: (info) => { cell: (info) => {
let detailsLink
let paymentAction
if (info.row.original.donor != undefined){
detailsLink = `./${info.row.original.id}`
paymentAction = () => {
active_edits = current_donations.filter(
(r) => r.id == info.row.original.id
);
}
}
return renderComponent(DonationTableAction, { return renderComponent(DonationTableAction, {
detailsLink: `./${info.row.original.id}`, detailsLink: detailsLink,
deleteAction: () => { deleteAction: () => {
active_deletes = current_donations.filter( active_deletes = current_donations.filter(
(r) => r.id == info.row.original.id (r) => r.id == info.row.original.id
); );
}, },
paymentAction: () => { paymentAction: paymentAction,
active_edits = current_donations.filter(
(r) => r.id == info.row.original.id
);
},
deleteEnabled: deleteEnabled:
store.state.jwtinfo.userdetails.permissions.includes( store.state.jwtinfo.userdetails.permissions.includes(
"DONATION:DELETE" "DONATION:DELETE"

View File

@@ -1,16 +1,111 @@
<script> <script>
import { _ } from "svelte-i18n"; import { _, time } from "svelte-i18n";
import { RunnerCardService, RunnerService } from "@odit/lfk-client-js"; import { RunnerCardService, RunnerService } from "@odit/lfk-client-js";
import QrCodeScanner from "./QrCodeScanner.svelte"; import QrCodeScanner from "./QrCodeScanner.svelte";
import { onMount } from "svelte";
let state = "scan_runner"; let state = "scan_runner";
let runnerinfo = { id: 0, firstname: "", lastname: "" }; let runnerinfo = { id: 0, firstname: "", lastname: "" };
let cardCode = ""; let cardCode = "";
let scannerActive = true; let scannerActive = true;
let barcodeInput;
let nextButton;
let tryAgainButton;
function resetAll() { function resetAll() {
state = "scan_runner"; state = "scan_runner";
runnerinfo = { id: 0, firstname: "", lastname: "" }; runnerinfo = { id: 0, firstname: "", lastname: "" };
cardCode = ""; cardCode = "";
scannerActive = true; scannerActive = true;
setTimeout(() => {
barcodeInput && barcodeInput.focus();
}, 100);
}
onMount(() => {
if (barcodeInput) {
barcodeInput.focus();
}
});
function handleInput(input) {
if (runnerinfo.id === 0) {
new Audio("/beep.mp3").play();
if (input.includes("https://portal.lauf-fuer-kaya.de/profile/")) {
const runnerID = JSON.parse(
atob(
input
.replace("https://portal.lauf-fuer-kaya.de/profile/", "")
.split(".")[1]
)
).id;
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
setTimeout(() => {
tryAgainButton && tryAgainButton.focus();
}, 100);
// resetAll();
});
} else {
const runnerID = parseInt(input);
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
setTimeout(() => {
tryAgainButton && tryAgainButton.focus();
}, 100);
// resetAll();
});
}
} else {
if (`${input}`.length > 10) {
cardCode = input;
new Audio("/beep.mp3").play();
state = "assigning";
RunnerCardService.runnerCardControllerGetAll()
.then((cards) => {
// console.log(cards);
const card = cards.find((c) => c.code === cardCode);
if (card) {
console.log("card found", card);
RunnerCardService.runnerCardControllerPut(card.id, {
enabled: true,
id: card.id,
runner: runnerinfo.id,
})
.then(() => {
state = "done";
setTimeout(() => {
nextButton && nextButton.focus();
}, 100);
})
.catch(() => {
state = "error_card";
scannerActive = false;
setTimeout(() => {
tryAgainButton && tryAgainButton.focus();
}, 100);
});
} else {
console.log("card not found");
// scannerActive = true;
state = "error_card";
scannerActive = false;
}
})
.catch(() => {
scannerActive = true;
});
}
}
} }
</script> </script>
@@ -257,6 +352,7 @@
on:click={() => { on:click={() => {
resetAll(); resetAll();
}} }}
bind:this={nextButton}
type="button" type="button"
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2" class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
> >
@@ -307,6 +403,7 @@
on:click={() => { on:click={() => {
resetAll(); resetAll();
}} }}
bind:this={tryAgainButton}
type="button" type="button"
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2" class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
> >
@@ -397,82 +494,28 @@
} }
scannerActive = false; scannerActive = false;
console.log({ type: "DETECT", code: e.detail.decodedText }); console.log({ type: "DETECT", code: e.detail.decodedText });
if (runnerinfo.id === 0) { handleInput(e.detail.decodedText);
new Audio("/beep.mp3").play();
if (
e.detail.decodedText.includes(
"https://portal.lauf-fuer-kaya.de/profile/"
)
) {
const runnerID = JSON.parse(
atob(
e.detail.decodedText
.replace("https://portal.lauf-fuer-kaya.de/profile/", "")
.split(".")[1]
)
).id;
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
// resetAll();
});
} else {
const runnerID = parseInt(e.detail.decodedText);
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
// resetAll();
});
}
} else {
if (`${e.detail.decodedText}`.length > 10) {
cardCode = e.detail.decodedText;
new Audio("/beep.mp3").play();
state = "assigning";
RunnerCardService.runnerCardControllerGetAll()
.then((cards) => {
// console.log(cards);
const card = cards.find((c) => c.code === cardCode);
if (card) {
console.log("card found", card);
RunnerCardService.runnerCardControllerPut(card.id, {
enabled: true,
id: card.id,
runner: runnerinfo.id,
})
.then(() => {
state = "done";
})
.catch(() => {
state = "error_card";
scannerActive = false;
});
} else {
console.log("card not found");
// scannerActive = true;
state = "error_card";
scannerActive = false;
}
})
.catch(() => {
scannerActive = true;
});
}
}
} }
}} }}
width={320} width={320}
height={320} height={320}
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden" class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden"
/> />
<form
on:submit={(e) => {
handleInput(barcodeInput.value);
barcodeInput.value = "";
e.preventDefault();
}}
class="mt-2"
>
<input
type="text"
placeholder={$_("barcode_scanner")}
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden mt-2"
bind:this={barcodeInput}
/>
</form>
{/if} {/if}
{#if runnerinfo.id !== 0 && state !== "scan_card"} {#if runnerinfo.id !== 0 && state !== "scan_card"}
<button <button

View File

@@ -15,6 +15,8 @@
<button on:click={detailsAction} class="text-indigo-600 hover:text-indigo-900" <button on:click={detailsAction} class="text-indigo-600 hover:text-indigo-900"
>{$_("details")}</button >{$_("details")}</button
> >
{:else}
<span class="inline-block opacity-0 cursor-default" style="">{$_("details")}</span>
{/if} {/if}
{#if deleteEnabled} {#if deleteEnabled}
<button <button

View File

@@ -42,7 +42,7 @@
"amount": "Anzahl", "amount": "Anzahl",
"amount-per-kilometer": "Betrag pro Kilometer", "amount-per-kilometer": "Betrag pro Kilometer",
"anonyme_spende": "Anonyme Spende", "anonyme_spende": "Anonyme Spende",
"anonymer_sponsor": "👻 Anonymer Sponsor", "anonymer_sponsor": "👻 Anonym",
"apartment-suite-etc": "Apartment, Wohnung, etc.", "apartment-suite-etc": "Apartment, Wohnung, etc.",
"api-endpoint": "API-Endpunkt", "api-endpoint": "API-Endpunkt",
"application_name": "Lauf für Kaya! - Admin", "application_name": "Lauf für Kaya! - Admin",
@@ -52,6 +52,7 @@
"available-permissions": "Verfügbar", "available-permissions": "Verfügbar",
"average-distance": "∅ Strecke/Läufer", "average-distance": "∅ Strecke/Läufer",
"average-donation": "∅ Sponsoring", "average-donation": "∅ Sponsoring",
"barcode_scanner": "Scannen mit Handscanner",
"by": "von", "by": "von",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"cancel-delete": "Löschen abbrechen", "cancel-delete": "Löschen abbrechen",

View File

@@ -41,8 +41,8 @@
"already-paid": "Already paid", "already-paid": "Already paid",
"amount": "Amount", "amount": "Amount",
"amount-per-kilometer": "Amount per kilometer", "amount-per-kilometer": "Amount per kilometer",
"anonyme_spende": "Anonymous Donation", "anonyme_spende": "Anonymous",
"anonymer_sponsor": "👻 Anonymous Donor", "anonymer_sponsor": "👻 Anonymous",
"apartment-suite-etc": "Apartment, suite, etc.", "apartment-suite-etc": "Apartment, suite, etc.",
"api-endpoint": "API-Endpoint", "api-endpoint": "API-Endpoint",
"application_name": "Lauf für Kaya! - Admin", "application_name": "Lauf für Kaya! - Admin",
@@ -52,6 +52,7 @@
"available-permissions": "available", "available-permissions": "available",
"average-distance": "∅ distance", "average-distance": "∅ distance",
"average-donation": "∅ donation", "average-donation": "∅ donation",
"barcode_scanner": "Scan via barcode scanner",
"by": "by", "by": "by",
"cancel": "Cancel", "cancel": "Cancel",
"cancel-delete": "Cancel Delete", "cancel-delete": "Cancel Delete",
@@ -226,7 +227,7 @@
"error_on_login": "Error on login", "error_on_login": "Error on login",
"everything-concerning-your-profile": "Everything concerning your profile", "everything-concerning-your-profile": "Everything concerning your profile",
"faq": "FAQ", "faq": "FAQ",
"festbetrag": "Fixed Donation", "festbetrag": "Fixed amount",
"filename_sponsoringquittungsliste": "DonorReceiptList", "filename_sponsoringquittungsliste": "DonorReceiptList",
"filter-by-organization-team": "Filter by Organization/ Team", "filter-by-organization-team": "Filter by Organization/ Team",
"first-name": "First name", "first-name": "First name",
@@ -421,7 +422,7 @@
"settings": "Settings", "settings": "Settings",
"settings-for-your-profile": "Settings for your profile", "settings-for-your-profile": "Settings for your profile",
"something-about-the-group": "Something about the group...", "something-about-the-group": "Something about the group...",
"spende_pro_km": "donation per km", "spende_pro_km": "Per Kilometer",
"sponsoring-quittungs-liste_herunterladen": "Download donor receipt list", "sponsoring-quittungs-liste_herunterladen": "Download donor receipt list",
"sponsorings": "Sponsorings", "sponsorings": "Sponsorings",
"station-deleted": "station deleted", "station-deleted": "station deleted",