Compare commits

..

2 Commits

Author SHA1 Message Date
06a4428835 Merge pull request 'sync - 0.12.3' (#127) from dev into main
Reviewed-on: #127
Reviewed-by: Nicolai Ort <info@nicolai-ort.com>
2021-04-08 17:28:29 +00:00
bbad338ced Merge pull request 'Merge Minor into main' (#113) from dev into main
Reviewed-on: #113
Reviewed-by: Philipp Dormann <philipp@philippdormann.de>
2021-03-26 16:34:53 +00:00
54 changed files with 1065 additions and 2550 deletions

View File

@@ -27,7 +27,7 @@ name: build:dev
steps: steps:
- name: run full license export - name: run full license export
depends_on: ["clone"] depends_on: ["clone"]
image: registry.odit.services/hub/library/node:alpine image: node:alpine
commands: commands:
- yarn - yarn
- yarn licenses:export - yarn licenses:export

1
.gitignore vendored
View File

@@ -8,4 +8,3 @@ public/index.html
.yarn .yarn
.pnp.js .pnp.js
.yarnrc.yml .yarnrc.yml
pnpm-lock.yaml

View File

@@ -2,134 +2,8 @@
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.
#### [0.15.6](https://git.odit.services/lfk/frontend/compare/0.15.5...0.15.6)
- Fixed donations getting reduced to the first one on certificates [`2391668`](https://git.odit.services/lfk/frontend/commit/2391668a25a1e11a1409df572d77ad1635070fbc)
- new license file version [CI SKIP] [`97054a7`](https://git.odit.services/lfk/frontend/commit/97054a71c1ab8a045762a55148124965c6994373)
#### [0.15.5](https://git.odit.services/lfk/frontend/compare/0.15.4...0.15.5)
> 5 July 2021
- 🚀RELEASE v0.15.5 [`717d335`](https://git.odit.services/lfk/frontend/commit/717d33547c3378424dd720005da9952f8a753f1a)
- Merge pull request 'Fixed kilometer conversion' (#142) from bugfix/141-runner_kilometers into dev [`997be32`](https://git.odit.services/lfk/frontend/commit/997be32679dc38c9fb0e92b6ce011057b854d99d)
- Fixed kilometer conversion [`134f00c`](https://git.odit.services/lfk/frontend/commit/134f00c40e0c8252e7604a73151e8d6685b2c61d)
- new license file version [CI SKIP] [`e752ee1`](https://git.odit.services/lfk/frontend/commit/e752ee12d17a4423f4364f7766eafbe7d4cef2d1)
#### [0.15.4](https://git.odit.services/lfk/frontend/compare/0.15.3...0.15.4)
> 5 July 2021
- Merge pull request 'fix total donation sum in dashboard' (#140) from bugfix/139-total-donation-sum-is-wrong into dev [`#139`](https://git.odit.services/lfk/frontend/issues/139)
- 🚀RELEASE v0.15.4 [`cc4515f`](https://git.odit.services/lfk/frontend/commit/cc4515ff66b1c1de3747d0ee6cc465574accedb7)
- divide by 100 + toFixes(2) [`b246f2b`](https://git.odit.services/lfk/frontend/commit/b246f2b349b06d1adea318dfad58f97fb1a249bb)
#### [0.15.3](https://git.odit.services/lfk/frontend/compare/0.15.2...0.15.3)
> 16 April 2021
- 🚀RELEASE v0.15.3 [`76b69d8`](https://git.odit.services/lfk/frontend/commit/76b69d851aa590ecf8caac135b72962a72e83635)
- Small bugfix (null got displayed) 🛠 [`224f586`](https://git.odit.services/lfk/frontend/commit/224f5863683ae2543a4a435510ed2c558dc5d307)
#### [0.15.2](https://git.odit.services/lfk/frontend/compare/0.15.1...0.15.2)
> 16 April 2021
- 🚀RELEASE v0.15.2 [`9add6c8`](https://git.odit.services/lfk/frontend/commit/9add6c8ff1fbeed91fe97a7cf262921b716f4e3c)
- Footer - noopener link [`cee04c1`](https://git.odit.services/lfk/frontend/commit/cee04c1d6fb6005cefe77fb95855ab6fe2cc448f)
- Hotfix: Team change recognition 🐞 [`cbec785`](https://git.odit.services/lfk/frontend/commit/cbec78589d2fa21f12ce87e71bff2b49c3a7d345)
- NGINX cache assets [`e54a480`](https://git.odit.services/lfk/frontend/commit/e54a4807f70bc333396885f81d3dcc7ae6c115d9)
#### [0.15.1](https://git.odit.services/lfk/frontend/compare/0.15.0...0.15.1)
> 16 April 2021
- 🚀RELEASE v0.15.1 [`a85db7c`](https://git.odit.services/lfk/frontend/commit/a85db7cb3f89881794e37a66ecd822f8ad5873f1)
- Merge pull request '🐞🐳 fix Dockerfile' (#138) from bugfix/136-opacity_reactivity into dev [`2bd3779`](https://git.odit.services/lfk/frontend/commit/2bd3779839de16a89b91a3da93033e2a2b742ab7)
- 🚚 move to tailwind [`07ac041`](https://git.odit.services/lfk/frontend/commit/07ac041d69b3b1810e5db538b53fe62084490f7a)
- 🐞🐳 fix Dockerfile [`303e33c`](https://git.odit.services/lfk/frontend/commit/303e33cafb4a1be01e4c4b43f46ff0c651cb4620)
- Dockerfile now uses selfhosted registry [`b4e689d`](https://git.odit.services/lfk/frontend/commit/b4e689dddf0b93a2794aa30ea83e8c6505d6bbfd)
- new license file version [CI SKIP] [`98a0b03`](https://git.odit.services/lfk/frontend/commit/98a0b036c5490b4bc4992e83f3bca02be39927fa)
- Merge pull request 'Opacity import fix bugfix/136-opacity_reactivity' (#137) from bugfix/136-opacity_reactivity into dev [`fb3f30f`](https://git.odit.services/lfk/frontend/commit/fb3f30fb1024de61ce1c541dae90374454f6ef96)
- Added bs import fix [`6213952`](https://git.odit.services/lfk/frontend/commit/621395200751c2d42b9ad44c77e84bda03b62e83)
#### [0.15.0](https://git.odit.services/lfk/frontend/compare/0.14.0...0.15.0)
> 15 April 2021
- 🚀RELEASE v0.15.0 [`5c02028`](https://git.odit.services/lfk/frontend/commit/5c02028841c68d9a284bf6971eec2b6bc2fdf1f3)
- Merge pull request 'Mark donations as payed feature/133-donation_payments' (#135) from feature/133-donation_payments into dev [`c561b53`](https://git.odit.services/lfk/frontend/commit/c561b536705a68215d9c0a6b320587d1647bf57f)
- Sorted translations [`c7a858e`](https://git.odit.services/lfk/frontend/commit/c7a858eed7962294bc9df3c92ce2e46b0a354796)
- Added total donation amount to donor overview [`e42ea94`](https://git.odit.services/lfk/frontend/commit/e42ea943b7821d433fe21599edbd9f76c3128ef2)
- Added Add Payment button to donor overview [`6e6e8b2`](https://git.odit.services/lfk/frontend/commit/6e6e8b26171f16542c101520800b4b6ea7c023d3)
- You can now open a modal to add a payment to a donation from the donation overview [`a943aaf`](https://git.odit.services/lfk/frontend/commit/a943aaf5fce8f113dd967d3842e2b0d7d50604e9)
- You can now add payments from the donation overview [`1dbab03`](https://git.odit.services/lfk/frontend/commit/1dbab03fe73b5e0fc011f9b0af7199bd71bc79c5)
- Added payment updating via detail [`bdcf5d3`](https://git.odit.services/lfk/frontend/commit/bdcf5d3fc08d250377226a253642d79b2e82d624)
- Added **all** missing toast translations [`de5aa92`](https://git.odit.services/lfk/frontend/commit/de5aa9237d261b5d47a8def35afa7f8e0089aea6)
- You can now mark fixed donations as already paid on creation [`3d3a10a`](https://git.odit.services/lfk/frontend/commit/3d3a10aafb16d371be9471eb5172f9251fb2583f)
- Added translations 🌎 [`d015f97`](https://git.odit.services/lfk/frontend/commit/d015f9739570c44a7a2fe6ba248c9a45c3047c62)
- Changed top info style for donation overview [`4c2c24a`](https://git.odit.services/lfk/frontend/commit/4c2c24af2ca5c2874a583b0fd93bee147a17f449)
- Added paid donation amount and status to donation detail [`5645eea`](https://git.odit.services/lfk/frontend/commit/5645eeaafaa4254edf1a81bc597ce0c7a9b03ff0)
- Added total donation amount to donation overview [`961477d`](https://git.odit.services/lfk/frontend/commit/961477d5224bc44b552d2fc2851d8514116f4e20)
- Fixed chante recognition bug for fixed donation [`0f0aae7`](https://git.odit.services/lfk/frontend/commit/0f0aae7ba4cf5dfab15d56ce48edbdbc7cb7e403)
- Added total donation amount to donor detail [`a5f7101`](https://git.odit.services/lfk/frontend/commit/a5f71015a6557d664e9d3f505613352792fc38cb)
- Added msiisng runner id conversion [`5761815`](https://git.odit.services/lfk/frontend/commit/57618156b49b2b0f0274f2126fef36a017d90022)
- AddDonationModal - vertical alignment for paid status [`18acac8`](https://git.odit.services/lfk/frontend/commit/18acac83bc6532e14d36b3399d867e026d0c88ac)
- Added missing updated comparison [`04a3038`](https://git.odit.services/lfk/frontend/commit/04a3038369f2717c43459318b7b5754ebbaa9e45)
- DonationsOverview contrast on action [`d7d4447`](https://git.odit.services/lfk/frontend/commit/d7d44470bb08ac06594bc400608c17eeacb0434b)
- Fixed typo [`4c0886a`](https://git.odit.services/lfk/frontend/commit/4c0886a5d9b91439967bc8f66b09a57177f967d0)
- Fixed styling [`865254d`](https://git.odit.services/lfk/frontend/commit/865254d646b5f7de15720551c67ae649601cbcd2)
- Changed top info style for donation detail [`000fc97`](https://git.odit.services/lfk/frontend/commit/000fc97beb14427f69d421ff2c96975dbbdc7a3a)
#### [0.14.0](https://git.odit.services/lfk/frontend/compare/0.13.1...0.14.0)
> 14 April 2021
- Merge pull request 'added donor receipt list download to DonorsOverview' (#134) from feature/132-export-donors-receipt-list into dev [`#132`](https://git.odit.services/lfk/frontend/issues/132)
- Sorted translations 🌎 [`c6c9751`](https://git.odit.services/lfk/frontend/commit/c6c97516b3981ef580d620c0c8a6fcc42f26facd)
- Fixed typos in translations [`03676b2`](https://git.odit.services/lfk/frontend/commit/03676b2894892c3559118b93e969c063b53b081e)
- added donor receipt list download to DonorsOverview [`d241ca5`](https://git.odit.services/lfk/frontend/commit/d241ca569838abbe9581fbd319f7f3b563cb7dcc)
- 🚀RELEASE v0.14.0 [`9c5fc6b`](https://git.odit.services/lfk/frontend/commit/9c5fc6b61c0bb2a6d831d4a23ef8679c6e68c6a1)
- ⏫ general version bump [`18f151c`](https://git.odit.services/lfk/frontend/commit/18f151c1fb878a74c3d1a2c2a2debf7913739417)
- new license file version [CI SKIP] [`302caf0`](https://git.odit.services/lfk/frontend/commit/302caf015f88f77e2b2ae2b67680e79f987ad81e)
- Switched to selfhosted images [`112eb29`](https://git.odit.services/lfk/frontend/commit/112eb29f932cd936f1d6c2308dcaeaf8cb642490)
- ⏫ bump @odit/lfk-client-js@0.11.0 [`9ca57fa`](https://git.odit.services/lfk/frontend/commit/9ca57fac2eeabbf25142a507fb9c0fa3c90b4e74)
- replace donationAmount with paidDonationAmount [`e90e56d`](https://git.odit.services/lfk/frontend/commit/e90e56d8b26aef23aba2bbb0c3942ba4d7feb224)
#### [0.13.1](https://git.odit.services/lfk/frontend/compare/0.13.0...0.13.1)
> 11 April 2021
- 🚀RELEASE v0.13.1 [`b512cf8`](https://git.odit.services/lfk/frontend/commit/b512cf86674f1c60b5ac790985ededdfd6554185)
- For await fix [`a24d292`](https://git.odit.services/lfk/frontend/commit/a24d2923c6e6da90d610c05183d29d47eaf2ed30)
#### [0.13.0](https://git.odit.services/lfk/frontend/compare/0.12.5...0.13.0)
> 11 April 2021
- 🚀RELEASE v0.13.0 [`467808a`](https://git.odit.services/lfk/frontend/commit/467808abefe127dac66a2837fcce3197dddb140f)
- Merge pull request 'Better org pdf generation feature/130-org_doc_splitting' (#131) from feature/130-org_doc_splitting into dev [`861f1f2`](https://git.odit.services/lfk/frontend/commit/861f1f221653283e7586aa2c67b205337fd44398)
- Org card generation now runs in sequence [`fef14b6`](https://git.odit.services/lfk/frontend/commit/fef14b6e4fb47ad92da61de91fedce96aea26b2c)
- Org certificate generation now runs in sequence [`509b22b`](https://git.odit.services/lfk/frontend/commit/509b22bea0dd3e4446e6ecc37d27644e9bf2ad50)
- Org contract generation now runs in sequence [`01d2a7e`](https://git.odit.services/lfk/frontend/commit/01d2a7e6aa709b3f2d71575f705fc962e97e2742)
- Emergency document server url change [`5476808`](https://git.odit.services/lfk/frontend/commit/5476808683a919bc34dbaea1f1ed276d49750096)
- Fixed const -&gt; let [`7447b2f`](https://git.odit.services/lfk/frontend/commit/7447b2f4c134a585905db6733093eab13e6f7c47)
- Hotfix: Org * generation🐞 [`ac586fe`](https://git.odit.services/lfk/frontend/commit/ac586fec5abd324d590ba99cdfe8ddddefbf95e6)
#### [0.12.5](https://git.odit.services/lfk/frontend/compare/0.12.4...0.12.5)
> 8 April 2021
- 🚀RELEASE v0.12.5 [`331d737`](https://git.odit.services/lfk/frontend/commit/331d737796c82454b1c19fa1840ccc20e36d2626)
- Merge pull request 'Added runner team's parentorg name to runenr overciew' (#129) from feature/128-runner_orgs into dev [`ef81b8a`](https://git.odit.services/lfk/frontend/commit/ef81b8adf9bef685a55936d7544bf645c0d6ecbe)
- Switched to html entity [`8a7d635`](https://git.odit.services/lfk/frontend/commit/8a7d635cef2d465e70c84e1f7a7b90b98a8dbab1)
- Added runner team's parentorg name to runenr overciew [`4c259c1`](https://git.odit.services/lfk/frontend/commit/4c259c1eef2b0166ce6a8493d0c9e9d5ede11146)
#### [0.12.4](https://git.odit.services/lfk/frontend/compare/0.12.3...0.12.4) #### [0.12.4](https://git.odit.services/lfk/frontend/compare/0.12.3...0.12.4)
> 8 April 2021
- 🚀RELEASE v0.12.4 [`5b4ede5`](https://git.odit.services/lfk/frontend/commit/5b4ede5e2f6a26b475a7a4b430a4146d21fb9671)
- 🚑 [HOTFIX] - drop "svelte-infinite-loading" [`d0ab3dd`](https://git.odit.services/lfk/frontend/commit/d0ab3dda78bbad2cea18a2491056530897d56607) - 🚑 [HOTFIX] - drop "svelte-infinite-loading" [`d0ab3dd`](https://git.odit.services/lfk/frontend/commit/d0ab3dda78bbad2cea18a2491056530897d56607)
#### [0.12.3](https://git.odit.services/lfk/frontend/compare/0.12.2...0.12.3) #### [0.12.3](https://git.odit.services/lfk/frontend/compare/0.12.2...0.12.3)

View File

@@ -1,12 +1,14 @@
FROM registry.odit.services/hub/library/node:15.14.0-alpine3.13 FROM node:15.5.1-alpine3.12
WORKDIR /app WORKDIR /app
COPY package.json ./ COPY package.json ./
RUN yarn RUN yarn
COPY package.json *.config.js postcss.config.cjs index.html ./ COPY package.json *.config.js index.html ./
COPY src ./src COPY src ./src
COPY public ./public COPY public ./public
RUN yarn build RUN yarn build
# final image # final image
FROM registry.odit.services/hub/fholzer/nginx-brotli:v1.19.1 FROM alpine
COPY --from=0 /app/dist /usr/share/nginx/html COPY --from=0 /app/dist /app
FROM fholzer/nginx-brotli:v1.19.1
COPY --from=1 /app /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./nginx.conf /etc/nginx/nginx.conf

View File

@@ -13,7 +13,7 @@
</head> </head>
<body> <body>
<span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.15.6-RELEASE_INFO</span> <span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.12.4-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

@@ -6,11 +6,6 @@ http {
server { server {
error_page 404 /index.html; error_page 404 /index.html;
root /usr/share/nginx/html; root /usr/share/nginx/html;
location /assets {
expires 1y;
log_not_found off;
access_log off;
}
location = /index.html { location = /index.html {
add_header Cache-Control 'no-store'; add_header Cache-Control 'no-store';
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-frontend", "name": "@odit/lfk-frontend",
"version": "0.15.6", "version": "0.12.4",
"scripts": { "scripts": {
"i18n-order": "node order.js", "i18n-order": "node order.js",
"dev": "vite", "dev": "vite",
@@ -10,20 +10,19 @@
}, },
"license": "CC-BY-NC-SA-4.0", "license": "CC-BY-NC-SA-4.0",
"devDependencies": { "devDependencies": {
"@odit/lfk-client-js": "0.13.1", "check-password-strength": "2.0.2",
"@odit/lfk-client-js": "0.10.1",
"@odit/license-exporter": "0.0.11", "@odit/license-exporter": "0.0.11",
"@sveltejs/vite-plugin-svelte": "1.0.0-next.6", "@sveltejs/vite-plugin-svelte": "1.0.0-next.6",
"@types/html-minifier": "4.0.0", "@types/html-minifier": "4.0.0",
"auto-changelog": "2.2.1", "auto-changelog": "2.2.1",
"autoprefixer": "10.2.5", "autoprefixer": "10.2.5",
"check-password-strength": "2.0.2",
"csvtojson": "2.0.10", "csvtojson": "2.0.10",
"gridjs": "3.4.0", "gridjs": "3.4.0",
"html-minifier": "4.0.0", "html-minifier": "4.0.0",
"localforage": "1.9.0", "localforage": "1.9.0",
"marked": "2.0.3", "marked": "2.0.1",
"postcss": "8.2.10", "release-it": "14.5.1",
"release-it": "14.6.1",
"svelte": "3.37.0", "svelte": "3.37.0",
"svelte-focus-trap": "1.2.0", "svelte-focus-trap": "1.2.0",
"svelte-i18n": "3.3.9", "svelte-i18n": "3.3.9",
@@ -34,6 +33,7 @@
"toastify-js": "1.10.0", "toastify-js": "1.10.0",
"validator": "13.5.2", "validator": "13.5.2",
"vite": "2.1.5", "vite": "2.1.5",
"vite-plugin-windicss": "0.12.5",
"xlsx": "0.16.9" "xlsx": "0.16.9"
}, },
"release-it": { "release-it": {

View File

@@ -1,6 +0,0 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
};

View File

@@ -1,6 +1,5 @@
const config = { const config = {
baseurl: 'http://localhost:4010', baseurl: 'http://localhost:4010',
baseurl_documentserver: 'http://localhost:4010/documents',
documentserver_key: 'NqZSYTy5AFQ7MppbLW5moqpTk7u7YrNUHKYhKYuThnnya2WpCOIU694hIZT1FzYe', documentserver_key: 'NqZSYTy5AFQ7MppbLW5moqpTk7u7YrNUHKYhKYuThnnya2WpCOIU694hIZT1FzYe',
// optional // optional
default_username: 'demo', default_username: 'demo',

File diff suppressed because one or more lines are too long

View File

@@ -72,8 +72,6 @@
import Scans from "./components/scans/Scans.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"; import Cards from "./components/cards/Cards.svelte";
import StatsClients from "./components/statsclients/StatsClients.svelte";
import StatsClientDetail from "./components/statsclients/StatsClientDetail.svelte";
store.init(); store.init();
</script> </script>
@@ -208,14 +206,6 @@
<ScanStationDetail {params} /> <ScanStationDetail {params} />
</Route> </Route>
</Route> </Route>
<Route path="/statsclients/*">
<Route path="/">
<StatsClients />
</Route>
<Route path="/:clientid" let:params>
<StatsClientDetail {params} />
</Route>
</Route>
<Route path="/about"> <Route path="/about">
<About /> <About />
</Route> </Route>

View File

@@ -76,7 +76,7 @@
// last login was not processed yet // last login was not processed yet
} else { } else {
Toastify({ Toastify({
text: $_('please-wait-a-moment-your-login-is-still-being-processed'), text: "chill...",
duration: 1500, duration: 1500,
backgroundColor: backgroundColor:
"linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)",

View File

@@ -1,6 +0,0 @@
<!--
Temporary tailwind import fixes for classes that wouldn't be directly used otherwise.
Or as others may call it: Real big bullshit time.
Issue: https://git.odit.services/lfk/frontend/issues/136
-->
<div class="opacity-50"></div>

View File

@@ -77,7 +77,7 @@
duration: -1, duration: -1,
}).showToast(); }).showToast();
fetch( fetch(
`${config.baseurl_documentserver}/cards?&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/cards?&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {

View File

@@ -86,7 +86,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: $_('contact-is-being-added'), text: "Contact is being added...",
duration: -1, duration: -1,
}).showToast(); }).showToast();
let address = {}; let address = {};
@@ -123,7 +123,7 @@
modal_open = false; modal_open = false;
// //
Toastify({ Toastify({
text: $_('contact-added'), text: "Contact added",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -256,26 +256,6 @@
<span>{$_('scanstations')}</span> <span>{$_('scanstations')}</span>
</a> </a>
{/if} {/if}
{#if store.state.jwtinfo.userdetails.permissions.includes('STATSCLIENT:GET')}
<a
class:bg-gray-100={$router.path === '/statsclients/'}
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
href="/statsclients/">
<svg
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
fill="currentColor"
width="24"
height="24"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"><path
fill="none"
d="M0 0h24v24H0z" />
<path
fill="currentColor"
d="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z" /></svg>
<span>{$_('statsclients')}</span>
</a>
{/if}
<a <a
class:bg-gray-100={$router.path === '/settings/'} class:bg-gray-100={$router.path === '/settings/'}
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"

View File

@@ -70,7 +70,7 @@
<div class="text-xs uppercase font-light text-grey-500"> <div class="text-xs uppercase font-light text-grey-500">
{$_('total-donations')} {$_('total-donations')}
</div> </div>
<div class="text-xl font-bold">{(stats.total_donation/100).toFixed(2)}</div> <div class="text-xl font-bold">{stats.total_donation}</div>
</div><svg </div><svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
height="24" height="24"

View File

@@ -9,7 +9,6 @@
} from "@odit/lfk-client-js"; } from "@odit/lfk-client-js";
import Select from "svelte-select"; import Select from "svelte-select";
import Toastify from "toastify-js"; import Toastify from "toastify-js";
import { is_promise } from "svelte/internal";
export let modal_open; export let modal_open;
export let current_donations; export let current_donations;
const getDonorLabel = (option) => const getDonorLabel = (option) =>
@@ -25,7 +24,6 @@ import { is_promise } from "svelte/internal";
$: donors = []; $: donors = [];
$: runners = []; $: runners = [];
$: is_fixed = false; $: is_fixed = false;
$: is_paid = false;
DonorService.donorControllerGetAll().then((val) => { DonorService.donorControllerGetAll().then((val) => {
donors = val.map((r) => { donors = val.map((r) => {
return { label: getDonorLabel(r), value: r }; return { label: getDonorLabel(r), value: r };
@@ -59,18 +57,14 @@ import { is_promise } from "svelte/internal";
let amount_cent = Math.floor(amount_input * 100); let amount_cent = Math.floor(amount_input * 100);
processed_last_submit = false; processed_last_submit = false;
const toast = Toastify({ const toast = Toastify({
text: $_('adding-donation'), text: "adding donation",
duration: -1, duration: -1,
}).showToast(); }).showToast();
if (is_fixed) { if (is_fixed) {
let postdata = { let postdata = {
donor, donor,
amount: amount_cent, amount: amount_cent,
paidAmount: 0
}; };
if(is_paid){
postdata.paidAmount = amount_cent;
}
DonationService.donationControllerPostFixed(postdata) DonationService.donationControllerPostFixed(postdata)
.then((result) => { .then((result) => {
donor = donors[0].id || 0; donor = donors[0].id || 0;
@@ -79,7 +73,7 @@ import { is_promise } from "svelte/internal";
modal_open = false; modal_open = false;
// //
Toastify({ Toastify({
text: $_('donation_added'), text: "donation_added",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -108,7 +102,7 @@ import { is_promise } from "svelte/internal";
modal_open = false; modal_open = false;
// //
Toastify({ Toastify({
text: $_('donation_added'), text: "donation_added",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -129,7 +123,7 @@ import { is_promise } from "svelte/internal";
</script> </script>
<style> <style>
.toggle:before { input:before {
content: ""; content: "";
position: absolute; position: absolute;
width: 1.25rem; width: 1.25rem;
@@ -143,12 +137,12 @@ import { is_promise } from "svelte/internal";
transition: 0.2s ease-in-out; transition: 0.2s ease-in-out;
} }
.toggle:checked { input:checked {
/* @apply: bg-indigo-400; */ /* @apply: bg-indigo-400; */
background-color: #7f9cf5; background-color: #7f9cf5;
} }
.toggle:checked:before { input:checked:before {
left: 1.25rem; left: 1.25rem;
} }
</style> </style>
@@ -201,7 +195,7 @@ import { is_promise } from "svelte/internal";
class="ml-2 text-base" class="ml-2 text-base"
class:text-gray-300={is_fixed}>{$_('distance-donation')}</span> class:text-gray-300={is_fixed}>{$_('distance-donation')}</span>
<input <input
class="toggle relative w-10 h-5 transition-all duration-200 ease-in-out bg-gray-400 rounded-full shadow-inner outline-none appearance-none align-middle" class="relative w-10 h-5 transition-all duration-200 ease-in-out bg-gray-400 rounded-full shadow-inner outline-none appearance-none align-middle"
type="checkbox" type="checkbox"
bind:checked={is_fixed} /> bind:checked={is_fixed} />
<span <span
@@ -273,29 +267,6 @@ import { is_promise } from "svelte/internal";
</span> </span>
{/if} {/if}
</div> </div>
{#if is_fixed}
<div class="col-span-6">
<label
for="paid"
class="block text-sm font-medium text-gray-700">{$_('already-paid')}</label>
<p class="text-gray-500">
<input
id="paid"
bind:checked={is_paid}
name="paid"
type="checkbox"
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" >
<span class="align-text-bottom">
{#if is_paid}
{$_('paid')}
{:else}
{$_('open')}
{/if}
</span>
</p>
</div>
{/if}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,202 +0,0 @@
<script>
import { _ } from "svelte-i18n";
import { clickOutside } from "../base/outsideclick";
import { focusTrap } from "svelte-focus-trap";
import { DonationService } from "@odit/lfk-client-js";
import Toastify from "toastify-js";
export let payment_modal_open = false;
export let current_donations = [];
export let editable = {};
export let original_data = {};
export let paid_amount_input = 0;
$:processed_last_submit=true;
function focus(el) {
el.focus();
}
$: createbtnenabled = is_paid_amount_valid && !(paid_amount_input*100 == original_data.paidAmount)
$: is_paid_amount_valid = paid_amount_input > 0;
(() => {
document.onkeydown = (e) => {
e = e || window.event;
if (e.key === "Escape") {
payment_modal_open = false;
}
if (e.keyCode === 13) {
if (createbtnenabled === true) {
createbtnenabled = false;
submit();
}
}
};
})();
function submit() {
if (processed_last_submit === true) {
processed_last_submit = false;
const toast = Toastify({
text: $_('updating-donation'),
duration: -1,
}).showToast();
editable.donor = editable.donor.id;
editable.paidAmount = paid_amount_input*100;
if(editable.responseType == "DISTANCEDONATION" || editable.runner){
editable.runner = editable.runner.id;
DonationService.donationControllerPutDistance(original_data.id, editable)
.then((result) => {
let id = original_data.id;
editable = {};
original_data = {};
payment_modal_open = false;
//
Toastify({
text: $_('donation-updated'),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
current_donations[current_donations.findIndex((c) => c.id === id)] = result;
current_donations = current_donations;
})
.catch((err) => {
//
})
.finally(() => {
processed_last_submit = true;
//
toast.hideToast();
});
}
else{
DonationService.donationControllerPutFixed(original_data.id, editable)
.then((result) => {
let id = original_data.id;
editable = {};
original_data = {};
payment_modal_open = false;
//
Toastify({
text: $_('donation-updated'),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
current_donations[current_donations.findIndex((c) => c.id === id)] = result;
current_donations = current_donations;
})
.catch((err) => {
//
})
.finally(() => {
processed_last_submit = true;
//
toast.hideToast();
});
}
}
}
</script>
{#if payment_modal_open}
<div
class="fixed z-10 inset-0 overflow-y-auto"
use:focusTrap
use:clickOutside
on:click_outside={() => {
payment_modal_open = false;
}}>
<div
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="absolute inset-0 bg-gray-500 opacity-75"
data-id="modal_backdrop" />
</div>
<span
class="hidden sm:inline-block sm:align-middle sm:h-screen"
aria-hidden="true">&#8203;</span>
<div
class="inline-block align-bottom bg-white rounded-lg text-left shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
role="dialog"
aria-modal="true"
aria-labelledby="modal-headline">
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start">
<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">
<svg
class="h-6 w-6 text-blue-600"
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
fill="currentColor"
d="M22 10v10a1 1 0 01-1 1H3a1 1 0 01-1-1V10h20zm0-2H2V4a1 1 0 011-1h18a1 1 0 011 1v4zm-7 8v2h4v-2h-4z" /></svg>
</div>
<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">
{$_('enter-payment')}
</h3>
<div class="mt-2 mb-6">
<p class="text-sm text-gray-500">
{$_('you-can-enter-the-donations-paid-amount-manually-or-use-the-max-button-to-use-the-donations-exact-amount')}
</p>
</div>
<div class="grid grid-cols gap-6">
<div class="w-full">
<label
for="token"
class="block text-sm font-medium text-gray-700">{$_('paid-amount')}</label>
<div class="inline-flex border-gray-300 border rounded-l-md rounded-r-md bg-gray-50 text-gray-500 w-full">
<input
autocomplete="off"
class:border-red-500={!is_paid_amount_valid}
class:focus:border-red-500={!is_paid_amount_valid}
class:focus:ring-red-500={!is_paid_amount_valid}
bind:value={paid_amount_input}
type="number"
step="0.01"
name="donation_amount_eur"
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm p-2"
placeholder="2.00" />
<button
on:click={
()=>{
paid_amount_input=paid_amount_input = (original_data.amount/100).toFixed(2);
}
}
class="inline-flex items-center p-r-2 text-indigo-300 hover:text-indigo-700 text-sm">MAX</button>
<span
class="inline-flex items-center px-3 rounded-r-md border border-gray-300 bg-gray-50 text-gray-500 text-sm"></span>
</div>
{#if !is_paid_amount_valid}
<span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
{$_('payment-amount-must-be-greater-than-0-00eur')}
</span>
{/if}
</div>
</div>
</div>
</div>
</div>
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button
disabled={!createbtnenabled}
class:opacity-50={!createbtnenabled}
on:click={submit}
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">
{$_('save-changes')}
</button>
<button
on:click={() => {
payment_modal_open = false;
}}
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">
{$_('cancel')}
</button>
</div>
</div>
</div>
</div>
{/if}

View File

@@ -20,8 +20,6 @@
$: current_runners = []; $: current_runners = [];
$: amount_input = 0; $: amount_input = 0;
$: is_amount_valid = amount_input > 0; $: is_amount_valid = amount_input > 0;
$: paid_amount_input = 0;
$: is_paid_amount_valid = paid_amount_input > 0;
$: is_everything_set = $: is_everything_set =
editable.donor != null && editable.donor != null &&
((original_data.responseType == "DISTANCEDONATION" && ((original_data.responseType == "DISTANCEDONATION" &&
@@ -32,17 +30,15 @@
(original_data.responseType == "DISTANCEDONATION" && (original_data.responseType == "DISTANCEDONATION" &&
!(Math.floor(amount_input * 100) === original_data.amountPerDistance)) || !(Math.floor(amount_input * 100) === original_data.amountPerDistance)) ||
(original_data.responseType !== "DISTANCEDONATION" && (original_data.responseType !== "DISTANCEDONATION" &&
!(Math.floor(amount_input * 100) === original_data.amount)) || !(Math.floor(amount_input * 100) === original_data.amount));
!(Math.floor(paid_amount_input * 100) === original_data.paidAmount);
$: save_enabled = changes_performed && is_amount_valid && is_everything_set; $: save_enabled = changes_performed && is_amount_valid && is_everything_set;
const promise = DonationService.donationControllerGetOne( const promise = DonationService.donationControllerGetOne(
params.donationid params.donationid
).then((data) => { ).then((data) => {
data_loaded = true; data_loaded = true;
original_data = Object.assign({}, data); original_data = Object.assign(original_data, data);
editable = Object.assign({}, original_data); editable = Object.assign(editable, original_data);
paid_amount_input = data.paidAmount / 100;
if (data.responseType == "DISTANCEDONATION") { if (data.responseType == "DISTANCEDONATION") {
amount_input = data.amountPerDistance / 100; amount_input = data.amountPerDistance / 100;
RunnerService.runnerControllerGetAll().then((val) => { RunnerService.runnerControllerGetAll().then((val) => {
@@ -70,11 +66,10 @@
function submit() { function submit() {
if (data_loaded === true && save_enabled) { if (data_loaded === true && save_enabled) {
Toastify({ Toastify({
text: $_('updating-donation'), text: "Donation is being updated",
duration: 2500, duration: 2500,
}).showToast(); }).showToast();
let postdata = {}; let postdata = {};
editable.paidAmount = paid_amount_input*100;
if (original_data.responseType === "DISTANCEDONATION") { if (original_data.responseType === "DISTANCEDONATION") {
editable.amountPerDistance = Math.floor(amount_input * 100); editable.amountPerDistance = Math.floor(amount_input * 100);
postdata = Object.assign(postdata, editable); postdata = Object.assign(postdata, editable);
@@ -88,7 +83,7 @@
Object.assign(original_data, editable); Object.assign(original_data, editable);
original_data = original_data; original_data = original_data;
Toastify({ Toastify({
text: $_('donation-updated'), text: "updated donation",
duration: 2500, duration: 2500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -103,7 +98,7 @@
Object.assign(original_data, editable); Object.assign(original_data, editable);
original_data = original_data; original_data = original_data;
Toastify({ Toastify({
text: $_('donation-updated'), text: "updated donation",
duration: 2500, duration: 2500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -117,7 +112,7 @@
DonationService.donationControllerRemove(original_data.id, false) DonationService.donationControllerRemove(original_data.id, false)
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: $_('donation-deleted'), text: "Donation delete",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -224,24 +219,7 @@
<span>{(editable.amount / 100) <span>{(editable.amount / 100)
.toFixed(2) .toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}</span> .toLocaleString('de-DE', { valute: 'EUR' })}</span>
|
<span
class="font-medium text-gray-700">{$_('paid-amount')}:</span>
<span>{(editable.paidAmount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}</span>
|
<span
class="font-medium text-gray-700">{$_('status')}:</span>
{#if editable.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}
</div> </div>
<br>
<div class=" w-full"> <div class=" w-full">
<label <label
for="donor" for="donor"
@@ -254,7 +232,7 @@
placeholder={$_('search-for-donor-name-or-id')} placeholder={$_('search-for-donor-name-or-id')}
noOptionsMessage={$_('no-donors-found')} noOptionsMessage={$_('no-donors-found')}
bind:selectedValue={donor} bind:selectedValue={donor}
on:select={(selectedValue) => {editable.donor = selectedValue.detail.value; editable.donor.donationAmount=original_data.donor.donationAmount; editable.donor.paidDonationAmount =original_data.donor.paidDonationAmount}} on:select={(selectedValue) => (editable.donor = selectedValue.detail.value)}
on:clear={() => (editable.donor = null)} /> on:clear={() => (editable.donor = null)} />
</div> </div>
{#if original_data.responseType == 'DISTANCEDONATION'} {#if original_data.responseType == 'DISTANCEDONATION'}
@@ -302,39 +280,6 @@
</span> </span>
{/if} {/if}
</div> </div>
<div class="w-full">
<label
for="token"
class="block text-sm font-medium text-gray-700">{$_('paid-amount')}</label>
<div class="inline-flex border-gray-300 border rounded-l-md rounded-r-md bg-gray-50 text-gray-500 w-full">
<input
autocomplete="off"
class:border-red-500={!is_amount_valid}
class:focus:border-red-500={!is_amount_valid}
class:focus:ring-red-500={!is_amount_valid}
bind:value={paid_amount_input}
type="number"
step="0.01"
name="donation_amount_eur"
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm p-2"
placeholder="2.00" />
<button
on:click={
()=>{
paid_amount_input=paid_amount_input = (original_data.amount/100).toFixed(2);
}
}
class="inline-flex items-center p-r-2 text-indigo-300 hover:text-indigo-700 text-sm">MAX</button>
<span
class="inline-flex items-center px-3 rounded-r-md border border-gray-300 bg-gray-50 text-gray-500 text-sm"></span>
</div>
{#if !is_paid_amount_valid}
<span
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
{$_('payment-amount-must-be-greater-than-0-00eur')}
</span>
{/if}
</div>
</section> </section>
{:catch error} {:catch error}
<PromiseError {error} /> <PromiseError {error} />

View File

@@ -4,14 +4,9 @@
import store from "../../store"; import store from "../../store";
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";
$: searchvalue = ""; $: searchvalue = "";
$: active_deletes = []; $: active_deletes = [];
export let current_donations = []; export let current_donations = [];
export let payment_modal_open = false;
export let editable = {};
export let original_data = {};
export let paid_amount_input = 0;
const donations_promise = DonationService.donationControllerGetAll().then( const donations_promise = DonationService.donationControllerGetAll().then(
(val) => { (val) => {
current_donations = val; current_donations = val;
@@ -23,15 +18,8 @@
} }
return id.toString() === searchvalue; return id.toString() === searchvalue;
} }
function open_payment_modal(donation) {
editable = Object.assign({}, donation);
original_data = Object.assign({}, donation);
paid_amount_input = (donation.paidAmount/100).toFixed(2);
payment_modal_open = true;
}
</script> </script>
<AddDonationPaymentModal bind:current_donations bind:original_data bind:editable bind:paid_amount_input bind:payment_modal_open />
{#if store.state.jwtinfo.userdetails.permissions.includes('DONATION:GET')} {#if store.state.jwtinfo.userdetails.permissions.includes('DONATION:GET')}
{#await donations_promise} {#await donations_promise}
<div <div
@@ -75,16 +63,6 @@
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">
{$_('donation-amount')} {$_('donation-amount')}
</th> </th>
<th
scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
{$_('paid-amount')}
</th>
<th
scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
{$_('status')}
</th>
<th scope="col" class="relative px-6 py-3"> <th scope="col" class="relative px-6 py-3">
<span class="sr-only">{$_('action')}</span> <span class="sr-only">{$_('action')}</span>
</th> </th>
@@ -154,22 +132,6 @@
.toLocaleString('de-DE', { valute: 'EUR' })} .toLocaleString('de-DE', { valute: 'EUR' })}
</div> </div>
</td> </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} {#if active_deletes[donation.id] === true}
<td <td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"> class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
@@ -187,7 +149,7 @@
(obj) => obj.id !== donation.id (obj) => obj.id !== donation.id
); );
Toastify({ Toastify({
text: $_('donation-deleted'), text: 'Donation deleted',
duration: 500, duration: 500,
backgroundColor: backgroundColor:
'linear-gradient(to right, #00b09b, #96c93d)', 'linear-gradient(to right, #00b09b, #96c93d)',
@@ -201,9 +163,6 @@
{:else} {:else}
<td <td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"> 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 <a
href="./{donation.id}" href="./{donation.id}"
class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a> class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a>

View File

@@ -19,7 +19,7 @@
) )
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: $_('donor-deleted'), text: "Donor deleted",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -193,12 +193,6 @@
<span>{(editable.donationAmount / 100) <span>{(editable.donationAmount / 100)
.toFixed(2) .toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}</span> .toLocaleString('de-DE', { valute: 'EUR' })}</span>
|
<span
class="font-medium text-gray-700">{$_('total-paid-amount')}:</span>
<span>{(editable.paidDonationAmount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })}</span>
<br /> <br />
<span class="font-medium text-gray-700">{$_('donations')}:</span> <span class="font-medium text-gray-700">{$_('donations')}:</span>
{#if current_donations.filter((d) => d.donor.id == editable.id).length > 0} {#if current_donations.filter((d) => d.donor.id == editable.id).length > 0}

View File

@@ -20,31 +20,6 @@
{$_('add-donor')} {$_('add-donor')}
</button> </button>
{/if} {/if}
{#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:GET')}
<button
on:click={() => {
const data = (current_donors.filter(d=>d.receiptNeeded===true)).map(function (d) {
d.address.address2=d.address.address2===""?"":" "+d.address.address2;
const address=`${d.address.address1}${d.address.address2}, ${d.address.postalcode} ${d.address.city}, ${d.address.country}`;
return [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";
});
let hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);
hiddenElement.target = '_blank';
hiddenElement.download = `${$_('filename_sponsoringquittungsliste')}.csv`;
hiddenElement.click();
hiddenElement.remove();
}}
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">
{$_('sponsoring-quittungs-liste_herunterladen')}
</button>
{/if}
</span> </span>
<DonorsOverview bind:current_donors /> <DonorsOverview bind:current_donors />
</section> </section>

View File

@@ -1,5 +1,5 @@
<script> <script>
import { _ } from "svelte-i18n"; import { getLocaleFromNavigator, _ } from "svelte-i18n";
import { DonationService, DonorService } from "@odit/lfk-client-js"; import { DonationService, DonorService } from "@odit/lfk-client-js";
import store from "../../store"; import store from "../../store";
import DonorsEmptyState from "./DonorsEmptyState.svelte"; import DonorsEmptyState from "./DonorsEmptyState.svelte";
@@ -77,11 +77,6 @@
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">
{$_('total-donation-amount')} {$_('total-donation-amount')}
</th> </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"> <th scope="col" class="relative px-6 py-3">
<span class="sr-only">{$_('action')}</span> <span class="sr-only">{$_('action')}</span>
</th> </th>
@@ -132,7 +127,7 @@
<a <a
href="../donations/{d.id}" 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} 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.middlename}
{d.runner.lastname}</a> {d.runner.lastname}</a>
{:else} {:else}
<a <a
@@ -150,11 +145,6 @@
.toFixed(2) .toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })} .toLocaleString('de-DE', { valute: 'EUR' })}
</td> </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} {#if active_deletes[donor.id] === true}
<td <td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"> class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">

View File

@@ -32,12 +32,8 @@
target="_blank" target="_blank"
rel="noopener, noreferrer" rel="noopener, noreferrer"
href="https://git.odit.services/lfk/frontend/src/tag/{releaseinfo}">{releaseinfo}</a> href="https://git.odit.services/lfk/frontend/src/tag/{releaseinfo}">{releaseinfo}</a>
- -
<a <a class="underline" href="https://docs.lauf-fuer-kaya.de" target="_blank">{$_('documentation')}</a>
rel="noopener, noreferrer"
class="underline"
href="https://docs.lauf-fuer-kaya.de"
target="_blank">{$_('documentation')}</a>
- -
<a class="underline" href="/privacy">{$_('privacy')}</a> <a class="underline" href="/privacy">{$_('privacy')}</a>
- -

View File

@@ -19,7 +19,7 @@
) )
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: $_('organization-deleted'), text: "Organization deleted",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -14,7 +14,7 @@
$: active_deletes = []; $: active_deletes = [];
$: sponsoring_contracts_show = current_organizations.some((r) => r.is_selected === true); $: sponsoring_contracts_show = current_organizations.some((r) => r.is_selected === true);
$: cards_show = current_organizations.some((r) => r.is_selected === true); $: cards_show = current_organizations.some((r) => r.is_selected === true);
$: generate_orgs = current_organizations.filter((r) => r.is_selected === true); $: generate_orgs = current_organizations.some((r) => r.is_selected === true);
$: certificates_show = current_organizations.some( $: certificates_show = current_organizations.some(
(r) => r.is_selected === true (r) => r.is_selected === true
); );

View File

@@ -41,7 +41,7 @@
duration: -1, duration: -1,
}).showToast(); }).showToast();
fetch( fetch(
`${config.baseurl_documentserver}/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -101,7 +101,7 @@
cards.push(card); cards.push(card);
} }
fetch( fetch(
`${config.baseurl_documentserver}/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -169,7 +169,7 @@
cards.push(card); cards.push(card);
} }
fetch( fetch(
`${config.baseurl_documentserver}/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -216,16 +216,15 @@
async function generateOrgCards(locale) { async function generateOrgCards(locale) {
const toast = Toastify({ const toast = Toastify({
text: $_("generating-pdfs"), text: $_("generating-pdf"),
duration: -1, duration: -1,
}).showToast(); }).showToast();
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
let count = 0; let count = 0;
let count_orgs =0; const current_cards = await RunnerCardService.runnerCardControllerGetAll();
for (const o of generate_orgs) { for (const o of generate_orgs) {
count_orgs++; const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
let count = 0; o.id
let runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(o.id, true) );
let cards = []; let cards = [];
for (let runner of runners) { for (let runner of runners) {
let card = current_cards.find((c) => c.runner?.id == runner.id); let card = current_cards.find((c) => c.runner?.id == runner.id);
@@ -236,8 +235,8 @@
} }
cards.push(card); cards.push(card);
} }
await fetch( fetch(
`${config.baseurl_documentserver}/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -246,97 +245,39 @@
body: JSON.stringify(cards), body: JSON.stringify(cards),
} }
) )
.then((response) => { .then((response) => {
if (response.status != "200") { if (response.status != "200") {
toast.hideToast(); toast.hideToast();
Toastify({ Toastify({
text: $_("pdf-generation-failed"), text: $_("pdf-generation-failed"),
duration: 3500, duration: 3500,
backgroundColor: backgroundColor:
"linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)",
}).showToast(); }).showToast();
} else { } else {
return response.blob(); return response.blob();
} }
}) })
.then((blob) => { .then((blob) => {
const url = window.URL.createObjectURL(blob); count++;
let a = document.createElement("a"); const url = window.URL.createObjectURL(blob);
a.href = url; let a = document.createElement("a");
a.download = `${$_('runnercards')}_${o.name}_direct-${locale}.pdf`; a.href = url;
document.body.appendChild(a); a.download = `${$_('runnercards')}_${o.name}-${locale}.pdf`;
a.click(); document.body.appendChild(a);
a.remove(); a.click();
if (count === o.teams.length && count_orgs === generate_orgs.length) { a.remove();
toast.hideToast(); if (count === generate_orgs.length) {
console.log("here") toast.hideToast();
Toastify({ Toastify({
text: $_("pdfs-successfully-generated"), text: $_("pdfs-successfully-generated"),
duration: 3500, duration: 3500,
backgroundColor: backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)", "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
} }
}) })
.catch((err) => {}); .catch((err) => {});
for (const t of o.teams) {
count++;
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id
);
let cards = [];
for (let runner of runners) {
let card = current_cards.find((c) => c.runner?.id == runner.id);
if (!card) {
card = await RunnerCardService.runnerCardControllerPost({
runner: runner.id,
});
}
cards.push(card);
}
await fetch(
`${config.baseurl_documentserver}/cards?locale=${locale}&download=true&key=${config.documentserver_key}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(cards),
}
)
.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 = `${$_('runnercards')}_${o.name}_${t.name}-${locale}.pdf`;
document.body.appendChild(a);
a.click();
a.remove();
if (count === o.teams.length && count_orgs === generate_orgs.length) {
toast.hideToast();
Toastify({
text: $_("pdfs-successfully-generated"),
duration: 3500,
backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
}
})
.catch((err) => {});
}
} }
} }
</script> </script>

View File

@@ -37,15 +37,14 @@
text: $_("generating-pdf"), text: $_("generating-pdf"),
duration: -1, duration: -1,
}).showToast(); }).showToast();
const current_donations = (await DonationService.donationControllerGetAll()) || []; const current_donations = await DonationService.donationControllerGetAll();
let certificateRunners = []; let certificateRunners = [];
for (let runner of generate_runners) { for (let runner of generate_runners) {
runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || []; runner.distanceDonations = current_donations.find((d) => d.runner?.id == runner.id) || [];
console.log(runner.distanceDonations)
certificateRunners.push(runner); certificateRunners.push(runner);
} }
fetch( fetch(
`${config.baseurl_documentserver}/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -97,18 +96,18 @@
duration: -1, duration: -1,
}).showToast(); }).showToast();
let count = 0; let count = 0;
const current_donations = (await DonationService.donationControllerGetAll()) || []; const current_donations = await DonationService.donationControllerGetAll();
for (const t of generate_teams) { for (const t of generate_teams) {
const runners = await RunnerTeamService.runnerTeamControllerGetRunners( const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id t.id
); );
let certificateRunners = []; let certificateRunners = [];
for (let runner of runners) { for (let runner of runners) {
runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || []; runner.distanceDonations = current_donations.find((d) => d.runner?.id == runner.id) || [];
certificateRunners.push(runner); certificateRunners.push(runner);
} }
fetch( fetch(
`${config.baseurl_documentserver}/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -155,23 +154,22 @@
async function generateOrgCertificates(locale) { async function generateOrgCertificates(locale) {
const toast = Toastify({ const toast = Toastify({
text: $_("generating-pdfs"), text: $_("generating-pdf"),
duration: -1, duration: -1,
}).showToast(); }).showToast();
const current_donations = (await DonationService.donationControllerGetAll()) || [];
let count = 0; let count = 0;
let count_orgs =0; const current_donations = await DonationService.donationControllerGetAll();
for (const o of generate_orgs) { for (const o of generate_orgs) {
count_orgs++; const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
let count = 0; o.id
let runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(o.id, true) );
let certificateRunners = []; let certificateRunners = [];
for (let runner of runners) { for (let runner of runners) {
runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || []; runner.distanceDonations = current_donations.find((d) => d.runner?.id == runner.id) || [];
certificateRunners.push(runner); certificateRunners.push(runner);
} }
await fetch( fetch(
`${config.baseurl_documentserver}/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -180,92 +178,39 @@
body: JSON.stringify(certificateRunners), body: JSON.stringify(certificateRunners),
} }
) )
.then((response) => { .then((response) => {
if (response.status != "200") { if (response.status != "200") {
toast.hideToast(); toast.hideToast();
Toastify({ Toastify({
text: $_("pdf-generation-failed"), text: $_("pdf-generation-failed"),
duration: 3500, duration: 3500,
backgroundColor: backgroundColor:
"linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)",
}).showToast(); }).showToast();
} else { } else {
return response.blob(); return response.blob();
} }
}) })
.then((blob) => { .then((blob) => {
const url = window.URL.createObjectURL(blob); count++;
let a = document.createElement("a"); const url = window.URL.createObjectURL(blob);
a.href = url; let a = document.createElement("a");
a.download = `${$_('certificates')}_${o.name}_direct-${locale}.pdf`; a.href = url;
document.body.appendChild(a); a.download = `${$_('certificates')}_${o.name}-${locale}.pdf`;
a.click(); document.body.appendChild(a);
a.remove(); a.click();
if (count === o.teams.length && count_orgs === generate_orgs.length) { a.remove();
toast.hideToast(); if (count === generate_orgs.length) {
console.log("here") toast.hideToast();
Toastify({ Toastify({
text: $_("pdfs-successfully-generated"), text: $_("pdfs-successfully-generated"),
duration: 3500, duration: 3500,
backgroundColor: backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)", "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
} }
}) })
.catch((err) => {}); .catch((err) => {});
for (const t of o.teams) {
count++;
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id
);
let certificateRunners = [];
for (let runner of runners) {
runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
certificateRunners.push(runner);
}
await fetch(
`${config.baseurl_documentserver}/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(certificateRunners),
}
)
.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 = `${$_('certificates')}_${o.name}_${t.name}-${locale}.pdf`;
document.body.appendChild(a);
a.click();
a.remove();
if (count === o.teams.length && count_orgs === generate_orgs.length) {
toast.hideToast();
Toastify({
text: $_("pdfs-successfully-generated"),
duration: 3500,
backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
}
})
.catch((err) => {});
}
} }
} }
</script> </script>

View File

@@ -43,7 +43,7 @@
t.id t.id
); );
fetch( fetch(
`${config.baseurl_documentserver}/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -92,13 +92,12 @@
text: $_("generating-pdf"), text: $_("generating-pdf"),
duration: -1, duration: -1,
}).showToast(); }).showToast();
let count_orgs =0;
for (const o of generate_orgs) { for (const o of generate_orgs) {
count_orgs++; const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
let count = 0; o.id
let runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(o.id, true) );
await fetch( fetch(
`${config.baseurl_documentserver}/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -107,87 +106,39 @@
body: JSON.stringify(runners), body: JSON.stringify(runners),
} }
) )
.then((response) => { .then((response) => {
if (response.status != "200") { if (response.status != "200") {
toast.hideToast(); toast.hideToast();
Toastify({ Toastify({
text: $_("pdf-generation-failed"), text: $_("pdf-generation-failed"),
duration: 3500, duration: 3500,
backgroundColor: backgroundColor:
"linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)", "linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)",
}).showToast(); }).showToast();
} else { } else {
return response.blob(); return response.blob();
} }
}) })
.then((blob) => { .then((blob) => {
const url = window.URL.createObjectURL(blob); count++;
let a = document.createElement("a"); const url = window.URL.createObjectURL(blob);
a.href = url; let a = document.createElement("a");
a.download = `${$_('sponsorings')}_${o.name}_direct-${locale}.pdf`; a.href = url;
document.body.appendChild(a); a.download = `${$_('sponsorings')}_${o.name}-${locale}.pdf`;
a.click(); document.body.appendChild(a);
a.remove(); a.click();
if (count === o.teams.length && count_orgs === generate_orgs.length) { a.remove();
toast.hideToast(); if (count === generate_orgs.length) {
console.log("here") toast.hideToast();
Toastify({ Toastify({
text: $_("pdfs-successfully-generated"), text: $_("pdfs-successfully-generated"),
duration: 3500, duration: 3500,
backgroundColor: backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)", "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
} }
}) })
.catch((err) => {}); .catch((err) => {});
for (const t of o.teams) {
count++;
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
t.id
);
await fetch(
`${config.baseurl_documentserver}/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')}_${o.name}_${t.name}-${locale}.pdf`;
document.body.appendChild(a);
a.click();
a.remove();
if (count === o.teams.length && count_orgs === generate_orgs.length) {
toast.hideToast();
Toastify({
text: $_("pdfs-successfully-generated"),
duration: 3500,
backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
}
})
.catch((err) => {});
}
} }
} }
@@ -197,7 +148,7 @@
duration: -1, duration: -1,
}).showToast(); }).showToast();
fetch( fetch(
`${config.baseurl_documentserver}/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {

View File

@@ -202,7 +202,7 @@
toast.hideToast(); toast.hideToast();
recent_processed = true; recent_processed = true;
Toastify({ Toastify({
text: $_('import-finished'), text: "Import finished",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -294,7 +294,7 @@
<div class="text-sm w-full"> <div class="text-sm w-full">
<span class="font-medium text-gray-700">{$_('distance')}</span> <span class="font-medium text-gray-700">{$_('distance')}</span>
<br /> <br />
<span class="text-gray-700">{original_data.distance /1000 } km</span> <span class="text-gray-700">{original_data.distance} km</span>
</div> </div>
</section> </section>
{:catch error} {:catch error}

View File

@@ -197,7 +197,7 @@
{#if runner.group.responseType === 'RUNNERTEAM'} {#if runner.group.responseType === 'RUNNERTEAM'}
<a <a
href="../teams/{runner.group.id}" href="../teams/{runner.group.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{runner.group.parentGroup.name} &gt; {runner.group.name}</a> class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{runner.group.name}</a>
{/if} {/if}
{#if runner.group.responseType === 'RUNNERORGANIZATION'} {#if runner.group.responseType === 'RUNNERORGANIZATION'}
<a <a
@@ -206,7 +206,7 @@
{/if} {/if}
</td> </td>
<td class="px-6 py-4 whitespace-nowrap"> <td class="px-6 py-4 whitespace-nowrap">
{runner.distance /1000 } km {runner.distance}
</td> </td>
{#if active_deletes[runner.id] === true} {#if active_deletes[runner.id] === true}
<td <td

View File

@@ -17,7 +17,7 @@
MeService.meControllerRemove(true) MeService.meControllerRemove(true)
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: $_('profile-deleted'), text: "Profile deleted!",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -1,151 +0,0 @@
<script>
import { _ } from "svelte-i18n";
import { clickOutside } from "../base/outsideclick";
import { focusTrap } from "svelte-focus-trap";
import { StatsClientService } from "@odit/lfk-client-js";
import Toastify from "toastify-js";
export let modal_open;
export let new_client;
export let current_clients;
export let copy_modal_open;
function focus(el) {
el.focus();
}
$: description = "";
$: createbtnenabled = description != "";
$: processed_last_submit = true;
(() => {
document.onkeydown = (e) => {
e = e || window.event;
if (e.key === "Escape") {
modal_open = false;
}
if (e.keyCode === 13) {
if (createbtnenabled === true) {
createbtnenabled = false;
submit();
}
}
};
})();
function submit() {
if (processed_last_submit === true) {
processed_last_submit = false;
const toast = Toastify({
text: $_("statsclient-is-being-added"),
duration: -1,
}).showToast();
StatsClientService.statsClientControllerPost({description})
.then((result) => {
description = "";
modal_open = false;
//
Toastify({
text: $_("scanstation-added"),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
current_clients.push(result);
current_clients = current_clients;
new_client = result;
copy_modal_open = true;
})
.catch((err) => {
//
})
.finally(() => {
processed_last_submit = true;
//
toast.hideToast();
});
}
}
</script>
{#if modal_open}
<div
class="fixed z-10 inset-0 overflow-y-auto"
use:focusTrap
use:clickOutside
on:click_outside={() => {
modal_open = false;
}}>
<div
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="absolute inset-0 bg-gray-500 opacity-75"
data-id="modal_backdrop" />
</div>
<span
class="hidden sm:inline-block sm:align-middle sm:h-screen"
aria-hidden="true">&#8203;</span>
<div
class="inline-block align-bottom bg-white rounded-lg text-left shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
role="dialog"
aria-modal="true"
aria-labelledby="modal-headline">
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start">
<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">
<svg
class="h-6 w-6 text-blue-600"
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="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z" /></svg>
</div>
<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">
{$_('create-a-new-statsclient')}
</h3>
<div class="mt-2 mb-6">
<p class="text-sm text-gray-500">
{$_('please-provide-the-required-information-to-create-a-new-statsclient')}
</p>
</div>
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6">
<label
for="description"
class="block text-sm font-medium text-gray-700">{$_('description')}</label>
<input
use:focus
autocomplete="off"
placeholder={$_('description')}
bind:value={description}
type="text"
name="description"
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>
</div>
</div>
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button
disabled={!createbtnenabled}
class:opacity-50={!createbtnenabled}
on:click={submit}
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">
{$_('create')}
</button>
<button
on:click={() => {
modal_open = false;
}}
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">
{$_('cancel')}
</button>
</div>
</div>
</div>
</div>
{/if}

View File

@@ -1,92 +0,0 @@
<script>
import { _ } from "svelte-i18n";
import { clickOutside } from "../base/outsideclick";
import { focusTrap } from "svelte-focus-trap";
import { ScanStationService } from "@odit/lfk-client-js";
import Toastify from "toastify-js";
import { createEventDispatcher } from "svelte";
export let modal_open;
export let delete_station;
const dispatch = createEventDispatcher();
function cancelDelete() {
modal_open = false;
dispatch("cancelDelete", { id: delete_station.id });
}
function deleteClient() {
ScanStationService.donorControllerRemove(
delete_station.id,
true
)
.then((resp) => {
Toastify({
text: $_('statsclient-deleted'),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
location.replace("./");
})
.catch((err) => {});
}
</script>
{#if modal_open}
<div
class="fixed z-10 inset-0 overflow-y-auto"
use:focusTrap
use:clickOutside
on:click_outside={cancelDelete}>
<div
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="absolute inset-0 bg-gray-500 opacity-75"
data-id="modal_backdrop" />
</div>
<span
class="hidden sm:inline-block sm:align-middle sm:h-screen"
aria-hidden="true">&#8203;</span>
<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"
role="dialog"
aria-modal="true"
aria-labelledby="modal-headline">
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start">
<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">
<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="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z"/></svg>
</div>
<!-- <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">
{$_('attention')}
</h3>
<div class="mt-2 mb-6">
<p class="text-sm text-gray-500">
{$_(
'do-you-want-to-delete-this-donor-with-all-related-donations'
)}
<br />
{$_('all-associated-scans-will-get-deleted-as-well')}
</p>
</div>
</div> -->
</div>
</div>
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button
on:click={deleteClient}
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">
{$_('confirm-delete-statsclient')}
</button>
<button
on:click={cancelDelete}
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">
{$_('cancel-keep-statsclient')}
</button>
</div>
</div>
</div>
</div>
{/if}

View File

@@ -1,129 +0,0 @@
<script>
import { _ } from "svelte-i18n";
import { focusTrap } from "svelte-focus-trap";
import Toastify from "toastify-js";
import { tick, createEventDispatcher } from "svelte";
export let copy_modal_open;
export let new_client;
const dispatch = createEventDispatcher();
let valueCopy = null;
let areaDom;
let copied = false;
function close() {
copy_modal_open = false;
}
async function copy() {
valueCopy = new_client.key;
await tick();
areaDom.focus();
areaDom.select();
try {
const successful = document.execCommand("copy");
if (!successful) {
throw new Error();
}
Toastify({
text: $_("copied-token-to-clipboard"),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
copied = true;
} catch (err) {
Toastify({
text: $_("error-whyile-copying-to-clipboard"),
duration: 500,
backgroundColor:
"linear-gradient(90deg, hsla(281, 37%, 45%, 1) 0%, hsla(1, 62%, 48%, 1) 100%)",
}).showToast();
}
// we can notifi by event or storage about copy status
valueCopy = null;
}
</script>
{#if copy_modal_open}
{#if valueCopy != null}
<textarea bind:this={areaDom}>{valueCopy}</textarea>
{/if}
<div class="fixed z-10 inset-0 overflow-y-auto" use:focusTrap>
<div
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="absolute inset-0 bg-gray-500 opacity-75"
data-id="modal_backdrop" />
</div>
<span
class="hidden sm:inline-block sm:align-middle sm:h-screen"
aria-hidden="true">&#8203;</span>
<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"
role="dialog"
aria-modal="true"
aria-labelledby="modal-headline">
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start">
<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">
<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="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z" /></svg>
</div>
<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">
{$_('token')}
</h3>
<div class="mt-2 mb-6">
<p class="text-sm text-gray-500">
{$_('the-statsclient-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again')}
<br />
{$_('please-copy-the-token-and-store-it-somewhere-save')}
</p>
</div>
<div class="mt-2 mb-6">
<label
for="token"
class="block text-sm font-medium text-gray-700">{$_('token')}</label>
<div on:click={copy} class="inline-flex">
<p
name="token"
class:bg-green-200={copied}
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 p-2">
{new_client.key}
</p>
<div
class="bg-gray-200 border-gray-300 border-t border-b border-r text-black rounded-r-md sm:text-sm p-2 mt-1 cursor-pointer">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="24"
height="24"><path fill="none" d="M0 0h24v24H0z" />
<path
fill="currentColor"
d="M7 4V2h10v2h3l1 1v16a1 1 0 01-1 1H4a1 1 0 01-1-1V5l1-1h3zm0 2H5v14h14V6h-2v2H7V6zm2-2v2h6V4H9z" /></svg>
</div>
</div>
<p class="text-gray-500 text-xs">
{$_('click-to-copy-token-to-clipboard')}
</p>
</div>
</div>
</div>
</div>
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button
on:click={close}
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-green-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
{$_('yes-i-copied-the-token')}
</button>
</div>
</div>
</div>
</div>
{/if}

View File

@@ -1,119 +0,0 @@
<script>
import { t, _ } from "svelte-i18n";
import store from "../../store";
import Toastify from "toastify-js";
import PromiseError from "../base/PromiseError.svelte";
import ConfirmStatsClientDeletion from "./ConfirmStatsClientDeletion.svelte";
import { StatsClientService } from "@odit/lfk-client-js";
let data_loaded = false;
let modal_open;
let delete_client;
export let params;
$: delete_triggered = false;
$: original_data = {};
const promise = StatsClientService.statsClientControllerGetOne(
params.clientid
).then((data) => {
data_loaded = true;
original_data = Object.assign(original_data, data);
});
function deleteClient() {
StatsClientService.statsClientControllerRemove(original_data.id, false)
.then((resp) => {
Toastify({
text: $_("statsclient-deleted"),
duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast();
location.replace("./");
})
.catch((err) => {
modal_open = true;
delete_client = original_data;
});
}
</script>
<ConfirmStatsClientDeletion bind:modal_open bind:delete_client />
{#await promise}
{$_('loading-statsclient-details')}
{:then}
<section class="container p-5 select-none">
<div class="flex flex-row mb-4">
<div class="w-full">
<nav class="w-full flex">
<ol class="list-none flex flex-row items-center justify-start">
<li class="flex items-center">
<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="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z" /></svg>
</li>
<li class="flex items-center ml-2">
<a class="mr-2" href="./">{$_('statsclient')}</a><svg
stroke="currentColor"
fill="none"
stroke-width="2"
viewBox="0 0 24 24"
stroke-linecap="round"
stroke-linejoin="round"
class="h-3 w-3 mr-2 stroke-current"
height="1em"
width="1em"
xmlns="http://www.w3.org/2000/svg"><line
x1="5"
y1="12"
x2="19"
y2="12" />
<polyline points="12 5 19 12 12 19" /></svg>
</li>
<li class="flex items-center">
<span class="mr-2">#{original_data.id}</span>
</li>
</ol>
</nav>
</div>
</div>
<div class="mb-8 text-3xl font-extrabold leading-tight">
#{original_data.id}
<span data-id="stations_actions_${original_data.id}">
{#if store.state.jwtinfo.userdetails.permissions.includes('STATSCLIENT:DELETE')}
{#if delete_triggered}
<button
on:click={deleteClient}
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">{$_('confirm-deletion')}</button>
<button
on:click={() => {
delete_triggered = !delete_triggered;
}}
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')}</button>
{/if}
{#if !delete_triggered}
<button
on:click={() => {
delete_triggered = true;
}}
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">{$_('delete-statsclient')}</button>
{/if}
{/if}
</span>
</div>
<!-- -->
<div class="text-sm w-full">
<label
for="description"
class="font-medium text-gray-700">{$_('description')}</label>
<p
name="description"
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" >
{original_data.description}</p>
</div>
</section>
{:catch error}
<PromiseError {error} />
{/await}

View File

@@ -1,33 +0,0 @@
<script>
import { _ } from "svelte-i18n";
import store from "../../store";
import AddStatsClientModal from "./AddStatsClientModal.svelte";
import CopyStatsClientTokenModal from "./CopyStatsClientTokenModal.svelte";
import StatsClientsOverview from "./StatsClientsOverview.svelte";
export let modal_open = false;
export let copy_modal_open = false;
export let new_client = {};
let current_clients = [];
</script>
<section class="container p-5">
<span class="mb-1 text-3xl font-extrabold leading-tight">
{$_('statsclients')}
{#if store.state.jwtinfo.userdetails.permissions.includes('STATSCLIENT:CREATE')}
<button
on:click={() => {
modal_open = true;
}}
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">
{$_('create-a-new-statsclient')}
</button>
{/if}
</span>
<StatsClientsOverview bind:current_clients bind:modal_open bind:new_client bind:copy_modal_open />
</section>
{#if store.state.jwtinfo.userdetails.permissions.includes('STATSCLIENT:CREATE')}
<AddStatsClientModal bind:modal_open bind:current_clients bind:new_client bind:copy_modal_open/>
<CopyStatsClientTokenModal bind:copy_modal_open bind:new_client />
{/if}

View File

@@ -1,21 +0,0 @@
<script>
import { _ } from "svelte-i18n";
import AddStatsClientModal from "./AddStatsClientModal.svelte";
import CopyScanStationTokenModal from "./CopyStatsClientTokenModal.svelte";
import scanstations_empty from "./statsclients_empty.svg";
let modal_open = false;
let copy_modal_open = false;
let new_client = {};
let current_clients = [];
</script>
<div class="text-center items-center justify-center">
<p class="mb-16 text-lg text-gray-500">
<img class="w-full h-44" src={scanstations_empty} alt="" />
<span class="font-bold">{$_('you-dont-have-any-scanclients-yet')}.</span><br />
<span>{$_('add-the-first-statsclient')}</span>
</p>
</div>
<AddStatsClientModal bind:modal_open bind:current_clients bind:new_client bind:copy_modal_open/>
<CopyScanStationTokenModal bind:copy_modal_open bind:new_client />

View File

@@ -1,150 +0,0 @@
<script>
import { _ } from "svelte-i18n";
import Toastify from "toastify-js";
import { StatsClientService } from "@odit/lfk-client-js";
const promise = StatsClientService.statsClientControllerGetAll().then(
(result) => {
current_clients = result;
}
);
import store from "../../store";
import StatsClientsEmptyState from "./StatsClientsEmptyState.svelte";
import ConfirmStatsClientDeletion from "./ConfirmStatsClientDeletion.svelte";
$: searchvalue = "";
$: active_deletes = [];
let delete_client = {};
let modal_open = false;
export let current_clients = [];
</script>
<ConfirmStatsClientDeletion
on:cancelDelete={(event) => {
modal_open = false;
active_deletes[event.detail.id] = false;
}}
bind:modal_open
bind:delete_client />
{#if store.state.jwtinfo.userdetails.permissions.includes('STATSCLIENT:GET')}
{#await promise}
<div
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
role="alert">
<p class="font-bold">{$_('statsclients-are-being-loaded')}</p>
<p class="text-sm">{$_('this-might-take-a-moment')}</p>
</div>
{:then}
{#if current_clients.length === 0}
<StatsClientsEmptyState />
{:else}
<input
type="search"
bind:value={searchvalue}
placeholder={$_('datatable.search')}
aria-label={$_('datatable.search')}
class="gridjs-input gridjs-search-input mb-4" />
<div
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">
<tr>
<th
scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
{$_('description')}
</th>
<th
scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
{$_('prefix')}
</th>
<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_clients as c}
{#if Object.values(c)
.toString()
.toLowerCase()
.includes(searchvalue)}
<tr data-rowid="station_{c.id}">
<td class="px-6 py-4 whitespace-nowrap">
<div class="flex items-center">
<div class="ml-4">
<div class="text-sm font-medium text-gray-900">
{c.description}
</div>
</div>
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<div class="flex items-center">
<div class="ml-4">
<div class="text-sm font-medium text-gray-900">
{c.prefix}
</div>
</div>
</div>
</td>
{#if active_deletes[c.id] === true}
<td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<button
on:click={() => {
active_deletes[c.id] = false;
}}
tabindex="0"
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
<button
on:click={() => {
StatsClientService.statsClientControllerRemove(c.id, false)
.then((resp) => {
current_clients = current_clients.filter((obj) => obj.id !== c.id);
Toastify({
text: $_('statsclient-deleted'),
duration: 500,
backgroundColor:
'linear-gradient(to right, #00b09b, #96c93d)',
}).showToast();
})
.catch((err) => {
modal_open = true;
delete_client = c;
});
}}
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="/statsclients/{c.id}"
class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a>
{#if store.state.jwtinfo.userdetails.permissions.includes('STATSCLIENT:DELETE')}
<button
on:click={() => {
active_deletes[c.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>
{/await}
{/if}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -43,7 +43,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: $_('team-is-being-added'), text: "Team is being added...",
duration: -1, duration: -1,
}).showToast(); }).showToast();
RunnerTeamService.runnerTeamControllerPost({ RunnerTeamService.runnerTeamControllerPost({
@@ -55,7 +55,7 @@
modal_open = false; modal_open = false;
// //
Toastify({ Toastify({
text: $_('team-added'), text: "Team added",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -16,7 +16,7 @@
RunnerTeamService.runnerTeamControllerRemove(delete_team.id, true) RunnerTeamService.runnerTeamControllerRemove(delete_team.id, true)
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: $_('team-deleted'), text: "Team deleted",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -26,9 +26,9 @@
export let params; export let params;
export let import_modal_open = false; export let import_modal_open = false;
$: delete_triggered = false; $: delete_triggered = false;
$: save_enabled = data_changed && teamdata.parentGroup != null; $: save_enabled = !data_changed && teamdata.parentGroup != null;
$: data_loaded = false; $: data_loaded = false;
$: data_changed = !(JSON.stringify(teamdata) === JSON.stringify(original)); $: data_changed = JSON.stringify(teamdata) === JSON.stringify(original);
$: sponsoring_contracts_show = true; $: sponsoring_contracts_show = true;
$: cards_show = true; $: cards_show = true;
$: certificates_show = true; $: certificates_show = true;
@@ -47,8 +47,6 @@
RunnerOrganizationService.runnerOrganizationControllerGetAll().then( RunnerOrganizationService.runnerOrganizationControllerGetAll().then(
(val) => { (val) => {
orgs = val.map((r) => { orgs = val.map((r) => {
delete r.contact;
r.teams = [];
return { label: r.name, value: r }; return { label: r.name, value: r };
}); });
group = orgs.find((g) => g.value.id == teamdata.parentGroup.id); group = orgs.find((g) => g.value.id == teamdata.parentGroup.id);
@@ -69,7 +67,7 @@
RunnerTeamService.runnerTeamControllerRemove(original.id, false) RunnerTeamService.runnerTeamControllerRemove(original.id, false)
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: $_('team-deleted'), text: "Organization deleted",
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -83,7 +81,7 @@
function submit() { function submit() {
if (data_loaded === true && save_enabled) { if (data_loaded === true && save_enabled) {
Toastify({ Toastify({
text: $_('updating-team'), text: "updating team",
duration: 2500, duration: 2500,
}).showToast(); }).showToast();
let postdata = teamdata; let postdata = teamdata;
@@ -94,7 +92,7 @@
Object.assign(original, teamdata); Object.assign(original, teamdata);
original = original; original = original;
Toastify({ Toastify({
text: $_('updated-team'), text: "updated team",
duration: 2500, duration: 2500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();

View File

@@ -34,7 +34,7 @@
`[data-id="triggered_table_actions_${trackid}"]` `[data-id="triggered_table_actions_${trackid}"]`
).parentNode.parentNode.parentNode; ).parentNode.parentNode.parentNode;
Toastify({ Toastify({
text: $_('track-is-being-updated'), text: "Track is being updated...",
duration: 500, duration: 500,
}).showToast(); }).showToast();
TrackService.trackControllerPut(trackid, { TrackService.trackControllerPut(trackid, {
@@ -45,7 +45,7 @@
}) })
.then((r) => { .then((r) => {
Toastify({ Toastify({
text: $_('track-was-updated'), text: "Track was updated!",
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
duration: 1000, duration: 1000,
}).showToast(); }).showToast();

View File

@@ -27,7 +27,7 @@
}); });
function submit() { function submit() {
Toastify({ Toastify({
text: $_('updating-permissions'), text: "updating permissions...",
duration: 2500, duration: 2500,
}).showToast(); }).showToast();
to_delete.forEach((d) => { to_delete.forEach((d) => {

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
import './style.css'; import 'windi.css';
import "toastify-js/src/toastify.css"; import "toastify-js/src/toastify.css";
import "gridjs/dist/theme/mermaid.css"; import "gridjs/dist/theme/mermaid.css";
import App from './App.svelte'; import App from './App.svelte';

View File

@@ -1,3 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -1,6 +1,4 @@
module.exports = { module.exports = {
mode: 'jit',
purge: [ './src/**/*.svelte' ],
theme: { theme: {
extend: { extend: {
colors: { colors: {

View File

@@ -1,4 +1,5 @@
import svelte from '@sveltejs/vite-plugin-svelte'; import svelte from '@sveltejs/vite-plugin-svelte';
import windiCSS from 'vite-plugin-windicss';
import { minify } from 'html-minifier'; import { minify } from 'html-minifier';
import { defineConfig } from 'vite'; import { defineConfig } from 'vite';
// //
@@ -23,6 +24,17 @@ export default defineConfig(({ command, mode }) => {
minify: isProduction minify: isProduction
}, },
plugins: [ plugins: [
windiCSS({
//@ts-ignore
verbose: true,
silent: false,
debug: true,
config: 'tailwind.config.js', // tailwind config file path (optional)
compile: false, // false: interpretation mode; true: compilation mode
prefix: 'windi-', // set compilation mode style prefix
globalPreflight: true, // set preflight style is global or scoped
globalUtility: true // set utility style is global or scoped
}),
svelte({ svelte({
//@ts-ignore //@ts-ignore
hot: !isProduction, hot: !isProduction,