diff --git a/package.json b/package.json index 206e9217..573c8c37 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "license": "CC-BY-NC-SA-4.0", "dependencies": { - "@odit/lfk-client-js": "0.6.4", + "@odit/lfk-client-js": "0.7.0", "csvtojson": "^2.0.10", "gridjs": "3.3.0", "localforage": "1.9.0", diff --git a/src/App.svelte b/src/App.svelte index 5b78d33f..e13ce05e 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -69,11 +69,11 @@ import Donations from "./components/donations/Donations.svelte"; import DonationDetail from "./components/donations/DonationDetail.svelte"; import GroupDetail from "./components/groups/GroupDetail.svelte"; - import ScanStationsOverview from "./components/scanstations/ScanStationsOverview.svelte"; import ScanStations from "./components/scanstations/ScanStations.svelte"; import ScanStationDetail from "./components/scanstations/ScanStationDetail.svelte"; import Scans from "./components/scans/Scans.svelte"; -import ScanDetail from "./components/scans/ScanDetail.svelte"; + import ScanDetail from "./components/scans/ScanDetail.svelte"; + import Cards from "./components/cards/Cards.svelte"; store.init(); registerSW(); @@ -185,6 +185,14 @@ import ScanDetail from "./components/scans/ScanDetail.svelte"; + + + + + + diff --git a/src/components/cards/AddCardBulkModal.svelte b/src/components/cards/AddCardBulkModal.svelte new file mode 100644 index 00000000..caf93f59 --- /dev/null +++ b/src/components/cards/AddCardBulkModal.svelte @@ -0,0 +1,158 @@ + + +{#if bulk_modal_open} +
{ + bulk_modal_open = false; + }}> +
+ +
+{/if} diff --git a/src/components/cards/AddCardModal.svelte b/src/components/cards/AddCardModal.svelte new file mode 100644 index 00000000..644a6109 --- /dev/null +++ b/src/components/cards/AddCardModal.svelte @@ -0,0 +1,170 @@ + + +{#if modal_open} +
{ + modal_open = false; + }}> +
+ +
+{/if} diff --git a/src/components/cards/Cards.svelte b/src/components/cards/Cards.svelte new file mode 100644 index 00000000..4218a618 --- /dev/null +++ b/src/components/cards/Cards.svelte @@ -0,0 +1,40 @@ + + +
+ + {$_('cards')} + {#if store.state.jwtinfo.userdetails.permissions.includes('CARD:CREATE')} + + + {/if} + + +
+ +{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:CREATE')} + + +{/if} diff --git a/src/components/cards/CardsEmptyState.svelte b/src/components/cards/CardsEmptyState.svelte new file mode 100644 index 00000000..ada94cff --- /dev/null +++ b/src/components/cards/CardsEmptyState.svelte @@ -0,0 +1,12 @@ + + +
+

+ + {$_('there-are-no-cards-yet')}
+ {$_('add-your-first-card')} +

+
diff --git a/src/components/cards/CardsOverview.svelte b/src/components/cards/CardsOverview.svelte new file mode 100644 index 00000000..db4c0a1e --- /dev/null +++ b/src/components/cards/CardsOverview.svelte @@ -0,0 +1,237 @@ + + +{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:UPDATE')} + +{/if} + +{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:GET')} + {#await cards_promise} + + {:then} + {#if current_cards.length === 0} + + {:else} + +
+ +
+
+ + + + + + + + + + + + {#each current_cards as card} + {#if card.code + .toLowerCase() + .includes( + searchvalue.toLowerCase() + ) || card.runner?.firstname + .toLowerCase() + .includes( + searchvalue.toLowerCase() + ) || card.runner?.middlename + .toLowerCase() + .includes( + searchvalue.toLowerCase() + ) || card.runner?.lastname + .toLowerCase() + .includes( + searchvalue.toLowerCase() + ) || should_display_based_on_id(card.id)} + + + + + + + {#if active_deletes[card.id] === true} + + {:else} + + {/if} + + {/if} + {/each} + +
+ { + const newstate = !current_cards.some((r) => r.is_selected === true); + current_cards = current_cards.map((r) => { + r.is_selected = newstate; + return r; + }); + }} + class="underline cursor-pointer select-none">{#if current_cards.some((r) => r.is_selected === true)} + {$_('deselect-all')} + {:else}{$_('select-all')}{/if} + + + {$_('code')} + + {$_('runner')} + + {$_('status')} + + {$_('action')} +
+ + +
{card.code}
+
+
+ {#if card.runner} + {card.runner.firstname} + {card.runner.middlename || ''} + {card.runner.lastname} + {:else}{$_('non-blanko')}{/if} +
+
+
+ {#if card.enabled} + {$_('enabled')} + {:else} + {$_('disabled')} + {/if} +
+
+ + + + + {#if store.state.jwtinfo.userdetails.permissions.includes('CARD:DELETE')} + + {/if} +
+
+ {/if} + {:catch error} +
+ + {$_('general_promise_error')} + {error} + +
+ {/await} +{/if} diff --git a/src/components/cards/cards.svg b/src/components/cards/cards.svg new file mode 100644 index 00000000..bd82462d --- /dev/null +++ b/src/components/cards/cards.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/dashboard/Dashboard.svelte b/src/components/dashboard/Dashboard.svelte index 38505b49..9746938a 100644 --- a/src/components/dashboard/Dashboard.svelte +++ b/src/components/dashboard/Dashboard.svelte @@ -172,6 +172,25 @@ {$_('tracks')} {/if} + {#if store.state.jwtinfo.userdetails.permissions.includes('CARD:GET')} + + + + + {$_('cards')} + + {/if} {#if store.state.jwtinfo.userdetails.permissions.includes('SCAN:GET')} option.firstname + " " + (option.middlename || "") + " " + option.lastname; const promise = RunnerOrganizationService.runnerOrganizationControllerGetOne( @@ -60,14 +64,6 @@ }); let modal_open = false; let delete_org = {}; - document.addEventListener("click", function (e) { - if ( - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown" && - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown:menu" - ) { - sponsoring_contracts_download_open = false; - } - }); function deleteOrganization() { RunnerOrganizationService.runnerOrganizationControllerRemove( original_object.id, @@ -115,55 +111,6 @@ } } export let import_modal_open = false; - async function generateSponsoringContract(locale) { - sponsoring_contracts_download_open = false; - const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners( - original_object.id - ); - const toast = Toastify({ - text: $_("generating-pdf"), - duration: -1, - }).showToast(); - fetch( - `${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(runners), - } - ) - .then((response) => { - if (response.status != "200") { - toast.hideToast(); - Toastify({ - text: $_("pdf-generation-failed"), - duration: 3500, - backgroundColor: - "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", - }).showToast(); - } else { - return response.blob(); - } - }) - .then((blob) => { - const url = window.URL.createObjectURL(blob); - let a = document.createElement("a"); - a.href = url; - a.download = "Sponsorings_" + original_object.name + ".pdf"; - document.body.appendChild(a); - a.click(); - a.remove(); - toast.hideToast(); - Toastify({ - text: $_("pdf-successfully-generated"), - duration: 3500, - backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", - }).showToast(); - }) - .catch((err) => {}); - } {original_object.name} -
-
- -
- {#if sponsoring_contracts_download_open} -
- -
- {/if} -
+ + {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')} -
- {#if sponsoring_contracts_download_open} -
- -
- {/if} -
- {/if} + +
diff --git a/src/components/pdf_generation/GenerateRunnerCards.svelte b/src/components/pdf_generation/GenerateRunnerCards.svelte new file mode 100644 index 00000000..f00e9405 --- /dev/null +++ b/src/components/pdf_generation/GenerateRunnerCards.svelte @@ -0,0 +1,339 @@ + + +{#if cards_show} +
+
+ +
+ {#if cards_dropdown_open} +
+ +
+ {/if} +
+{/if} diff --git a/src/components/pdf_generation/GenerateSponsoringContracts.svelte b/src/components/pdf_generation/GenerateSponsoringContracts.svelte new file mode 100644 index 00000000..6508cab0 --- /dev/null +++ b/src/components/pdf_generation/GenerateSponsoringContracts.svelte @@ -0,0 +1,251 @@ + + +{#if sponsoring_contracts_show} +
+
+ +
+ {#if sponsoring_contracts_download_open} +
+ +
+ {/if} +
+{/if} diff --git a/src/components/runners/RunnerDetail.svelte b/src/components/runners/RunnerDetail.svelte index fda1c21f..b26d2eda 100644 --- a/src/components/runners/RunnerDetail.svelte +++ b/src/components/runners/RunnerDetail.svelte @@ -1,5 +1,7 @@ {#await runner_promise} @@ -207,64 +154,12 @@ }} class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-400 text-base font-medium text-white sm:w-auto sm:text-sm">{$_('cancel')} {/if} -
-
- -
- {#if sponsoring_contracts_download_open} -
- -
- {/if} -
+ + {#if !delete_triggered}
diff --git a/src/components/runners/RunnersOverview.svelte b/src/components/runners/RunnersOverview.svelte index 11214d7f..e2f9946d 100644 --- a/src/components/runners/RunnersOverview.svelte +++ b/src/components/runners/RunnersOverview.svelte @@ -8,7 +8,8 @@ import store from "../../store"; import RunnersEmptyState from "./RunnersEmptyState.svelte"; import Select from "svelte-select"; - import Toastify from "toastify-js"; + import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte"; + import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte"; $: searchvalue = ""; $: active_deletes = []; export let current_runners = []; @@ -20,7 +21,13 @@ $: filter__teams = selectedFilter_teams || []; $: filter__orgs = selectedFilter || []; $: filterGroupIDs = filter__teams.concat(filter__orgs).map((i) => i.value); - $: sponsoring_contracts_download_open = false; + $: sponsoring_contracts_show = current_runners.some( + (r) => r.is_selected === true + ); + $: cards_show = current_runners.some( + (r) => r.is_selected === true + ); + $: generate_runners = current_runners.filter((r) => r.is_selected === true); $: teams = []; $: orgs = []; $: mappedteams = teams.map(function (g) { @@ -31,14 +38,7 @@ return { value: g.id, label: g.name }; }) .concat(mappedteams); - document.addEventListener("click", function (e) { - if ( - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown" && - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown:menu" - ) { - sponsoring_contracts_download_open = false; - } - }); + RunnerTeamService.runnerTeamControllerGetAll().then((val) => { teams = val; }); @@ -51,56 +51,6 @@ } return id.toString() === searchvalue; } - function generateSponsoringContract(locale) { - sponsoring_contracts_download_open = false; - const toast = Toastify({ - text: $_("generating-pdf"), - duration: -1, - }).showToast(); - fetch( - `${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify( - current_runners.filter((r) => r.is_selected === true) - ), - } - ) - .then((response) => { - if (response.status != "200") { - toast.hideToast(); - Toastify({ - text: $_("pdf-generation-failed"), - duration: 3500, - backgroundColor: - "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", - }).showToast(); - } else { - return response.blob(); - } - }) - .then((blob) => { - const url = window.URL.createObjectURL(blob); - let a = document.createElement("a"); - a.href = url; - a.download = "Sponsoring.pdf"; - document.body.appendChild(a); - a.click(); - a.remove(); - toast.hideToast(); - Toastify({ - text: $_("pdf-successfully-generated"), - duration: 3500, - backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", - }).showToast(); - }) - .catch((err) => { - console.error(err); - }); - } {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:GET')} @@ -136,66 +86,12 @@ isMulti={true} />
- {#if current_runners.some((r) => r.is_selected === true)} -
-
- -
- {#if sponsoring_contracts_download_open} -
- -
- {/if} -
- {/if} + +
diff --git a/src/components/teams/TeamDetail.svelte b/src/components/teams/TeamDetail.svelte index ec21a79a..8ead42a3 100644 --- a/src/components/teams/TeamDetail.svelte +++ b/src/components/teams/TeamDetail.svelte @@ -11,7 +11,9 @@ import ImportRunnerModal from "../runners/ImportRunnerModal.svelte"; import PromiseError from "../base/PromiseError.svelte"; import ConfirmTeamDeletion from "./ConfirmTeamDeletion.svelte"; -import Teams from "./Teams.svelte"; + import Teams from "./Teams.svelte"; + import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte"; + import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte"; let [teamdata, original, delete_team, orgs, contacts, modal_open] = [ {}, {}, @@ -26,7 +28,9 @@ import Teams from "./Teams.svelte"; $: save_enabled = !data_changed && teamdata.parentGroup != null; $: data_loaded = false; $: data_changed = JSON.stringify(teamdata) === JSON.stringify(original); - $: sponsoring_contracts_download_open = false; + $: sponsoring_contracts_show = true; + $: cards_show = true; + $: generate_teams = [original]; $: group = {}; $: contact = {}; // @@ -38,32 +42,25 @@ import Teams from "./Teams.svelte"; data_loaded = true; teamdata = Object.assign(teamdata, value); original = Object.assign(original, value); - RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => { - orgs = val.map((r) => { - return { label: r.name, value: r }; - }); - group = orgs.find((g) => g.value.id == teamdata.parentGroup.id); - }); + RunnerOrganizationService.runnerOrganizationControllerGetAll().then( + (val) => { + orgs = val.map((r) => { + return { label: r.name, value: r }; + }); + group = orgs.find((g) => g.value.id == teamdata.parentGroup.id); + } + ); GroupContactService.groupContactControllerGetAll().then((val) => { contacts = val.map((r) => { return { label: getContactLabel(r), value: r }; }); - if(teamdata.contact){ + if (teamdata.contact) { contact = contacts.find((g) => g.value.id == teamdata.contact.id); - } - else{ + } else { contact = null; } }); }); - document.addEventListener("click", function (e) { - if ( - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown" && - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown:menu" - ) { - sponsoring_contracts_download_open = false; - } - }); function deleteTeam() { RunnerTeamService.runnerTeamControllerRemove(original.id, false) .then((resp) => { @@ -101,55 +98,6 @@ import Teams from "./Teams.svelte"; .catch((err) => {}); } } - async function generateSponsoringContract(locale) { - sponsoring_contracts_download_open = false; - const runners = await RunnerTeamService.runnerTeamControllerGetRunners( - teamdata.id - ); - const toast = Toastify({ - text: $_("generating-pdf"), - duration: -1, - }).showToast(); - fetch( - `${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(runners), - } - ) - .then((response) => { - if (response.status != "200") { - toast.hideToast(); - Toastify({ - text: $_("pdf-generation-failed"), - duration: 3500, - backgroundColor: - "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", - }).showToast(); - } else { - return response.blob(); - } - }) - .then((blob) => { - const url = window.URL.createObjectURL(blob); - let a = document.createElement("a"); - a.href = url; - a.download = "Sponsorings_" + teamdata.name + ".pdf"; - document.body.appendChild(a); - a.click(); - a.remove(); - toast.hideToast(); - Toastify({ - text: $_("pdf-successfully-generated"), - duration: 3500, - backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", - }).showToast(); - }) - .catch((err) => {}); - } {original.name} -
-
- -
- {#if sponsoring_contracts_download_open} -
- -
- {/if} -
+ + {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
@@ -380,13 +276,15 @@ import Teams from "./Teams.svelte"; .toLowerCase() .includes( filterText.toLowerCase() - ) || option.id.value.toString().startsWith(filterText.toLowerCase())} + ) || option.id.value + .toString() + .startsWith(filterText.toLowerCase())} items={orgs} showChevron={true} placeholder={$_('search-for-an-organization-by-name-or-id')} noOptionsMessage={$_('no-organizations-found')} bind:selectedValue={group} - on:select={(selectedValue)=> teamdata.parentGroup = selectedValue.detail.value} + on:select={(selectedValue) => (teamdata.parentGroup = selectedValue.detail.value)} on:clear={() => (teamdata.parentGroup = null)} />
diff --git a/src/components/teams/TeamsOverview.svelte b/src/components/teams/TeamsOverview.svelte index 34930117..ff6ed46d 100644 --- a/src/components/teams/TeamsOverview.svelte +++ b/src/components/teams/TeamsOverview.svelte @@ -7,9 +7,17 @@ import TeamsEmptyState from "./TeamsEmptyState.svelte"; import ConfirmTeamDeletion from "./ConfirmTeamDeletion.svelte"; import { clickOutside } from "../base/outsideclick"; + import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte"; + import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte"; $: searchvalue = ""; $: active_deletes = []; - $: sponsoring_contracts_download_open = false; + $: sponsoring_contracts_show = current_teams.some( + (r) => r.is_selected === true + ); + $: cards_show = current_teams.some( + (r) => r.is_selected === true + ); + $: generate_teams = current_teams.filter((r) => r.is_selected === true); export let current_teams = []; let modal_open = false; let delete_team = {}; @@ -19,70 +27,6 @@ teams_promise.then((data) => { usersstore.set(data); }); - document.addEventListener("click", function (e) { - if ( - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown" && - e.target.parentNode?.parentNode?.id != "sponsoring:dropdown:menu" - ) { - sponsoring_contracts_download_open = false; - } - }); - async function generateSponsoringContract(locale) { - sponsoring_contracts_download_open = false; - const teams = current_teams.filter((r) => r.is_selected === true); - const toast = Toastify({ - text: $_("generating-pdfs"), - duration: -1, - }).showToast(); - let count = 0; - for await (const t of teams) { - count++; - const runners = await RunnerTeamService.runnerTeamControllerGetRunners( - t.id - ); - fetch( - `${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(runners), - } - ) - .then((response) => { - if (response.status != "200") { - toast.hideToast(); - Toastify({ - text: $_("pdf-generation-failed"), - duration: 3500, - backgroundColor: - "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", - }).showToast(); - } else { - return response.blob(); - } - }) - .then((blob) => { - const url = window.URL.createObjectURL(blob); - let a = document.createElement("a"); - a.href = url; - a.download = "Sponsorings_" + t.name + ".pdf"; - document.body.appendChild(a); - a.click(); - a.remove(); - if (count === teams.length) { - toast.hideToast(); - Toastify({ - text: $_("pdfs-successfully-generated"), - duration: 3500, - backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", - }).showToast(); - } - }) - .catch((err) => {}); - } - }
- {#if current_teams.some((r) => r.is_selected === true)} -
-
- -
- {#if sponsoring_contracts_download_open} -
{ - sponsoring_contracts_download_open = false; - }}> - -
- {/if} -
- {/if} + +
diff --git a/src/locales/de.json b/src/locales/de.json index 46aa1711..a7da9c96 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -4,11 +4,13 @@ "about": "Über", "action": "Aktionen", "active": "Aktiv", + "add-card": "Karte erstellen", "add-donation": "Sponsoring erstellen", "add-donor": "Sponsor:in erstellen", "add-scan": "Scan erstellen", "add-the-first-scanstation": "Erstelle deine erste Scannerstation.", "add-user-group": "Neue Gruppe erstellen", + "add-your-first-card": "Erstelle deine erste Läuferkarte", "add-your-first-contact": "Erstelle den ersten Kontakt", "add-your-first-donor": "Erstelle die erste Sponsor:in", "add-your-first-group": "Erstelle die erste Gruppe", @@ -19,6 +21,7 @@ "add-your-first-user": "Erstelle die erste Benutzer:in", "add-your-fist-donation": "Erstelle dein erstes Sponsoring", "add-your-fist-scan": "Füge deinen ersten Scan hinzu", + "adding-card": "Karte wird erstellt", "adding-scan": "Scan wird hinzugefügt", "address": "Adresse", "address-is-required": "Du musst eine Adresse angeben", @@ -27,6 +30,7 @@ "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-teams-and-runners-will-be-deleted-too": "Alle assoziierten Teams und Läufer:innen werden auch gelöscht!", + "amount": "Anzahl", "amount-per-kilometer": "Betrag pro Kilometer", "apartment-suite-etc": "Apartment, Wohnung, etc.", "application_name": "Lauf für Kaya! - Admin", @@ -42,11 +46,16 @@ "cancel-keep-organization": "Abbrechen und Organisation bearbeiten", "cancel-keep-team": "Abbrechen, Team behalten", "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-added": "Karte wurde hinzugefügt", + "card-deleted": "Karte gelöscht", + "card-updated": "Karte aktualisiert", + "cards": "Läuferkarten", "change-your-password-here": "Hier kannst du dein Passwort ändern", "changing-your-password": "Passwort wird geändert", "city": "Stadt", "click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren", "close": "Schließen", + "code": "Code", "configure-the-tracks-and-minimum-lap-times": "Bearbeite die Tracks und ihre minimale Rundenzeit", "confirm": "Bestätigen", "confirm-delete": "Löschung Bestätigen", @@ -68,6 +77,7 @@ "count_teams": "Teams (Anzahl)", "create": "Erstellen", "create-a-new": "Erstelle eine neue", + "create-a-new-card": "Neue Läuferkarte erstellen", "create-a-new-contact": "Kontakt erstellen", "create-a-new-distance-donation": "Erstelle ein neues Sponsoring", "create-a-new-donor": "Neue Sponsor:in erstellen", @@ -80,10 +90,14 @@ "create-a-new-track": "Neuen Track erstellen", "create-a-new-user": "Neue Benutzer:in anlegen", "create-a-new-user-group": "Erstelle eine neue Gruppe", + "create-bulk-blanco-cards": "Blankokarten erstellen", + "create-bulk-cards": "Blankokarten erstellen", "create-organization": "Organisation erstellen", "create-team": "Team erstellen", "create-track": "Track erstellen", "create-user": "Benutzer anlegen", + "created-blanco-cards": "Blankokarten wurden erstellt", + "creating-blanco-cards": "Erstelle Blankokarten", "credits": "Credits", "csv_import__class": "Klasse", "csv_import__firstname": "Vorname", @@ -151,10 +165,11 @@ "dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌", "e-mail-adress": "E-Mail-Adresse", "edit": "Bearbeiten", + "edit-a-card": "Läuferkarte bearbeiten", "edit-permissions": "Berechtigungen bearbeiten", "email_address_or_username": "E-Mail-Adresse/ Benutzername", "enabled": "aktiviert", - "enabled_large": "Disabled", + "enabled_large": "Aktiviert", "english": "Englisch", "error-during-import": "Fehler beim Importieren", "error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage", @@ -172,6 +187,7 @@ "geerbte": "geerbte", "general-stats": "Allgemeine Statistiken", "general_promise_error": "😢 Ein unbekannter Fehler ist aufgetreten", + "generate-runnercards": "Läuferkarten generieren", "generate-sponsoring-contract": "Sponsoringvertrag generieren", "generate-sponsoring-contracts": "Sponsoringverträge generieren", "generating-pdf": "Pdf wird generiert...", @@ -190,6 +206,7 @@ "groups-are-being-loaded": "Gruppen werden geladen", "home": "Start", "icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:", + "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.", "import-finished": "Import abgeschlossen", "import-runners": "Läufer:innen importieren", "import__target-organization": "Ziel Organisation", @@ -200,6 +217,7 @@ "internal-error": "Interner Fehler", "invalid": "Ungültig", "invalid-mail-reset": "Das ist keine gültige E-Mail", + "just-enter-how-many-you-want-and-the-system-will-create-them": "Gebe einfach ein, wie viele Blankokarten das System erstellen soll.", "laeufer-hinzufuegen": "Läufer:in hinzufügen", "laeufer-importieren": "Läufer:innen importieren", "laptime": "Rundenzeit", @@ -208,6 +226,7 @@ "lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.", "license": "Lizenz", "licenses-are-being-loaded": "Lizenzen werden geladen...", + "loading-cards": "Läuferkarten werden geladen", "loading-contact-details": "Kontaktdaten werden geladen ...", "loading-donation-details": "Lade Sponsoringdetails", "loading-donor-details": "Lade Details", @@ -237,6 +256,7 @@ "no-organizations-found": "Keine Organisationen gefunden", "no-runners-found": "Keine Läufer:innen gefunden", "no-tracks-added-yet": "Es wurden noch keine Tracks erstellt.", + "non-blanko": "Keine/Blankokarte", "organization": "Organisation", "organization-added": "Organisation hinzugefügt", "organization-deleted": "Organisation gelöscht", @@ -334,6 +354,7 @@ "the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "Die angegebene Telefonnummer ist nicht korrekt.
Bitte gebe eine Telefonnummer im internationalen Format an...", "the-scans-distance-must-be-greater-than-0m": "Die Distanz muss größer als 0m sein.", "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-cards-yet": "Es gibt noch keine Läuferkarten.", "there-are-no-contacts-added-yet": "Es wurden noch keine Kontakte hinzugefügt.", "there-are-no-donations-yet": "Es gibt noch keine Sponsorings", "there-are-no-donors-yet": "Es gibt noch keine Sponsor:innen", @@ -343,6 +364,7 @@ "there-are-no-scans-yet": "Es gibt noch keine Scans", "there-are-no-teams-added-yet": "Es wurden noch keine Teams hinzugefügt.", "there-are-no-users-added-yet": "Es wurden noch keine Benutzer hinzugefügt.", + "this-card-is": "Diese Karte ist", "this-might-take-a-moment": "Das könnte einen kleinen Moment dauern", "this-scanstation-is": "Diese Station ist", "token": "Token", @@ -365,6 +387,7 @@ "updated-organization": "Organisation wurde aktualisiert", "updated-scan": "Scan wurde aktualisiert", "updateing-group": "Gruppe wird aktualisiert...", + "updating-card": "Karte wird aktualisiert", "updating-organization": "Organisation wird aktualisiert", "updating-permissions": "Berechtigungen werden aktualisiert...", "updating-runner": "Läufer:in wird aktualisiert.", @@ -386,7 +409,9 @@ "yes-i-copied-the-token": "Ja, ich habe den Token kopiert", "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-can-now-use-your-new-password-to-log-in-to-your-account": "Du kannst dich jetzt mit deinem neuen Passwort anmelden! 🎉", + "you-can-provide-a-runner-but-you-dont-have-to": "Du kannst eine Läufer:in angeben, musst aber nicht.", "you-dont-have-any-scanstations-yet": "Es gibt noch keine Scannerstationen", "you-have-to-provide-an-organization": "Du musst eine Organisation angeben", + "you-must-create-at-least-one-card-or-cancel": "Du musst mindestens eine Blankokarte erstellen (oder abbrechen).", "zip-postal-code": "Postleitzahl" } \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json index 07991ac5..81072345 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -4,11 +4,13 @@ "about": "About", "action": "Action", "active": "Active", + "add-card": "Add Card", "add-donation": "Add donation", "add-donor": "add donor", "add-scan": "Add scan", "add-the-first-scanstation": "Add your first scanstation.", "add-user-group": "Add User Group", + "add-your-first-card": "Add your first card", "add-your-first-contact": "Add your first contact", "add-your-first-donor": "add your first donor", "add-your-first-group": "Add your first group", @@ -19,6 +21,7 @@ "add-your-first-user": "Add your first user", "add-your-fist-donation": "Add your fist donation", "add-your-fist-scan": "Add your fist scan", + "adding-card": "Adding Card", "adding-scan": "Adding Scan", "address": "Address", "address-is-required": "Address is required", @@ -27,6 +30,7 @@ "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-teams-and-runners-will-be-deleted-too": "All associated teams and runners will be deleted too!", + "amount": "Amount", "amount-per-kilometer": "Amount per kilometer", "apartment-suite-etc": "Apartment, suite, etc.", "application_name": "Lauf für Kaya! - Admin", @@ -42,11 +46,16 @@ "cancel-keep-organization": "Cancel, keep organization", "cancel-keep-team": "Cancel, keep team", "cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity", + "card-added": "Card added", + "card-deleted": "Card deleted", + "card-updated": "Card updated", + "cards": "Cards", "change-your-password-here": "Change your password here", "changing-your-password": "Changing your password", "city": "City", "click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard", "close": "Close", + "code": "Code", "configure-the-tracks-and-minimum-lap-times": "configure the tracks & minimum lap times", "confirm": "Confirm", "confirm-delete": "Confirm Delete", @@ -68,6 +77,7 @@ "count_teams": "# Teams", "create": "Create", "create-a-new": "Create a new", + "create-a-new-card": "Create a new card", "create-a-new-contact": "Create a new contact", "create-a-new-distance-donation": "Create a new distance donation", "create-a-new-donor": "Create a new donor", @@ -80,10 +90,14 @@ "create-a-new-track": "Create a new Track", "create-a-new-user": "Create a new User", "create-a-new-user-group": "Create a new user group", + "create-bulk-blanco-cards": "Create bulk blanco cards", + "create-bulk-cards": "Add blanco cards", "create-organization": "Create Organization", "create-team": "Create Team", "create-track": "Create Track", "create-user": "Create User", + "created-blanco-cards": "Created blanco cards", + "creating-blanco-cards": "Creating blanco cards", "credits": "Credits", "csv_import__class": "Class", "csv_import__firstname": "Firstname", @@ -151,6 +165,7 @@ "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌", "e-mail-adress": "E-Mail Adress", "edit": "Edit", + "edit-a-card": "Edit a card", "edit-permissions": "edit permissions", "email_address_or_username": "Email / username", "enabled": "enabled", @@ -172,6 +187,7 @@ "geerbte": "inherited", "general-stats": "General Stats", "general_promise_error": "😢 Error", + "generate-runnercards": "Generate Runnercards", "generate-sponsoring-contract": "generate sponsoring contract", "generate-sponsoring-contracts": "generate sponsoring contracts", "generating-pdf": "generating PDF...", @@ -190,6 +206,7 @@ "groups-are-being-loaded": "Groups are being loaded", "home": "Home", "icon-image-credits": "We also want to thank these projects for illustrations and icons:", + "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.", "import-finished": "Import finished", "import-runners": "Import runners", "import__target-organization": "Target Organization", @@ -200,6 +217,7 @@ "internal-error": "Internal Error", "invalid": "Invalid", "invalid-mail-reset": "the provided email is invalid", + "just-enter-how-many-you-want-and-the-system-will-create-them": "Just enter how many you want and the system will create them", "laeufer-hinzufuegen": "Add runner", "laeufer-importieren": "Läufer importieren", "laptime": "Laptime", @@ -208,6 +226,7 @@ "lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.", "license": "License", "licenses-are-being-loaded": "Licenses are being loaded...", + "loading-cards": "Loading cards", "loading-contact-details": "Loading contact details...", "loading-donation-details": "Loading donation details", "loading-donor-details": "Loading donor details", @@ -237,6 +256,7 @@ "no-organizations-found": "No organizations found", "no-runners-found": "No runners found", "no-tracks-added-yet": "there are no tracks added yet.", + "non-blanko": "Non/Blanko", "organization": "Organization", "organization-added": "Organization added", "organization-deleted": "Organization deleted", @@ -334,6 +354,7 @@ "the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "the provided phone number is invalid.
please enter a valid international number...", "the-scans-distance-must-be-greater-than-0m": "The scan's distance must be greater than 0m", "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-cards-yet": "There are no cards yet.", "there-are-no-contacts-added-yet": "There are no contacts added yet.", "there-are-no-donations-yet": "There are no donations yet", "there-are-no-donors-yet": "There are no donors yet", @@ -343,6 +364,7 @@ "there-are-no-scans-yet": "There are no scans yet", "there-are-no-teams-added-yet": "There are no teams added yet.", "there-are-no-users-added-yet": "There are no users added yet.", + "this-card-is": "This card is", "this-might-take-a-moment": "This might take a moment 👀", "this-scanstation-is": "This scanstation is", "token": "Token", @@ -359,12 +381,14 @@ "track-name": "Track name", "track-name-must-not-be-empty": "Track name must not be empty", "tracks": "Tracks", + "update-card": "Update Card", "update-password": "Update password", "updated-contact": "Updated contact!", "updated-donor": "updated donor", "updated-organization": "updated organization", "updated-scan": "updated scan", "updateing-group": "updateing group...", + "updating-card": "Updating card", "updating-organization": "updating organization", "updating-permissions": "updating permissions...", "updating-runner": "Updating runner...", @@ -386,7 +410,9 @@ "yes-i-copied-the-token": "Yes, I copied the token", "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-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! 🎉", + "you-can-provide-a-runner-but-you-dont-have-to": "You can provide a runner, but you don't have to.", "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-must-create-at-least-one-card-or-cancel": "You must create at least one card (or cancel).", "zip-postal-code": "ZIP/ postal code" } \ No newline at end of file