Compare commits

...

87 Commits

Author SHA1 Message Date
96c55db63d Added translation
ref #143
2023-02-02 17:13:16 +01:00
fecb07ee37 Re-added copy modal
ref #143
2023-02-02 17:11:46 +01:00
e10c6480a5 Removed Key after creation
ref #143
2023-02-02 17:08:29 +01:00
f3cc07c009 Fixed imports and naming 2023-02-02 17:05:34 +01:00
068076dd47 Added Statsclients to sidebar
ref #143
2023-02-02 17:03:18 +01:00
02158605be Basic statsclient detail
ref #143
2023-02-02 17:00:49 +01:00
674e6a90ec Updated mounted variables 2023-02-02 16:54:37 +01:00
f679330466 Updated Add modal
ref #143
2023-02-02 16:51:39 +01:00
93fc7c2e83 Updated deletion modal
ref #143
2023-02-02 16:46:18 +01:00
f299617c60 First page for statsclients
ref #143
2023-02-02 16:42:17 +01:00
28cbc5b98c Bumped apiclient
ref #143
2023-02-02 16:21:11 +01:00
c28f1ee0bc Bumped apiclient
ref #143
2023-02-02 16:04:21 +01:00
cff112d705 Pinned versions
Some checks failed
continuous-integration/drone/push Build is failing
2023-02-02 16:02:52 +01:00
9fc4ad63c4 🚀RELEASE v0.15.6
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-19 17:52:02 +02:00
97054a71c1 new license file version [CI SKIP] 2021-07-19 15:49:32 +00:00
2391668a25 Fixed donations getting reduced to the first one on certificates
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-19 17:47:27 +02:00
717d33547c 🚀RELEASE v0.15.5
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-05 17:23:43 +02:00
997be32679 Merge pull request 'Fixed kilometer conversion' (#142) from bugfix/141-runner_kilometers into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #142
2021-07-05 15:22:55 +00:00
134f00c40e Fixed kilometer conversion
ref #141
2021-07-05 17:15:50 +02:00
47c898bdfd Merge branch 'dev' of https://git.odit.services/lfk/frontend into dev
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-05 17:01:59 +02:00
e752ee12d1 new license file version [CI SKIP] 2021-07-05 15:01:42 +00:00
cc4515ff66 🚀RELEASE v0.15.4 2021-07-05 17:01:31 +02:00
f190292171 Merge pull request 'fix total donation sum in dashboard' (#140) from bugfix/139-total-donation-sum-is-wrong into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #140

close #139
2021-07-05 15:00:44 +00:00
b246f2b349 divide by 100 + toFixes(2)
ref #139
2021-07-05 13:30:17 +02:00
76b69d851a 🚀RELEASE v0.15.3
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-16 18:22:27 +02:00
224f586368 Small bugfix (null got displayed) 🛠 2021-04-16 18:22:00 +02:00
9add6c8ff1 🚀RELEASE v0.15.2
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-16 18:10:50 +02:00
7a63d4eed1 Merge branch 'dev' of https://git.odit.services/lfk/frontend into dev
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-16 18:09:37 +02:00
e54a4807f7 NGINX cache assets 2021-04-16 18:09:30 +02:00
cee04c1d6f Footer - noopener link 2021-04-16 18:09:22 +02:00
cbec78589d Hotfix: Team change recognition 🐞
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-16 18:06:53 +02:00
a85db7cb3f 🚀RELEASE v0.15.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-16 17:53:38 +02:00
2bd3779839 Merge pull request '🐞🐳 fix Dockerfile' (#138) from bugfix/136-opacity_reactivity into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #138
2021-04-16 15:51:37 +00:00
303e33cafb 🐞🐳 fix Dockerfile
ref #136
2021-04-16 17:46:15 +02:00
b4e689dddf Dockerfile now uses selfhosted registry
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-15 19:50:37 +02:00
98a0b036c5 new license file version [CI SKIP] 2021-04-15 17:46:04 +00:00
fb3f30fb10 Merge pull request 'Opacity import fix bugfix/136-opacity_reactivity' (#137) from bugfix/136-opacity_reactivity into dev
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #137
2021-04-15 17:44:49 +00:00
6213952007 Added bs import fix
ref #136
2021-04-15 19:43:43 +02:00
07ac041d69 🚚 move to tailwind
ref #136
2021-04-15 19:22:57 +02:00
5c02028841 🚀RELEASE v0.15.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-15 18:30:38 +02:00
c561b53670 Merge pull request 'Mark donations as payed feature/133-donation_payments' (#135) from feature/133-donation_payments into dev
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #135
2021-04-15 16:29:39 +00:00
dcd0d5a362 Merge branch 'feature/133-donation_payments' of https://git.odit.services/lfk/frontend into feature/133-donation_payments 2021-04-15 18:27:47 +02:00
18acac83bc AddDonationModal - vertical alignment for paid status
ref #133
2021-04-15 18:27:35 +02:00
d7d44470bb DonationsOverview contrast on action
ref #133
2021-04-15 18:25:52 +02:00
0f0aae7ba4 Fixed chante recognition bug for fixed donation
ref #133
2021-04-15 18:21:23 +02:00
4c0886a5d9 Fixed typo
ref #133
2021-04-15 18:04:03 +02:00
04a3038369 Added missing updated comparison
ref #133
2021-04-15 16:56:03 +02:00
bdcf5d3fc0 Added payment updating via detail
ref #133
2021-04-15 15:54:14 +02:00
c7a858eed7 Sorted translations
ref #133
2021-04-15 15:42:47 +02:00
de5aa9237d Added **all** missing toast translations
ref #133
2021-04-15 15:42:29 +02:00
d015f97395 Added translations 🌎
ref #113
2021-04-15 15:34:36 +02:00
57618156b4 Added msiisng runner id conversion
ref #133
2021-04-15 15:30:23 +02:00
865254d646 Fixed styling
ref #133
2021-04-15 15:25:17 +02:00
1dbab03fe7 You can now add payments from the donation overview
ref #133
2021-04-15 15:24:31 +02:00
a943aaf5fc You can now open a modal to add a payment to a donation from the donation overview
ref #133
2021-04-15 15:05:05 +02:00
6e6e8b2617 Added Add Payment button to donor overview
ref #133
2021-04-15 14:40:46 +02:00
4c2c24af2c Changed top info style for donation overview
ref #133
2021-04-15 14:33:35 +02:00
3d3a10aafb You can now mark fixed donations as already paid on creation
ref #133
2021-04-15 14:31:24 +02:00
000fc97beb Changed top info style for donation detail
ref #133
2021-04-15 14:18:28 +02:00
5645eeaafa Added paid donation amount and status to donation detail
ref #133
2021-04-15 14:17:28 +02:00
961477d522 Added total donation amount to donation overview
ref #133
2021-04-15 14:12:11 +02:00
a5f71015a6 Added total donation amount to donor detail
ref #133
2021-04-15 14:10:35 +02:00
e42ea943b7 Added total donation amount to donor overview
ref #133
2021-04-15 14:09:23 +02:00
9c5fc6b61c 🚀RELEASE v0.14.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-14 19:28:00 +02:00
302caf015f new license file version [CI SKIP] 2021-04-14 17:27:30 +00:00
e11296071a Merge pull request 'added donor receipt list download to DonorsOverview' (#134) from feature/132-export-donors-receipt-list into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #134
close #132
2021-04-14 17:26:10 +00:00
112eb29f93 Switched to selfhosted images
ref #132
2021-04-14 19:24:06 +02:00
c6c97516b3 Sorted translations 🌎
ref #132
2021-04-14 19:23:26 +02:00
03676b2894 Fixed typos in translations
ref #132
2021-04-14 19:23:07 +02:00
9ca57fac2e bump @odit/lfk-client-js@0.11.0
ref #132
2021-04-14 18:58:57 +02:00
18f151c1fb general version bump
ref #132
2021-04-14 18:57:14 +02:00
e90e56d8b2 replace donationAmount with paidDonationAmount
ref #132
2021-04-14 18:54:05 +02:00
d241ca5698 added donor receipt list download to DonorsOverview
ref #132
2021-04-14 18:43:51 +02:00
b512cf8667 🚀RELEASE v0.13.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-11 21:14:03 +02:00
a24d2923c6 For await fix
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-11 21:13:44 +02:00
467808abef 🚀RELEASE v0.13.0
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-11 21:08:58 +02:00
861f1f2216 Merge pull request 'Better org pdf generation feature/130-org_doc_splitting' (#131) from feature/130-org_doc_splitting into dev
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #131
2021-04-11 19:07:53 +00:00
509b22bea0 Org certificate generation now runs in sequence
ref #130
2021-04-11 21:00:33 +02:00
7447b2f4c1 Fixed const -> let
ref #130
2021-04-11 20:54:38 +02:00
fef14b6e4f Org card generation now runs in sequence
ref #130
2021-04-11 20:53:58 +02:00
01d2a7e6aa Org contract generation now runs in sequence
ref #130
2021-04-11 20:48:20 +02:00
ac586fec5a Hotfix: Org * generation🐞
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-11 20:17:34 +02:00
5476808683 Emergency document server url change
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-11 20:10:08 +02:00
331d737796 🚀RELEASE v0.12.5
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-08 19:30:20 +02:00
ef81b8adf9 Merge pull request 'Added runner team's parentorg name to runenr overciew' (#129) from feature/128-runner_orgs into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #129
2021-04-08 17:29:27 +00:00
8a7d635cef Switched to html entity
ref #128
2021-04-08 18:00:47 +02:00
4c259c1eef Added runner team's parentorg name to runenr overciew
ref #128
2021-04-08 17:58:49 +02:00
54 changed files with 2550 additions and 1065 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: node:alpine image: registry.odit.services/hub/library/node:alpine
commands: commands:
- yarn - yarn
- yarn licenses:export - yarn licenses:export

1
.gitignore vendored
View File

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

View File

@@ -2,8 +2,134 @@
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 -> 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,14 +1,12 @@
FROM node:15.5.1-alpine3.12 FROM registry.odit.services/hub/library/node:15.14.0-alpine3.13
WORKDIR /app WORKDIR /app
COPY package.json ./ COPY package.json ./
RUN yarn RUN yarn
COPY package.json *.config.js index.html ./ COPY package.json *.config.js postcss.config.cjs 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 alpine FROM registry.odit.services/hub/fholzer/nginx-brotli:v1.19.1
COPY --from=0 /app/dist /app COPY --from=0 /app/dist /usr/share/nginx/html
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.12.4-RELEASE_INFO</span> <span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.15.6-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,6 +6,11 @@ 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.12.4", "version": "0.15.6",
"scripts": { "scripts": {
"i18n-order": "node order.js", "i18n-order": "node order.js",
"dev": "vite", "dev": "vite",
@@ -10,19 +10,20 @@
}, },
"license": "CC-BY-NC-SA-4.0", "license": "CC-BY-NC-SA-4.0",
"devDependencies": { "devDependencies": {
"check-password-strength": "2.0.2", "@odit/lfk-client-js": "0.13.1",
"@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.1", "marked": "2.0.3",
"release-it": "14.5.1", "postcss": "8.2.10",
"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",
@@ -33,7 +34,6 @@
"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": {

6
postcss.config.cjs Normal file
View File

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

View File

@@ -1,5 +1,6 @@
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,6 +72,8 @@
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>
@@ -206,6 +208,14 @@
<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: "chill...", text: $_('please-wait-a-moment-your-login-is-still-being-processed'),
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

@@ -0,0 +1,6 @@
<!--
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}/documents/cards?&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/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,6 +256,26 @@
<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}</div> <div class="text-xl font-bold">{(stats.total_donation/100).toFixed(2)}</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,6 +9,7 @@
} 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) =>
@@ -24,6 +25,7 @@
$: 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 };
@@ -57,14 +59,18 @@
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;
@@ -73,7 +79,7 @@
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();
@@ -102,7 +108,7 @@
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();
@@ -123,7 +129,7 @@
</script> </script>
<style> <style>
input:before { .toggle:before {
content: ""; content: "";
position: absolute; position: absolute;
width: 1.25rem; width: 1.25rem;
@@ -137,12 +143,12 @@
transition: 0.2s ease-in-out; transition: 0.2s ease-in-out;
} }
input:checked { .toggle:checked {
/* @apply: bg-indigo-400; */ /* @apply: bg-indigo-400; */
background-color: #7f9cf5; background-color: #7f9cf5;
} }
input:checked:before { .toggle:checked:before {
left: 1.25rem; left: 1.25rem;
} }
</style> </style>
@@ -195,7 +201,7 @@
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="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="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"
type="checkbox" type="checkbox"
bind:checked={is_fixed} /> bind:checked={is_fixed} />
<span <span
@@ -267,6 +273,29 @@
</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

@@ -0,0 +1,202 @@
<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,6 +20,8 @@
$: 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" &&
@@ -30,15 +32,17 @@
(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(original_data, data); original_data = Object.assign({}, data);
editable = Object.assign(editable, original_data); editable = Object.assign({}, 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) => {
@@ -66,10 +70,11 @@
function submit() { function submit() {
if (data_loaded === true && save_enabled) { if (data_loaded === true && save_enabled) {
Toastify({ Toastify({
text: "Donation is being updated", text: $_('updating-donation'),
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);
@@ -83,7 +88,7 @@
Object.assign(original_data, editable); Object.assign(original_data, editable);
original_data = original_data; original_data = original_data;
Toastify({ Toastify({
text: "updated donation", text: $_('donation-updated'),
duration: 2500, duration: 2500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -98,7 +103,7 @@
Object.assign(original_data, editable); Object.assign(original_data, editable);
original_data = original_data; original_data = original_data;
Toastify({ Toastify({
text: "updated donation", text: $_('donation-updated'),
duration: 2500, duration: 2500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -112,7 +117,7 @@
DonationService.donationControllerRemove(original_data.id, false) DonationService.donationControllerRemove(original_data.id, false)
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: "Donation delete", text: $_('donation-deleted'),
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -219,7 +224,24 @@
<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"
@@ -232,7 +254,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)} on:select={(selectedValue) => {editable.donor = selectedValue.detail.value; editable.donor.donationAmount=original_data.donor.donationAmount; editable.donor.paidDonationAmount =original_data.donor.paidDonationAmount}}
on:clear={() => (editable.donor = null)} /> on:clear={() => (editable.donor = null)} />
</div> </div>
{#if original_data.responseType == 'DISTANCEDONATION'} {#if original_data.responseType == 'DISTANCEDONATION'}
@@ -280,6 +302,39 @@
</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,9 +4,14 @@
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;
@@ -18,8 +23,15 @@
} }
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
@@ -63,6 +75,16 @@
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>
@@ -132,6 +154,22 @@
.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">
@@ -149,7 +187,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)',
@@ -163,6 +201,9 @@
{: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,6 +193,12 @@
<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,6 +20,31 @@
{$_('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 { getLocaleFromNavigator, _ } from "svelte-i18n"; import { _ } 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,6 +77,11 @@
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>
@@ -127,7 +132,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
@@ -145,6 +150,11 @@
.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,8 +32,12 @@
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 class="underline" href="https://docs.lauf-fuer-kaya.de" target="_blank">{$_('documentation')}</a> <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.some((r) => r.is_selected === true); $: generate_orgs = current_organizations.filter((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}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/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}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/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}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/cards?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -216,15 +216,16 @@
async function generateOrgCards(locale) { async function generateOrgCards(locale) {
const toast = Toastify({ const toast = Toastify({
text: $_("generating-pdf"), text: $_("generating-pdfs"),
duration: -1, duration: -1,
}).showToast(); }).showToast();
let count = 0;
const current_cards = await RunnerCardService.runnerCardControllerGetAll(); const current_cards = await RunnerCardService.runnerCardControllerGetAll();
let count = 0;
let count_orgs =0;
for (const o of generate_orgs) { for (const o of generate_orgs) {
const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners( count_orgs++;
o.id let count = 0;
); 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);
@@ -235,8 +236,8 @@
} }
cards.push(card); cards.push(card);
} }
fetch( await fetch(
`${config.baseurl}/documents/cards?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/cards?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -245,39 +246,97 @@
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) => {
count++; const url = window.URL.createObjectURL(blob);
const url = window.URL.createObjectURL(blob); let a = document.createElement("a");
let a = document.createElement("a"); a.href = url;
a.href = url; a.download = `${$_('runnercards')}_${o.name}_direct-${locale}.pdf`;
a.download = `${$_('runnercards')}_${o.name}-${locale}.pdf`; document.body.appendChild(a);
document.body.appendChild(a); a.click();
a.click(); a.remove();
a.remove(); if (count === o.teams.length && count_orgs === generate_orgs.length) {
if (count === generate_orgs.length) { toast.hideToast();
toast.hideToast(); console.log("here")
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,14 +37,15 @@
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.find((d) => d.runner?.id == runner.id) || []; runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
console.log(runner.distanceDonations)
certificateRunners.push(runner); certificateRunners.push(runner);
} }
fetch( fetch(
`${config.baseurl}/documents/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -96,18 +97,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.find((d) => d.runner?.id == runner.id) || []; runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
certificateRunners.push(runner); certificateRunners.push(runner);
} }
fetch( fetch(
`${config.baseurl}/documents/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -154,22 +155,23 @@
async function generateOrgCertificates(locale) { async function generateOrgCertificates(locale) {
const toast = Toastify({ const toast = Toastify({
text: $_("generating-pdf"), text: $_("generating-pdfs"),
duration: -1, duration: -1,
}).showToast(); }).showToast();
const current_donations = (await DonationService.donationControllerGetAll()) || [];
let count = 0; let count = 0;
const current_donations = await DonationService.donationControllerGetAll(); let count_orgs =0;
for (const o of generate_orgs) { for (const o of generate_orgs) {
const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners( count_orgs++;
o.id let count = 0;
); 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.find((d) => d.runner?.id == runner.id) || []; runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
certificateRunners.push(runner); certificateRunners.push(runner);
} }
fetch( await fetch(
`${config.baseurl}/documents/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/certificates?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -178,39 +180,92 @@
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) => {
count++; const url = window.URL.createObjectURL(blob);
const url = window.URL.createObjectURL(blob); let a = document.createElement("a");
let a = document.createElement("a"); a.href = url;
a.href = url; a.download = `${$_('certificates')}_${o.name}_direct-${locale}.pdf`;
a.download = `${$_('certificates')}_${o.name}-${locale}.pdf`; document.body.appendChild(a);
document.body.appendChild(a); a.click();
a.click(); a.remove();
a.remove(); if (count === o.teams.length && count_orgs === generate_orgs.length) {
if (count === generate_orgs.length) { toast.hideToast();
toast.hideToast(); console.log("here")
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}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -92,12 +92,13 @@
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) {
const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners( count_orgs++;
o.id let count = 0;
); let runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(o.id, true)
fetch( await fetch(
`${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@@ -106,39 +107,87 @@
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) => {
count++; const url = window.URL.createObjectURL(blob);
const url = window.URL.createObjectURL(blob); let a = document.createElement("a");
let a = document.createElement("a"); a.href = url;
a.href = url; a.download = `${$_('sponsorings')}_${o.name}_direct-${locale}.pdf`;
a.download = `${$_('sponsorings')}_${o.name}-${locale}.pdf`; document.body.appendChild(a);
document.body.appendChild(a); a.click();
a.click(); a.remove();
a.remove(); if (count === o.teams.length && count_orgs === generate_orgs.length) {
if (count === generate_orgs.length) { toast.hideToast();
toast.hideToast(); console.log("here")
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) => {});
}
} }
} }
@@ -148,7 +197,7 @@
duration: -1, duration: -1,
}).showToast(); }).showToast();
fetch( fetch(
`${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`, `${config.baseurl_documentserver}/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} km</span> <span class="text-gray-700">{original_data.distance /1000 } 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.name}</a> 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>
{/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} {runner.distance /1000 } km
</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

@@ -0,0 +1,151 @@
<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

@@ -0,0 +1,92 @@
<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

@@ -0,0 +1,129 @@
<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

@@ -0,0 +1,119 @@
<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

@@ -0,0 +1,33 @@
<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

@@ -0,0 +1,21 @@
<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

@@ -0,0 +1,150 @@
<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

After

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,6 +47,8 @@
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);
@@ -67,7 +69,7 @@
RunnerTeamService.runnerTeamControllerRemove(original.id, false) RunnerTeamService.runnerTeamControllerRemove(original.id, false)
.then((resp) => { .then((resp) => {
Toastify({ Toastify({
text: "Organization deleted", text: $_('team-deleted'),
duration: 500, duration: 500,
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
@@ -81,7 +83,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;
@@ -92,7 +94,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,432 +1,475 @@
{ {
"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-scan": "Scan wird hinzugefügt", "adding-donation": "Sponsoring wird erstellt...",
"address": "Adresse", "adding-scan": "Scan wird hinzugefügt",
"address-is-required": "Du musst eine Adresse angeben", "address": "Adresse",
"after-deletion-we-cant-restore-your-old-profile": "Nach der Löschung können auch die Admins dein Profil nicht wiederherstellen!", "address-is-required": "Du musst eine Adresse angeben",
"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-deletion-we-cant-restore-your-old-profile": "Nach der Löschung können auch die Admins dein Profil nicht wiederherstellen!",
"all-associated-donations-will-get-deleted-as-well": "Alle Sponsorings dieser Sponsor:in werden ebenfalls gelöscht", "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-runners-will-be-deleted-too": "Alle zugehörigen Läufer:innen werden auch gelöscht!", "all-associated-donations-will-get-deleted-as-well": "Alle Sponsorings dieser Sponsor:in werden ebenfalls gelöscht",
"all-associated-teams-and-runners-will-be-deleted-too": "Alle assoziierten Teams und Läufer:innen werden auch gelöscht!", "all-associated-runners-will-be-deleted-too": "Alle zugehörigen Läufer:innen werden auch gelöscht!",
"amount": "Anzahl", "all-associated-teams-and-runners-will-be-deleted-too": "Alle assoziierten Teams und Läufer:innen werden auch gelöscht!",
"amount-per-kilometer": "Betrag pro Kilometer", "already-paid": "Bereits bezahlt",
"apartment-suite-etc": "Apartment, Wohnung, etc.", "amount": "Anzahl",
"application_name": "Lauf für Kaya! - Admin", "amount-per-kilometer": "Betrag pro Kilometer",
"applying-changes": "Änderungen anwenden", "apartment-suite-etc": "Apartment, Wohnung, etc.",
"attention": "Achtung!", "application_name": "Lauf für Kaya! - Admin",
"author": "Autor:in", "applying-changes": "Änderungen anwenden",
"bitte-bestaetige-diese-laeufer-fuer-den-import": "Bitte die Läufer:innen für den Import bestätigen.", "attention": "Achtung!",
"by": "von", "author": "Autor:in",
"cancel": "Abbrechen", "bitte-bestaetige-diese-laeufer-fuer-den-import": "Bitte die Läufer:innen für den Import bestätigen.",
"cancel-delete": "Löschen abbrechen", "by": "von",
"cancel-keep-donor": "Abbrechen, Sponsor:in behalten", "cancel": "Abbrechen",
"cancel-keep-my-profile": "Abbrechen, mein Profil behalten", "cancel-delete": "Löschen abbrechen",
"cancel-keep-organization": "Abbrechen und Organisation bearbeiten", "cancel-keep-donor": "Abbrechen, Sponsor:in behalten",
"cancel-keep-team": "Abbrechen, Team behalten", "cancel-keep-my-profile": "Abbrechen, mein Profil behalten",
"cannot-reset-your-password-directly": "Schade. \nWir können das Passwort leider nicht direkt zurücksetzen.\nBitte sende uns eine Mail in der du deine Identität bestätigst.", "cancel-keep-organization": "Abbrechen und Organisation bearbeiten",
"card-added": "Karte wurde hinzugefügt", "cancel-keep-team": "Abbrechen, Team behalten",
"card-deleted": "Karte gelöscht", "cannot-reset-your-password-directly": "Schade. \nWir können das Passwort leider nicht direkt zurücksetzen.\nBitte sende uns eine Mail in der du deine Identität bestätigst.",
"card-updated": "Karte aktualisiert", "card-added": "Karte wurde hinzugefügt",
"cards": "Läuferkarten", "card-deleted": "Karte gelöscht",
"certificates": "Urkunden", "card-updated": "Karte aktualisiert",
"change-your-password-here": "Hier kannst du dein Passwort ändern", "cards": "Läuferkarten",
"changing-your-password": "Passwort wird geändert", "certificates": "Urkunden",
"city": "Stadt", "change-your-password-here": "Hier kannst du dein Passwort ändern",
"click-to-copy-the-link-into-your-clipboard": "Klicke auf den Link, um ihn in deine Zwischenablage zu kopieren", "changing-your-password": "Passwort wird geändert",
"click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren", "city": "Stadt",
"close": "Schließen", "click-to-copy-the-link-into-your-clipboard": "Klicke auf den Link, um ihn in deine Zwischenablage zu kopieren",
"code": "Code", "click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren",
"configure-the-tracks-and-minimum-lap-times": "Bearbeite die Tracks und ihre minimale Rundenzeit", "close": "Schließen",
"confirm": "Bestätigen", "code": "Code",
"confirm-delete": "Löschung Bestätigen", "configure-the-tracks-and-minimum-lap-times": "Bearbeite die Tracks und ihre minimale Rundenzeit",
"confirm-delete-donor-with-all-donations": "Bestätigen, Sponsor:in mit allen Sponsorings löschen", "confirm": "Bestätigen",
"confirm-delete-my-user-profile": "Bestätigung, mein Benutzerprofil löschen", "confirm-delete": "Löschung Bestätigen",
"confirm-delete-organization-and-associated-teams-runners": "Bestätugung, lösche die Organisation und alle zugehörigen Teams und Läufer:innen.", "confirm-delete-donor-with-all-donations": "Bestätigen, Sponsor:in mit allen Sponsorings löschen",
"confirm-delete-team-and-associated-runners": "Bestätigung, lösche das Team mitsamt seinen Läufer:innen.", "confirm-delete-my-user-profile": "Bestätigung, mein Benutzerprofil löschen",
"confirm-deletion": "Löschung Bestätigen", "confirm-delete-organization-and-associated-teams-runners": "Bestätugung, lösche die Organisation und alle zugehörigen Teams und Läufer:innen.",
"confirm-the-new-password": "Neues Passwort bestätigen", "confirm-delete-team-and-associated-runners": "Bestätigung, lösche das Team mitsamt seinen Läufer:innen.",
"contact": "Kontakt", "confirm-deletion": "Löschung Bestätigen",
"contact-deleted": "Kontakt gelöscht", "confirm-the-new-password": "Neues Passwort bestätigen",
"contact-information": "Kontaktinformation", "contact": "Kontakt",
"contact-is-being-updated": "Kontakt wird aktualisiert ...", "contact-added": "Kontakt wurde hinzugefügt",
"contact-is-not-a-member-in-any-group": "Kontakt gehört zu keiner Gruppe", "contact-deleted": "Kontakt gelöscht",
"contacts": "Kontakte", "contact-information": "Kontaktinformation",
"contacts-are-being-loaded": "Kontakte werden geladen ...", "contact-is-being-added": "Kontakt wird erstellt...",
"copied-link-to-clipboard": "Link wurde in die Zwischenablage kopiert", "contact-is-being-updated": "Kontakt wird aktualisiert ...",
"copied-token-to-clipboard": "Token wurde in die Zwischenablage kopiert", "contact-is-not-a-member-in-any-group": "Kontakt gehört zu keiner Gruppe",
"count_organizations": "Organisationen (Anzahl)", "contacts": "Kontakte",
"count_teams": "Teams (Anzahl)", "contacts-are-being-loaded": "Kontakte werden geladen ...",
"create": "Erstellen", "copied-link-to-clipboard": "Link wurde in die Zwischenablage kopiert",
"create-a-new": "Erstelle eine neue", "copied-token-to-clipboard": "Token wurde in die Zwischenablage kopiert",
"create-a-new-card": "Neue Läuferkarte erstellen", "count_organizations": "Organisationen (Anzahl)",
"create-a-new-contact": "Kontakt erstellen", "count_teams": "Teams (Anzahl)",
"create-a-new-distance-donation": "Erstelle ein neues Sponsoring", "create": "Erstellen",
"create-a-new-donor": "Neue Sponsor:in erstellen", "create-a-new": "Erstelle eine neue",
"create-a-new-fixed-donation": "Erstelle eine neue Festbetragsspende", "create-a-new-card": "Neue Läuferkarte erstellen",
"create-a-new-organization": "Neue Organisation anlegen", "create-a-new-contact": "Kontakt erstellen",
"create-a-new-runner": "Neue Läufer:in erstellen", "create-a-new-distance-donation": "Erstelle ein neues Sponsoring",
"create-a-new-scan-fixed-only": "Neuen Scan erstellen (nur mit Festdistanz)", "create-a-new-donor": "Neue Sponsor:in erstellen",
"create-a-new-scanstation": "Neue Station erstellen", "create-a-new-fixed-donation": "Erstelle eine neue Festbetragsspende",
"create-a-new-team": "Erstelle ein neues Team", "create-a-new-organization": "Neue Organisation anlegen",
"create-a-new-track": "Neuen Track erstellen", "create-a-new-runner": "Neue Läufer:in erstellen",
"create-a-new-user": "Neue Benutzer:in anlegen", "create-a-new-scan-fixed-only": "Neuen Scan erstellen (nur mit Festdistanz)",
"create-a-new-user-group": "Erstelle eine neue Gruppe", "create-a-new-scanstation": "Neue Station erstellen",
"create-and-generate-pdf": "Erstellen und PDF herunterladen", "create-a-new-team": "Erstelle ein neues Team",
"create-bulk-blanco-cards": "Blankokarten erstellen", "create-a-new-track": "Neuen Track erstellen",
"create-bulk-cards": "Blankokarten erstellen", "create-a-new-user": "Neue Benutzer:in anlegen",
"create-organization": "Organisation erstellen", "create-a-new-user-group": "Erstelle eine neue Gruppe",
"create-team": "Team erstellen", "create-and-generate-pdf": "Erstellen und PDF herunterladen",
"create-track": "Track erstellen", "create-bulk-blanco-cards": "Blankokarten erstellen",
"create-user": "Benutzer anlegen", "create-bulk-cards": "Blankokarten erstellen",
"create-without-pdf": "Ohne PDF erstellen", "create-organization": "Organisation erstellen",
"created-blanco-cards": "Blankokarten wurden erstellt", "create-team": "Team erstellen",
"creating-blanco-cards": "Erstelle Blankokarten", "create-track": "Track erstellen",
"credits": "Credits", "create-user": "Benutzer anlegen",
"csv_import__class": "Klasse", "create-without-pdf": "Ohne PDF erstellen",
"csv_import__firstname": "Vorname", "created-blanco-cards": "Blankokarten wurden erstellt",
"csv_import__lastname": "Nachname", "creating-blanco-cards": "Erstelle Blankokarten",
"csv_import__middlename": "Mittelname", "credits": "Credits",
"csv_import__team": "Team", "csv_import__class": "Klasse",
"danger-zone": "Gefahrenzone", "csv_import__firstname": "Vorname",
"dashboard-greeting": "Hallo", "csv_import__lastname": "Nachname",
"dashboard-title": "Dashboard", "csv_import__middlename": "Mittelname",
"datatable": { "csv_import__team": "Team",
"search": "🔍 Suche ...", "danger-zone": "Gefahrenzone",
"an_error_happened_while_fetching_the_data": "Beim Abrufen der Daten ist ein Fehler aufgetreten", "dashboard-greeting": "Hallo",
"loading": "Wird geladen...", "dashboard-title": "Dashboard",
"next": "Nächste", "datatable": {
"of": "von", "search": "🔍 Suche ...",
"previous": "Vorherige", "an_error_happened_while_fetching_the_data": "Beim Abrufen der Daten ist ein Fehler aufgetreten",
"to": "bis", "loading": "Wird geladen...",
"showing": "Zeige", "next": "Nächste",
"no_matching_records_found": "Keine passenden Einträge gefunden", "of": "von",
"page": "Seite", "previous": "Vorherige",
"records": "Einträge", "to": "bis",
"sort_column_ascending": "Spalte aufsteigend sortieren", "showing": "Zeige",
"sort_column_descending": "Spalte absteigend sortieren" "no_matching_records_found": "Keine passenden Einträge gefunden",
}, "page": "Seite",
"delete": "Löschen", "records": "Einträge",
"delete-contact": "Kontakt löschen", "sort_column_ascending": "Spalte aufsteigend sortieren",
"delete-donation": "Sponsporing löschen", "sort_column_descending": "Spalte absteigend sortieren"
"delete-donor": "Sponsor:in löschen", },
"delete-group": "Gruppe löschen", "delete": "Löschen",
"delete-organization": "Organisation löschen", "delete-contact": "Kontakt löschen",
"delete-profile": "Profil löschen", "delete-donation": "Sponsoring löschen",
"delete-runner": "Läufer:in löschen", "delete-donor": "Sponsor:in löschen",
"delete-scan": "Scan löschen", "delete-group": "Gruppe löschen",
"delete-station": "Station löschen", "delete-organization": "Organisation löschen",
"delete-team": "Team Löschen", "delete-profile": "Profil löschen",
"delete-user": "Benutzer:in löschen", "delete-runner": "Läufer:in löschen",
"deleted-scan": "Scan wurde gelöscht", "delete-scan": "Scan löschen",
"dependency_name": "Name", "delete-station": "Station löschen",
"description": "Beschreibung", "delete-team": "Team Löschen",
"description-optional": "Beschreibung (optional)", "delete-user": "Benutzer:in löschen",
"deselect-all": "Alle abwählen", "deleted-scan": "Scan wurde gelöscht",
"details": "Details", "dependency_name": "Name",
"disabled": "deaktiviert", "description": "Beschreibung",
"distance": "Distanz", "description-optional": "Beschreibung (optional)",
"distance-donation": "Sponsoring", "deselect-all": "Alle abwählen",
"distance-in-km": "Distanz (in KM)", "details": "Details",
"distance-track": "Distanz (+Track)", "disabled": "deaktiviert",
"do-you-really-want-to-delete-your-profile": "Möchtest du dein Profil wirklich löschen?", "distance": "Distanz",
"do-you-want-to-delete-the-organization-delete_org-name": "Möchtest du die Organisation {orgname} löschen?", "distance-donation": "Sponsoring",
"do-you-want-to-delete-the-team-delete_team-name": "Möchtest du das Team {teamname} löschen?", "distance-in-km": "Distanz (in KM)",
"do-you-want-to-delete-this-donor-with-all-related-donations": "Möchtest du diese Sponsor:in mit all ihren Sponsorings löschen?", "distance-track": "Distanz (+Track)",
"documentation": "Dokumentation", "do-you-really-want-to-delete-your-profile": "Möchtest du dein Profil wirklich löschen?",
"donation-amount": "Sponsoringbetrag", "do-you-want-to-delete-the-organization-delete_org-name": "Möchtest du die Organisation {orgname} löschen?",
"donation-amount-must-be-greater-that-0-00eur": "Der Sponsoringbetrag muss größer als 0.00€ sein.", "do-you-want-to-delete-the-team-delete_team-name": "Möchtest du das Team {teamname} löschen?",
"donations": "Sponsorings", "do-you-want-to-delete-this-donor-with-all-related-donations": "Möchtest du diese Sponsor:in mit all ihren Sponsorings löschen?",
"donor": "Sponsor:in", "documentation": "Dokumentation",
"donor-added": "Sponsor:in hinzugefügt", "donation-amount": "Sponsoringbetrag",
"donor-deleted": "Sponsor:in gelöscht", "donation-amount-must-be-greater-that-0-00eur": "Der Sponsoringbetrag muss größer als 0.00€ sein.",
"donor-has-no-associated-donations": "Zur Sponsor:in gibt es noch keine Sponsorings", "donation-deleted": "Sponsoring gelöscht",
"donor-is-being-added": "Sponsor:in wird hinzugefügt...", "donation-updated": "Sponsoring wurde aktualisiert",
"donor-is-being-updated": "Sponsor:in wird aktualisiert", "donation_added": "Sponsoring hinzugefügt",
"donors": "Sponsor:innen", "donations": "Sponsorings",
"donors-are-being-loaded": "Sponsor:innen werden geladen", "donor": "Sponsor:in",
"dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?", "donor-added": "Sponsor:in hinzugefügt",
"dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌", "donor-deleted": "Sponsor:in gelöscht",
"e-mail-adress": "E-Mail-Adresse", "donor-has-no-associated-donations": "Zur Sponsor:in gibt es noch keine Sponsorings",
"edit": "Bearbeiten", "donor-is-being-added": "Sponsor:in wird hinzugefügt...",
"edit-a-card": "Läuferkarte bearbeiten", "donor-is-being-updated": "Sponsor:in wird aktualisiert",
"edit-permissions": "Berechtigungen bearbeiten", "donors": "Sponsor:innen",
"email_address_or_username": "E-Mail-Adresse/ Benutzername", "donors-are-being-loaded": "Sponsor:innen werden geladen",
"enabled": "aktiviert", "dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?",
"enabled_large": "Aktiviert", "dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌",
"english": "Englisch", "e-mail-adress": "E-Mail-Adresse",
"error-during-import": "Fehler beim Importieren", "edit": "Bearbeiten",
"error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage", "edit-a-card": "Läuferkarte bearbeiten",
"error_on_login": "😢Fehler beim Login", "edit-permissions": "Berechtigungen bearbeiten",
"erteilte": "Direkt erteilte", "email_address_or_username": "E-Mail-Adresse/ Benutzername",
"everything-concerning-your-profile": "Alles zu deinem Profil", "enabled": "aktiviert",
"everything-is-more-fun-together": "Im Team macht's mehr Spaß 🏃‍♂️🏃‍♀️🏃‍♂️", "enabled_large": "Aktiviert",
"faq": "FAQ", "english": "Englisch",
"filter-by-organization-team": "Filtern nach Organisation / Team", "enter-payment": "Zahlung eingeben",
"first-name": "Vorname", "error-during-import": "Fehler beim Importieren",
"first-name-is-required": "Vorname muss angegeben werden", "error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage",
"first-scan-of-the-day": "Erster Scan des Tages", "error_on_login": "😢Fehler beim Login",
"fixed-donation": "Festbetragsspende", "erteilte": "Direkt erteilte",
"forgot_password": "Passwort vergessen?", "everything-concerning-your-profile": "Alles zu deinem Profil",
"geerbte": "geerbte", "everything-is-more-fun-together": "Im Team macht's mehr Spaß 🏃‍♂️🏃‍♀️🏃‍♂️",
"general-stats": "Allgemeine Statistiken", "faq": "FAQ",
"general_promise_error": "😢 Ein unbekannter Fehler ist aufgetreten", "filename_sponsoringquittungsliste": "SponsoringQuittungsListe",
"generate-runner-certificate": "Urkunde generieren", "filter-by-organization-team": "Filtern nach Organisation / Team",
"generate-runner-certificates": "Urkunden generieren", "first-name": "Vorname",
"generate-runnercards": "Läuferkarten generieren", "first-name-is-required": "Vorname muss angegeben werden",
"generate-sponsoring-contract": "Sponsoringvertrag generieren", "first-scan-of-the-day": "Erster Scan des Tages",
"generate-sponsoring-contracts": "Sponsoringverträge generieren", "fixed-donation": "Festbetragsspende",
"generating-pdf": "PDF wird generiert...", "forgot_password": "Passwort vergessen?",
"generating-pdfs": "PDFs werden generiert...", "geerbte": "geerbte",
"generic-ui-logic-error": "Etwas ist in der Benutzeroberfläche schiefgelaufen.", "general-stats": "Allgemeine Statistiken",
"german": "Deutsch", "general_promise_error": "😢 Ein unbekannter Fehler ist aufgetreten",
"go-to-login": "Zum Login", "generate-runner-certificate": "Urkunde generieren",
"goback": "Zur Startseite", "generate-runner-certificates": "Urkunden generieren",
"granted": "Gewährt", "generate-runnercards": "Läuferkarten generieren",
"group": "Gruppe", "generate-sponsoring-contract": "Sponsoringvertrag generieren",
"group-added": "Gruppe hinzugefügt", "generate-sponsoring-contracts": "Sponsoringverträge generieren",
"group-is-being-added": "Gruppe wird erstellt", "generating-pdf": "PDF wird generiert...",
"group-name-is-required": "Der Gruppenname muss angegeben werden.", "generating-pdfs": "PDFs werden generiert...",
"group-updated": "Gruppe aktualisiert", "generic-ui-logic-error": "Etwas ist in der Benutzeroberfläche schiefgelaufen.",
"groups": "Gruppen", "german": "Deutsch",
"groups-are-being-loaded": "Gruppen werden geladen", "go-to-login": "Zum Login",
"home": "Start", "goback": "Zur Startseite",
"icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:", "granted": "Gewährt",
"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": "Gruppe",
"import-finished": "Import abgeschlossen", "group-added": "Gruppe hinzugefügt",
"import-runners": "Läufer:innen importieren", "group-is-being-added": "Gruppe wird erstellt",
"import__target-organization": "Ziel Organisation", "group-name-is-required": "Der Gruppenname muss angegeben werden.",
"imprint": "Impressum ", "group-updated": "Gruppe aktualisiert",
"imprint-loading": "Impressum lädt...", "groups": "Gruppen",
"inactive": "Inaktiv", "groups-are-being-loaded": "Gruppen werden geladen",
"installed-version": "Installierte Version", "home": "Start",
"internal-error": "Interner Fehler", "icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:",
"invalid": "Ungültig", "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-mail-reset": "Das ist keine gültige E-Mail", "import-finished": "Import abgeschlossen",
"just-enter-how-many-you-want-and-the-system-will-create-them": "Gebe einfach ein, wie viele Blankokarten das System erstellen soll.", "import-runners": "Läufer:innen importieren",
"laeufer-hinzufuegen": "Läufer:in hinzufügen", "import__target-organization": "Ziel Organisation",
"laeufer-importieren": "Läufer:innen importieren", "imprint": "Impressum ",
"laptime": "Rundenzeit", "imprint-loading": "Impressum lädt...",
"last-name": "Nachname", "inactive": "Inaktiv",
"last-name-is-required": "Nachname muss angegeben werden", "installed-version": "Installierte Version",
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.", "internal-error": "Interner Fehler",
"license": "Lizenz", "invalid": "Ungültig",
"licenses-are-being-loaded": "Lizenzen werden geladen...", "invalid-mail-reset": "Das ist keine gültige E-Mail",
"loading-cards": "Läuferkarten 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-contact-details": "Kontaktdaten werden geladen ...", "laeufer-hinzufuegen": "Läufer:in hinzufügen",
"loading-donation-details": "Lade Sponsoringdetails", "laeufer-importieren": "Läufer:innen importieren",
"loading-donor-details": "Lade Details", "laptime": "Rundenzeit",
"loading-group-detail": "Lade Gruppendetails...", "last-name": "Nachname",
"loading-profile-data": "Lade Profildaten", "last-name-is-required": "Nachname muss angegeben werden",
"loading-runners": "Läufer:innen werden geladen...", "lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
"loading-station-details": "Lade Scanstation-Details ...", "license": "Lizenz",
"log_in": "Anmelden", "licenses-are-being-loaded": "Lizenzen werden geladen...",
"log_in_to_your_account": "Bitte melde dich an", "loading-cards": "Läuferkarten werden geladen",
"login_is_checked": "Login wird überprüft", "loading-contact-details": "Kontaktdaten werden geladen ...",
"logout": "Abmelden", "loading-donation-details": "Lade Sponsoringdetails",
"mail-validation-in-progress": "E-Mail Verifizierung läuft... ", "loading-donor-details": "Lade Details",
"manage-admin-users": "Nutzer verwalten", "loading-group-detail": "Lade Gruppendetails...",
"middle-name": "Mittelname", "loading-profile-data": "Lade Profildaten",
"minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)", "loading-runners": "Läufer:innen werden geladen...",
"minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein", "loading-station-details": "Lade Scanstation-Details ...",
"must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!", "log_in": "Anmelden",
"must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!", "log_in_to_your_account": "Bitte melde dich an",
"must-contain-a-number": "Passwort muss eine Zahl enthalten!", "login_is_checked": "Login wird überprüft",
"must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!", "logout": "Abmelden",
"name": "Name", "mail-validation-in-progress": "E-Mail Verifizierung läuft... ",
"name-is-required": "Der Gruppenname muss angegeben werden", "manage-admin-users": "Nutzer verwalten",
"new-password": "Neues Passwort", "middle-name": "Mittelname",
"no-contact-found": "Keine Kontakte gefunden", "minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)",
"no-contact-selected": "Kein Kontakt ausgewählt", "minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein",
"no-contact-specified": "Kein Kontakt angegeben", "must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!",
"no-donors-found": "Keine Spender:innen gefunden", "must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!",
"no-license-text-could-be-found": "Kein Lizenz-Text gefunden 😢", "must-contain-a-number": "Passwort muss eine Zahl enthalten!",
"no-organization-or-team-found": "Keine Organisationen oder Teams gefunden", "must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!",
"no-organization-specified": "Keine Organisation angegeben", "name": "Name",
"no-organizations-found": "Keine Organisationen gefunden", "name-is-required": "Der Gruppenname muss angegeben werden",
"no-runners-found": "Keine Läufer:innen gefunden", "new-password": "Neues Passwort",
"no-tracks-added-yet": "Es wurden noch keine Tracks erstellt.", "no-contact-found": "Keine Kontakte gefunden",
"non-blanko": "Keine/Blankokarte", "no-contact-selected": "Kein Kontakt ausgewählt",
"organization": "Organisation", "no-contact-specified": "Kein Kontakt angegeben",
"organization-added": "Organisation hinzugefügt", "no-donors-found": "Keine Spender:innen gefunden",
"organization-deleted": "Organisation gelöscht", "no-license-text-could-be-found": "Kein Lizenz-Text gefunden 😢",
"organization-detail-is-being-loaded": "Organisationsdetails werden geladen ...", "no-organization-or-team-found": "Keine Organisationen oder Teams gefunden",
"organization-is-being-added": "Organisation wird hinzugefügt ...", "no-organization-specified": "Keine Organisation angegeben",
"organization-name-is-required": "Der Name muss angegeben werden", "no-organizations-found": "Keine Organisationen gefunden",
"organizations": "Organisationen", "no-runners-found": "Keine Läufer:innen gefunden",
"organizations-are-being-loaded": "Organisationen werden geladen ...", "no-tracks-added-yet": "Es wurden noch keine Tracks erstellt.",
"orgs": "Organisationen", "non-blanko": "Keine/Blankokarte",
"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!", "open": "OFFEN",
"password": "Passwort", "organization": "Organisation",
"password-changed": "Passwort wurde aktualisiert!", "organization-added": "Organisation hinzugefügt",
"password-is-required": "Passwort muss angegeben werden", "organization-deleted": "Organisation gelöscht",
"password-reset-failed": "Passwort zurücksetzen ist fehlgeschlagen!", "organization-detail-is-being-loaded": "Organisationsdetails werden geladen ...",
"password-reset-in-progress": "Passwort wird zurückgesetzt...", "organization-is-being-added": "Organisation wird hinzugefügt ...",
"password-reset-mail-sent": "Passwort-Reset Mail wurde an \"{usersEmail}\" geschickt.", "organization-name-is-required": "Der Name muss angegeben werden",
"password-reset-successful": "Passwort erfolgreich zurückgesetzt!", "organizations": "Organisationen",
"passwords-dont-match": "Die Passwörter stimmen nicht überein!", "organizations-are-being-loaded": "Organisationen werden geladen ...",
"pdf-generation-failed": "PDF Generierung fehlgeschlagen!", "orgs": "Organisationen",
"pdf-successfully-generated": "PDF wurde erfolgreich generiert!", "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!",
"pdfs-successfully-generated": "Alle PDFs wurden generiert!", "paid": "BEZAHLT",
"per-kilometer": "pro Kilometer", "paid-amount": "Gezahlter Betrag",
"permissions": "Berechtigungen", "password": "Passwort",
"permissions-updated": "Berechtigungen aktualisiert!", "password-changed": "Passwort wurde aktualisiert!",
"phone": "Telefon", "password-is-required": "Passwort muss angegeben werden",
"please-copy-the-token-and-store-it-somewhere-save": "Bitte kopiere dir den Token und bewahre ihn gut auf.", "password-reset-failed": "Passwort zurücksetzen ist fehlgeschlagen!",
"please-provide-a-password": "Bitte gebe ein Passwort an...", "password-reset-in-progress": "Passwort wird zurückgesetzt...",
"please-provide-the-nessecary-information-to-add-a-new-donor": "Bitte mach die Notwendigen Angaben, um eine neue Sponsor:in zu erstellen", "password-reset-mail-sent": "Passwort-Reset Mail wurde an \"{usersEmail}\" geschickt.",
"please-provide-the-nessecary-information-to-create-a-new-donation": "Bitte gebe alle für das Sponsoring notwendigen Daten an.", "password-reset-successful": "Passwort erfolgreich zurückgesetzt!",
"please-provide-the-nessecary-information-to-create-a-new-scan": "Bitte gebe alle notwendigen Informationen an, um einen neuen Scan zu erstellen.", "passwords-dont-match": "Die Passwörter stimmen nicht überein!",
"please-provide-the-required-csv-xlsx-file": "Bitte eine CSV oder XLSX Datei hochladen.", "payment-amount-must-be-greater-than-0-00eur": "Der Zahlungsbetrag muss größer als 0.00€ sein!",
"please-provide-the-required-information-for-creating-a-new-user-group": "Bitte gebe alle für eine neue Gruppe notwendigen Informationen an.", "pdf-generation-failed": "PDF Generierung fehlgeschlagen!",
"please-provide-the-required-information-to-add-a-new-contact": "Bitte gebe alle nötigen Informationen an, im den neuen Kontakt zu erstellen.", "pdf-successfully-generated": "PDF wurde erfolgreich generiert!",
"please-provide-the-required-information-to-add-a-new-organization": "Bitte gebe alle nötigen Informationen an, im die neue Organisation zu erstellen.", "pdfs-successfully-generated": "Alle PDFs wurden generiert!",
"please-provide-the-required-information-to-add-a-new-runner": "Bitte die benötigten Informationen angeben.", "per-kilometer": "pro Kilometer",
"please-provide-the-required-information-to-add-a-new-team": "Bitte gebe alle nötigen Informationen an, im das neue Team zu erstellen.", "permissions": "Berechtigungen",
"please-provide-the-required-information-to-add-a-new-track": "Bitte die benötigten Informationen angeben.", "permissions-updated": "Berechtigungen aktualisiert!",
"please-provide-the-required-information-to-add-a-new-user": "Bitte gebe alle nötigen Informationen an, im die neue Benutzer:in zu erstellen.", "phone": "Telefon",
"please-provide-the-required-information-to-create-a-new-scanstation": "Bitte gebe alle für eine Scannerstation notwendigen Informationen an", "please-copy-the-token-and-store-it-somewhere-save": "Bitte kopiere dir den Token und bewahre ihn gut auf.",
"please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...", "please-provide-a-password": "Bitte gebe ein Passwort an...",
"privacy": "Datenschutz", "please-provide-the-nessecary-information-to-add-a-new-donor": "Bitte mach die Notwendigen Angaben, um eine neue Sponsor:in zu erstellen",
"privacy-loading": "Datenschutzerklärung lädt...", "please-provide-the-nessecary-information-to-create-a-new-donation": "Bitte gebe alle für das Sponsoring notwendigen Daten an.",
"profile": "Profil", "please-provide-the-nessecary-information-to-create-a-new-scan": "Bitte gebe alle notwendigen Informationen an, um einen neuen Scan zu erstellen.",
"profile-picture": "Profilbild", "please-provide-the-required-csv-xlsx-file": "Bitte eine CSV oder XLSX Datei hochladen.",
"profile-updated": "Profil wurde aktualisiert!", "please-provide-the-required-information-for-creating-a-new-user-group": "Bitte gebe alle für eine neue Gruppe notwendigen Informationen an.",
"read-license": "Lizenz-Text lesen", "please-provide-the-required-information-to-add-a-new-contact": "Bitte gebe alle nötigen Informationen an, im den neuen Kontakt zu erstellen.",
"receipt-needed": "Spendenquittung benötigt", "please-provide-the-required-information-to-add-a-new-organization": "Bitte gebe alle nötigen Informationen an, im die neue Organisation zu erstellen.",
"repo_link": "Link", "please-provide-the-required-information-to-add-a-new-runner": "Bitte die benötigten Informationen angeben.",
"request-a-new-reset-mail": "Neue Reset-Mail anfordern", "please-provide-the-required-information-to-add-a-new-team": "Bitte gebe alle nötigen Informationen an, im das neue Team zu erstellen.",
"reset-my-password": "Passwort zurücksetzen", "please-provide-the-required-information-to-add-a-new-track": "Bitte die benötigten Informationen angeben.",
"reset-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.",
"runner": "Läufer:in", "please-provide-the-required-information-to-create-a-new-scanstation": "Bitte gebe alle für eine Scannerstation notwendigen Informationen an",
"runner-added": "Läufer:in hinzugefügt", "please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...",
"runner-import": "Läufer:innen Import", "please-wait-a-moment-your-login-is-still-being-processed": "Bitte warte einen Moment, deine Anmeldung wird verarbeitet",
"runner-is-being-added": "Läufer:in wird hinzugefügt...", "privacy": "Datenschutz",
"runner-updated": "Läufer:in aktualisiert!", "privacy-loading": "Datenschutzerklärung lädt...",
"runnercards": "Laeuferkarten", "profile": "Profil",
"runnerimport_verify_runners_org": "Bitte die Läufer:innen für den Import in die Organisation \"{org_name}\" bestätigen", "profile-deleted": "Profil gelöscht!",
"runners": "Läufer", "profile-picture": "Profilbild",
"runners-are-being-imported": "Läufer:innen werden importiert ...", "profile-updated": "Profil wurde aktualisiert!",
"runners-are-being-loaded": "Läufer:innen werden geladen ...", "read-license": "Lizenz-Text lesen",
"save": "Speichern", "receipt-needed": "Spendenquittung benötigt",
"save-changes": "Änderungen speichern", "repo_link": "Link",
"scan-added": "Scan hinzugefügt", "request-a-new-reset-mail": "Neue Reset-Mail anfordern",
"scan-is-being-updated": "Scan wird aktualisiert", "reset-my-password": "Passwort zurücksetzen",
"scan-with-fixed-distance": "Scan mit Festdistanz", "reset-password": "Passwort zurücksetzen",
"scans": "Scans", "runner": "Läufer:in",
"scans-are-being-loaded": "Scans werden geladen", "runner-added": "Läufer:in hinzugefügt",
"scanstation": "Scanner Station", "runner-import": "Läufer:innen Import",
"scanstation-added": "Station wurde erstellt", "runner-is-being-added": "Läufer:in wird hinzugefügt...",
"scanstation-is-being-added": "Scannerstation wird angelegt...", "runner-updated": "Läufer:in aktualisiert!",
"scanstations": "Scanner Stationen", "runnercards": "Laeuferkarten",
"scanstations-are-being-loaded": "Scannerstationen werden geladen...", "runnerimport_verify_runners_org": "Bitte die Läufer:innen für den Import in die Organisation \"{org_name}\" bestätigen",
"search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder Id)", "runners": "Läufer",
"search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder Id)", "runners-are-being-imported": "Läufer:innen werden importiert ...",
"search-for-donor-name-or-id": "Suche eine Spender:in (via Name oder Id)", "runners-are-being-loaded": "Läufer:innen werden geladen ...",
"search-for-permission": "Berechtigungen durchsuchen", "save": "Speichern",
"search-for-runner-by-name-or-id": "Suche eine Läufer:in (via Name oder Id)", "save-changes": "Änderungen speichern",
"select-all": "Alle auswählen", "scan-added": "Scan hinzugefügt",
"select-language": "Sprache auswählen", "scan-is-being-updated": "Scan wird aktualisiert",
"selfservice-registration": "Selfservice Registrierung", "scan-with-fixed-distance": "Scan mit Festdistanz",
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services", "scans": "Scans",
"set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen", "scans-are-being-loaded": "Scans werden geladen",
"settings": "Einstellungen", "scanstation": "Scanner Station",
"settings-for-your-profile": "Die Einstellungen deines Accounts", "scanstation-added": "Station wurde erstellt",
"something-about-the-group": "Infos zur Gruppe", "scanstation-is-being-added": "Scannerstation wird angelegt...",
"sponsorings": "Sponsoringerklaerungen", "scanstations": "Scanner Stationen",
"stats-are-being-loaded": "Die Statistiken werden geladen...", "scanstations-are-being-loaded": "Scannerstationen werden geladen...",
"status": "Status", "search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder Id)",
"stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können", "search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder Id)",
"successful-password-reset": "Passwort erfolgreich zurückgesetzt!", "search-for-donor-name-or-id": "Suche eine Spender:in (via Name oder Id)",
"team": "Team", "search-for-permission": "Berechtigungen durchsuchen",
"team-detail-is-being-loaded": "Team wird geladen...", "search-for-runner-by-name-or-id": "Suche eine Läufer:in (via Name oder Id)",
"team-name": "Teamname", "select-all": "Alle auswählen",
"team-name-is-required": "Teamname ist erforderlich", "select-language": "Sprache auswählen",
"teams": "Teams", "selfservice-registration": "Selfservice Registrierung",
"teams-are-being-loaded": "Teams werden geladen ...", "send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
"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...", "set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen",
"the-scans-distance-must-be-greater-than-0m": "Die Distanz muss größer als 0m sein.", "settings": "Einstellungen",
"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!", "settings-for-your-profile": "Die Einstellungen deines Accounts",
"there-are-no-cards-yet": "Es gibt noch keine Läuferkarten.", "something-about-the-group": "Infos zur Gruppe",
"there-are-no-contacts-added-yet": "Es wurden noch keine Kontakte hinzugefügt.", "sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen",
"there-are-no-donations-yet": "Es gibt noch keine Sponsorings", "sponsorings": "Sponsoringerklaerungen",
"there-are-no-donors-yet": "Es gibt noch keine Sponsor:innen", "stats-are-being-loaded": "Die Statistiken werden geladen...",
"there-are-no-groups-yet": "Es gibt noch keine Gruppen", "status": "Status",
"there-are-no-organizations-added-yet": "Es wurden noch keine Organisationen hinzugefügt.", "stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können",
"there-are-no-runners-added-yet": "Es wurden noch keine Läufer:innen hinzugefügt.", "successful-password-reset": "Passwort erfolgreich zurückgesetzt!",
"there-are-no-scans-yet": "Es gibt noch keine Scans", "team": "Team",
"there-are-no-teams-added-yet": "Es wurden noch keine Teams hinzugefügt.", "team-added": "Team wurde hinzugefügt",
"there-are-no-users-added-yet": "Es wurden noch keine Benutzer hinzugefügt.", "team-deleted": "Team gelöscht",
"this-card-is": "Diese Karte ist", "team-detail-is-being-loaded": "Team wird geladen...",
"this-might-take-a-moment": "Das könnte einen kleinen Moment dauern", "team-is-being-added": "Team wird erstellt...",
"this-scanstation-is": "Diese Station ist", "team-name": "Teamname",
"token": "Token", "team-name-is-required": "Teamname ist erforderlich",
"total-distance": "gelaufene Strecke", "teams": "Teams",
"total-donation-amount": "Gesamtbetrag", "teams-are-being-loaded": "Teams werden geladen ...",
"total-donations": "Spendensumme", "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-scans": "gesamte Scans", "the-scans-distance-must-be-greater-than-0m": "Die Distanz muss größer als 0m sein.",
"track": "Track", "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-added": "Track hinzugefügt", "there-are-no-cards-yet": "Es gibt noch keine Läuferkarten.",
"track-data-is-being-loaded": "Trackdaten werden geladen", "there-are-no-contacts-added-yet": "Es wurden noch keine Kontakte hinzugefügt.",
"track-is-being-added": "Track wird hinzugefügt...", "there-are-no-donations-yet": "Es gibt noch keine Sponsorings",
"track-length-in-m": "Tracklänge (in Metern)", "there-are-no-donors-yet": "Es gibt noch keine Sponsor:innen",
"track-length-must-be-greater-than-0": "Die Länge muss größer als 0 (Meter) sein", "there-are-no-groups-yet": "Es gibt noch keine Gruppen",
"track-name": "Trackname", "there-are-no-organizations-added-yet": "Es wurden noch keine Organisationen hinzugefügt.",
"track-name-must-not-be-empty": "Der Name muss angegeben werden", "there-are-no-runners-added-yet": "Es wurden noch keine Läufer:innen hinzugefügt.",
"tracks": "Tracks", "there-are-no-scans-yet": "Es gibt noch keine Scans",
"update-password": "Passwort ändern", "there-are-no-teams-added-yet": "Es wurden noch keine Teams hinzugefügt.",
"updated-contact": "Kontakt aktualisiert!", "there-are-no-users-added-yet": "Es wurden noch keine Benutzer hinzugefügt.",
"updated-donor": "Sponsor:in wurde aktualisiert", "this-card-is": "Diese Karte ist",
"updated-organization": "Organisation wurde aktualisiert", "this-might-take-a-moment": "Das könnte einen kleinen Moment dauern",
"updated-scan": "Scan wurde aktualisiert", "this-scanstation-is": "Diese Station ist",
"updateing-group": "Gruppe wird aktualisiert...", "token": "Token",
"updating-card": "Karte wird aktualisiert", "total-distance": "gelaufene Strecke",
"updating-organization": "Organisation wird aktualisiert", "total-donation-amount": "Gesamtbetrag",
"updating-permissions": "Berechtigungen werden aktualisiert...", "total-donations": "Spendensumme",
"updating-runner": "Läufer:in wird aktualisiert.", "total-paid-amount": "Gezahlter Gesamtbetrag",
"updating-user": "Benutzer:in wird aktualisiert...", "total-scans": "gesamte Scans",
"updating-your-profile": "Profil wird aktualisiert...", "total_donation_amount_in_eur": "Gesamtbetrag in €",
"user-added": "Benutzer hinzugefügt", "track": "Track",
"user-groups": "Benutzergruppen", "track-added": "Track hinzugefügt",
"user-is-being-added": "Benutzer wird hinzugefügt ...", "track-data-is-being-loaded": "Trackdaten werden geladen",
"user-updated": "Benutzer:in wurde aktualisiert", "track-is-being-added": "Track wird hinzugefügt...",
"username": "Benutzername", "track-is-being-updated": "Track wird aktualisiert...",
"users": "Benutzer", "track-length-in-m": "Tracklänge (in Metern)",
"valid": "Gültig", "track-length-must-be-greater-than-0": "Die Länge muss größer als 0 (Meter) sein",
"valid-city-is-required": "Du musst eine Stadt angeben", "track-name": "Trackname",
"valid-email-is-required": "Es wird eine valide E-Mail Adresse benötigt", "track-name-must-not-be-empty": "Der Name muss angegeben werden",
"valid-international-phone-number-is-required": "Du musst eine Telefonnummer im internationalen Format angeben...", "track-was-updated": "Track wurde aktualisiert",
"valid-zipcode-postal-code-is-required": "Du musst eine valide Postleitzahl angeben", "tracks": "Tracks",
"verfuegbare": "Verfügbar", "unpaid": "Offen",
"welcome_wavinghand": "Willkommen 👋", "update-card": "Karte aktualisieren",
"yes-i-copied-the-token": "Ja, ich habe den Token kopiert", "update-password": "Passwort ändern",
"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-contact": "Kontakt aktualisiert!",
"you-can-now-use-your-new-password-to-log-in-to-your-account": "Du kannst dich jetzt mit deinem neuen Passwort anmelden! 🎉", "updated-donor": "Sponsor:in wurde aktualisiert",
"you-can-provide-a-runner-but-you-dont-have-to": "Du kannst eine Läufer:in angeben, musst aber nicht.", "updated-organization": "Organisation wurde aktualisiert",
"you-dont-have-any-scanstations-yet": "Es gibt noch keine Scannerstationen", "updated-scan": "Scan wurde aktualisiert",
"you-have-to-provide-an-organization": "Du musst eine Organisation angeben", "updated-team": "Team wurde aktualisiert",
"you-have-to-save-your-changes-to-generate-a-link": "Du musst deine Änderungen speichern, um einen Link zu generieren.", "updateing-group": "Gruppe wird aktualisiert...",
"you-must-create-at-least-one-card-or-cancel": "Du musst mindestens eine Blankokarte erstellen (oder abbrechen).", "updating-card": "Karte wird aktualisiert",
"zip-postal-code": "Postleitzahl" "updating-donation": "Sponsoring wird aktualisiert",
} "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,433 +1,476 @@
{ {
"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-scan": "Add scan", "add-or-update-a-payment": "Add or update a payment",
"add-the-first-scanstation": "Add your first scanstation.", "add-scan": "Add scan",
"add-user-group": "Add User Group", "add-the-first-scanstation": "Add your first scanstation.",
"add-your-first-card": "Add your first card", "add-user-group": "Add User Group",
"add-your-first-contact": "Add your first contact", "add-your-first-card": "Add your first card",
"add-your-first-donor": "add your first donor", "add-your-first-contact": "Add your first contact",
"add-your-first-group": "Add your first group", "add-your-first-donor": "add your first donor",
"add-your-first-organization": "Add your first organization", "add-your-first-group": "Add your first group",
"add-your-first-runner": "Add your first runner", "add-your-first-organization": "Add your first organization",
"add-your-first-team": "Add your first team", "add-your-first-runner": "Add your first runner",
"add-your-first-track": "Add your first track.", "add-your-first-team": "Add your first team",
"add-your-first-user": "Add your first user", "add-your-first-track": "Add your first track.",
"add-your-fist-donation": "Add your fist donation", "add-your-first-user": "Add your first user",
"add-your-fist-scan": "Add your fist scan", "add-your-fist-donation": "Add your fist donation",
"adding-card": "Adding Card", "add-your-fist-scan": "Add your fist scan",
"adding-scan": "Adding Scan", "adding-card": "Adding Card",
"address": "Address", "adding-donation": "Adding donation...",
"address-is-required": "Address is required", "adding-scan": "Adding Scan",
"after-deletion-we-cant-restore-your-old-profile": "After deletion we can't restore your old profile!", "address": "Address",
"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.", "address-is-required": "Address is required",
"all-associated-donations-will-get-deleted-as-well": "All associated donations will get deleted as well", "after-deletion-we-cant-restore-your-old-profile": "After deletion we can't restore your old profile!",
"all-associated-runners-will-be-deleted-too": "All associated runners will be deleted too!", "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-teams-and-runners-will-be-deleted-too": "All associated teams and runners will be deleted too!", "all-associated-donations-will-get-deleted-as-well": "All associated donations will get deleted as well",
"amount": "Amount", "all-associated-runners-will-be-deleted-too": "All associated runners will be deleted too!",
"amount-per-kilometer": "Amount per kilometer", "all-associated-teams-and-runners-will-be-deleted-too": "All associated teams and runners will be deleted too!",
"apartment-suite-etc": "Apartment, suite, etc.", "already-paid": "Already paid",
"application_name": "Lauf für Kaya! - Admin", "amount": "Amount",
"applying-changes": "Applying Changes", "amount-per-kilometer": "Amount per kilometer",
"attention": "Attention!", "apartment-suite-etc": "Apartment, suite, etc.",
"author": "Author", "application_name": "Lauf für Kaya! - Admin",
"bitte-bestaetige-diese-laeufer-fuer-den-import": "Please confirm these runners for import.", "applying-changes": "Applying Changes",
"by": "by", "attention": "Attention!",
"cancel": "Cancel", "author": "Author",
"cancel-delete": "Cancel Delete", "bitte-bestaetige-diese-laeufer-fuer-den-import": "Please confirm these runners for import.",
"cancel-keep-donor": "Cancel, keep donor", "by": "by",
"cancel-keep-my-profile": "Cancel, keep my profile", "cancel": "Cancel",
"cancel-keep-organization": "Cancel, keep organization", "cancel-delete": "Cancel Delete",
"cancel-keep-team": "Cancel, keep team", "cancel-keep-donor": "Cancel, keep donor",
"cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity", "cancel-keep-my-profile": "Cancel, keep my profile",
"card-added": "Card added", "cancel-keep-organization": "Cancel, keep organization",
"card-deleted": "Card deleted", "cancel-keep-team": "Cancel, keep team",
"card-updated": "Card updated", "cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity",
"cards": "Cards", "card-added": "Card added",
"certificates": "Certificates", "card-deleted": "Card deleted",
"change-your-password-here": "Change your password here", "card-updated": "Card updated",
"changing-your-password": "Changing your password", "cards": "Cards",
"city": "City", "certificates": "Certificates",
"click-to-copy-the-link-into-your-clipboard": "Click to copy the link into your clipboard", "change-your-password-here": "Change your password here",
"click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard", "changing-your-password": "Changing your password",
"close": "Close", "city": "City",
"code": "Code", "click-to-copy-the-link-into-your-clipboard": "Click to copy the link into your clipboard",
"configure-the-tracks-and-minimum-lap-times": "configure the tracks & minimum lap times", "click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard",
"confirm": "Confirm", "close": "Close",
"confirm-delete": "Confirm Delete", "code": "Code",
"confirm-delete-donor-with-all-donations": "Confirm, delete donor with all donations", "configure-the-tracks-and-minimum-lap-times": "configure the tracks & minimum lap times",
"confirm-delete-my-user-profile": "Confirm, delete my user profile", "confirm": "Confirm",
"confirm-delete-organization-and-associated-teams-runners": "Confirm, delete organization and associated teams+runners.", "confirm-delete": "Confirm Delete",
"confirm-delete-team-and-associated-runners": "Confirm, delete team and associated runners.", "confirm-delete-donor-with-all-donations": "Confirm, delete donor with all donations",
"confirm-deletion": "Confirm Deletion", "confirm-delete-my-user-profile": "Confirm, delete my user profile",
"confirm-the-new-password": "Confirm the new password", "confirm-delete-organization-and-associated-teams-runners": "Confirm, delete organization and associated teams+runners.",
"contact": "Contact", "confirm-delete-team-and-associated-runners": "Confirm, delete team and associated runners.",
"contact-deleted": "Contact deleted", "confirm-deletion": "Confirm Deletion",
"contact-information": "Contact Information", "confirm-the-new-password": "Confirm the new password",
"contact-is-being-updated": "Contact is being updated...", "contact": "Contact",
"contact-is-not-a-member-in-any-group": "Contact is not a member in any group", "contact-added": "Contact added",
"contacts": "Contacts", "contact-deleted": "Contact deleted",
"contacts-are-being-loaded": "contacts are being loaded...", "contact-information": "Contact Information",
"copied-link-to-clipboard": "Copied link to clipboard", "contact-is-being-added": "Contact is being added...",
"copied-token-to-clipboard": "Copied token to clipboard", "contact-is-being-updated": "Contact is being updated...",
"count_organizations": "# Organizations", "contact-is-not-a-member-in-any-group": "Contact is not a member in any group",
"count_teams": "# Teams", "contacts": "Contacts",
"create": "Create", "contacts-are-being-loaded": "contacts are being loaded...",
"create-a-new": "Create a new", "copied-link-to-clipboard": "Copied link to clipboard",
"create-a-new-card": "Create a new card", "copied-token-to-clipboard": "Copied token to clipboard",
"create-a-new-contact": "Create a new contact", "count_organizations": "# Organizations",
"create-a-new-distance-donation": "Create a new distance donation", "count_teams": "# Teams",
"create-a-new-donor": "Create a new donor", "create": "Create",
"create-a-new-fixed-donation": "Create a new fixed donation", "create-a-new": "Create a new",
"create-a-new-organization": "Create a new Organization", "create-a-new-card": "Create a new card",
"create-a-new-runner": "Create a new Runner", "create-a-new-contact": "Create a new contact",
"create-a-new-scan-fixed-only": "Create a new scan (fixed only)", "create-a-new-distance-donation": "Create a new distance donation",
"create-a-new-scanstation": "Create a new station", "create-a-new-donor": "Create a new donor",
"create-a-new-team": "Create a new team", "create-a-new-fixed-donation": "Create a new fixed donation",
"create-a-new-track": "Create a new Track", "create-a-new-organization": "Create a new Organization",
"create-a-new-user": "Create a new User", "create-a-new-runner": "Create a new Runner",
"create-a-new-user-group": "Create a new user group", "create-a-new-scan-fixed-only": "Create a new scan (fixed only)",
"create-and-generate-pdf": "Create and generate PDF", "create-a-new-scanstation": "Create a new station",
"create-bulk-blanco-cards": "Create bulk blanco cards", "create-a-new-team": "Create a new team",
"create-bulk-cards": "Add blanco cards", "create-a-new-track": "Create a new Track",
"create-organization": "Create Organization", "create-a-new-user": "Create a new User",
"create-team": "Create Team", "create-a-new-user-group": "Create a new user group",
"create-track": "Create Track", "create-and-generate-pdf": "Create and generate PDF",
"create-user": "Create User", "create-bulk-blanco-cards": "Create bulk blanco cards",
"create-without-pdf": "Create without PDF", "create-bulk-cards": "Add blanco cards",
"created-blanco-cards": "Created blanco cards", "create-organization": "Create Organization",
"creating-blanco-cards": "Creating blanco cards", "create-team": "Create Team",
"credits": "Credits", "create-track": "Create Track",
"csv_import__class": "Class", "create-user": "Create User",
"csv_import__firstname": "Firstname", "create-without-pdf": "Create without PDF",
"csv_import__lastname": "Lastname", "created-blanco-cards": "Created blanco cards",
"csv_import__middlename": "Middlename", "creating-blanco-cards": "Creating blanco cards",
"csv_import__team": "Team", "credits": "Credits",
"danger-zone": "Danger zone", "csv_import__class": "Class",
"dashboard-greeting": "Hello", "csv_import__firstname": "Firstname",
"dashboard-title": "Dashboard", "csv_import__lastname": "Lastname",
"datatable": { "csv_import__middlename": "Middlename",
"search": "🔍 Search...", "csv_import__team": "Team",
"sort_column_ascending": "Sort column ascending", "danger-zone": "Danger zone",
"sort_column_descending": "Sort column descending", "dashboard-greeting": "Hello",
"previous": "Previous", "dashboard-title": "Dashboard",
"next": "Next", "datatable": {
"page": "Page", "search": "🔍 Search...",
"showing": "Showing", "sort_column_ascending": "Sort column ascending",
"records": "Records", "sort_column_descending": "Sort column descending",
"of": "of", "previous": "Previous",
"to": "to", "next": "Next",
"loading": "Loading...", "page": "Page",
"no_matching_records_found": "No matching records found", "showing": "Showing",
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data" "records": "Records",
}, "of": "of",
"delete": "Delete", "to": "to",
"delete-contact": "Delete Contact", "loading": "Loading...",
"delete-donation": "Delete Donation", "no_matching_records_found": "No matching records found",
"delete-donor": "Delete donor", "an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
"delete-group": "Delete Group", },
"delete-organization": "Delete Organization", "delete": "Delete",
"delete-profile": "Delete Profile", "delete-contact": "Delete Contact",
"delete-runner": "Delete Runner", "delete-donation": "Delete Donation",
"delete-scan": "Delete scan", "delete-donor": "Delete donor",
"delete-station": "Delete station", "delete-group": "Delete Group",
"delete-team": "Delete Team", "delete-organization": "Delete Organization",
"delete-user": "Delete User", "delete-profile": "Delete Profile",
"deleted-scan": "Deleted scan", "delete-runner": "Delete Runner",
"dependency_name": "Name", "delete-scan": "Delete scan",
"description": "description", "delete-station": "Delete station",
"description-optional": "Description (optional)", "delete-team": "Delete Team",
"deselect-all": "deselect all", "delete-user": "Delete User",
"details": "Details", "deleted-scan": "Deleted scan",
"disabled": "disabled", "dependency_name": "Name",
"distance": "Distance", "description": "description",
"distance-donation": "distance donation", "description-optional": "Description (optional)",
"distance-in-km": "Distance in km", "deselect-all": "deselect all",
"distance-track": "Distance (+Track)", "details": "Details",
"do-you-really-want-to-delete-your-profile": "Do you really want to delete your profile?", "disabled": "disabled",
"do-you-want-to-delete-the-organization-delete_org-name": "Do you want to delete the organization {orgname}?", "distance": "Distance",
"do-you-want-to-delete-the-team-delete_team-name": "Do you want to delete the team {teamname}?", "distance-donation": "distance donation",
"do-you-want-to-delete-this-donor-with-all-related-donations": "Do you want to delete this donor with all related donations", "distance-in-km": "Distance in km",
"documentation": "Documentation", "distance-track": "Distance (+Track)",
"donation-amount": "Donation amount", "do-you-really-want-to-delete-your-profile": "Do you really want to delete your profile?",
"donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€", "do-you-want-to-delete-the-organization-delete_org-name": "Do you want to delete the organization {orgname}?",
"donations": "Donations", "do-you-want-to-delete-the-team-delete_team-name": "Do you want to delete the team {teamname}?",
"donor": "Donor", "do-you-want-to-delete-this-donor-with-all-related-donations": "Do you want to delete this donor with all related donations",
"donor-added": "Donor added", "documentation": "Documentation",
"donor-deleted": "donor deleted", "donation-amount": "Donation amount",
"donor-has-no-associated-donations": "Donor has no associated donations.", "donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€",
"donor-is-being-added": "Donor is being added...", "donation-deleted": "Donation deleted",
"donor-is-being-updated": "Donor is being updated", "donation-updated": "Donation updated",
"donors": "Donors", "donation_added": "Donation_added",
"donors-are-being-loaded": "donors are being loaded", "donations": "Donations",
"dont-have-your-email-connected": "Don't have your email connected?", "donor": "Donor",
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌", "donor-added": "Donor added",
"e-mail-adress": "E-Mail Adress", "donor-deleted": "donor deleted",
"edit": "Edit", "donor-has-no-associated-donations": "Donor has no associated donations.",
"edit-a-card": "Edit a card", "donor-is-being-added": "Donor is being added...",
"edit-permissions": "edit permissions", "donor-is-being-updated": "Donor is being updated",
"email_address_or_username": "Email / username", "donors": "Donors",
"enabled": "enabled", "donors-are-being-loaded": "donors are being loaded",
"enabled_large": "Enabled", "dont-have-your-email-connected": "Don't have your email connected?",
"english": "English", "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
"error-during-import": "Error during import", "e-mail-adress": "E-Mail Adress",
"error-whyile-copying-to-clipboard": "Error while copying to clipboard", "edit": "Edit",
"error_on_login": "Error on login", "edit-a-card": "Edit a card",
"erteilte": "Directly granted", "edit-permissions": "edit permissions",
"everything-concerning-your-profile": "Everything concerning your profile", "email_address_or_username": "Email / username",
"everything-is-more-fun-together": "everything is more fun together 🏃‍♂️🏃‍♀️🏃‍♂️", "enabled": "enabled",
"faq": "FAQ", "enabled_large": "Enabled",
"filter-by-organization-team": "Filter by Organization/ Team", "english": "English",
"first-name": "First name", "enter-payment": "Enter payment",
"first-name-is-required": "First Name is required", "error-during-import": "Error during import",
"first-scan-of-the-day": "First scan of the day.", "error-whyile-copying-to-clipboard": "Error while copying to clipboard",
"fixed-donation": "fixed donation", "error_on_login": "Error on login",
"forgot_password": "Forgot your password?", "erteilte": "Directly granted",
"geerbte": "inherited", "everything-concerning-your-profile": "Everything concerning your profile",
"general-stats": "General Stats", "everything-is-more-fun-together": "everything is more fun together 🏃‍♂️🏃‍♀️🏃‍♂️",
"general_promise_error": "😢 Error", "faq": "FAQ",
"generate-runner-certificate": "Generate runner certificate", "filename_sponsoringquittungsliste": "DonorReceiptList",
"generate-runner-certificates": "Generate runner certificates", "filter-by-organization-team": "Filter by Organization/ Team",
"generate-runnercards": "Generate Runnercards", "first-name": "First name",
"generate-sponsoring-contract": "generate sponsoring contract", "first-name-is-required": "First Name is required",
"generate-sponsoring-contracts": "generate sponsoring contracts", "first-scan-of-the-day": "First scan of the day.",
"generating-pdf": "generating PDF...", "fixed-donation": "fixed donation",
"generating-pdfs": "generating PDFs...", "forgot_password": "Forgot your password?",
"generic-ui-logic-error": "Something went wrong in the UI logic", "geerbte": "inherited",
"german": "German", "general-stats": "General Stats",
"go-to-login": "Go To Login", "general_promise_error": "😢 Error",
"goback": "Go Home", "generate-runner-certificate": "Generate runner certificate",
"granted": "granted", "generate-runner-certificates": "Generate runner certificates",
"group": "Group", "generate-runnercards": "Generate Runnercards",
"group-added": "Group added", "generate-sponsoring-contract": "generate sponsoring contract",
"group-is-being-added": "Group is being added...", "generate-sponsoring-contracts": "generate sponsoring contracts",
"group-name-is-required": "Group name is required", "generating-pdf": "generating PDF...",
"group-updated": "group updated", "generating-pdfs": "generating PDFs...",
"groups": "Groups", "generic-ui-logic-error": "Something went wrong in the UI logic",
"groups-are-being-loaded": "Groups are being loaded", "german": "German",
"home": "Home", "go-to-login": "Go To Login",
"icon-image-credits": "We also want to thank these projects for illustrations and icons:", "goback": "Go Home",
"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.", "granted": "granted",
"import-finished": "Import finished", "group": "Group",
"import-runners": "Import runners", "group-added": "Group added",
"import__target-organization": "Target Organization", "group-is-being-added": "Group is being added...",
"imprint": "Imprint", "group-name-is-required": "Group name is required",
"imprint-loading": "Imprint loading...", "group-updated": "group updated",
"inactive": "Inactive", "groups": "Groups",
"installed-version": "Installed version", "groups-are-being-loaded": "Groups are being loaded",
"internal-error": "Internal Error", "home": "Home",
"invalid": "Invalid", "icon-image-credits": "We also want to thank these projects for illustrations and icons:",
"invalid-mail-reset": "the provided email is 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.",
"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-finished": "Import finished",
"laeufer-hinzufuegen": "Add runner", "import-runners": "Import runners",
"laeufer-importieren": "Läufer importieren", "import__target-organization": "Target Organization",
"laptime": "Laptime", "imprint": "Imprint",
"last-name": "Last name", "imprint-loading": "Imprint loading...",
"last-name-is-required": "Last Name is required", "inactive": "Inactive",
"lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.", "installed-version": "Installed version",
"license": "License", "internal-error": "Internal Error",
"licenses-are-being-loaded": "Licenses are being loaded...", "invalid": "Invalid",
"loading-cards": "Loading cards", "invalid-mail-reset": "the provided email is invalid",
"loading-contact-details": "Loading contact details...", "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-donation-details": "Loading donation details", "laeufer-hinzufuegen": "Add runner",
"loading-donor-details": "Loading donor details", "laeufer-importieren": "Läufer importieren",
"loading-group-detail": "Loading group detail...", "laptime": "Laptime",
"loading-profile-data": "Loading profile data", "last-name": "Last name",
"loading-runners": "loading runners...", "last-name-is-required": "Last Name is required",
"loading-station-details": "Loading station details", "lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.",
"log_in": "Log in", "license": "License",
"log_in_to_your_account": "Log in to your account", "licenses-are-being-loaded": "Licenses are being loaded...",
"login_is_checked": "Login is being checked...", "loading-cards": "Loading cards",
"logout": "Logout", "loading-contact-details": "Loading contact details...",
"mail-validation-in-progress": "mail validation in progress...", "loading-donation-details": "Loading donation details",
"manage-admin-users": "manage admin users", "loading-donor-details": "Loading donor details",
"middle-name": "Middle name", "loading-group-detail": "Loading group detail...",
"minimum-lap-time-in-s": "minimum lap time in s", "loading-profile-data": "Loading profile data",
"minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0", "loading-runners": "loading runners...",
"must-be-at-least-10-characters-long": "Must be at least 10 characters long!", "loading-station-details": "Loading station details",
"must-contain-a-lowercase-letter": "Must contain a lowercase letter!", "log_in": "Log in",
"must-contain-a-number": "Must contain a number!", "log_in_to_your_account": "Log in to your account",
"must-contain-a-uppercase-letter": "Must contain a uppercase letter!", "login_is_checked": "Login is being checked...",
"name": "Name", "logout": "Logout",
"name-is-required": "Name is required", "mail-validation-in-progress": "mail validation in progress...",
"new-password": "New password", "manage-admin-users": "manage admin users",
"no-contact-found": "No contacts found", "middle-name": "Middle name",
"no-contact-selected": "No contact selected", "minimum-lap-time-in-s": "minimum lap time in s",
"no-contact-specified": "no contact specified", "minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0",
"no-donors-found": "No donors found", "must-be-at-least-10-characters-long": "Must be at least 10 characters long!",
"no-license-text-could-be-found": "No license text could be found 😢", "must-contain-a-lowercase-letter": "Must contain a lowercase letter!",
"no-organization-or-team-found": "No organization or team found", "must-contain-a-number": "Must contain a number!",
"no-organization-specified": "no organization specified", "must-contain-a-uppercase-letter": "Must contain a uppercase letter!",
"no-organizations-found": "No organizations found", "name": "Name",
"no-runners-found": "No runners found", "name-is-required": "Name is required",
"no-tracks-added-yet": "there are no tracks added yet.", "new-password": "New password",
"non-blanko": "Non/Blanko", "no-contact-found": "No contacts found",
"organization": "Organization", "no-contact-selected": "No contact selected",
"organization-added": "Organization added", "no-contact-specified": "no contact specified",
"organization-deleted": "Organization deleted", "no-donors-found": "No donors found",
"organization-detail-is-being-loaded": "organization detail is being loaded...", "no-license-text-could-be-found": "No license text could be found 😢",
"organization-is-being-added": "Organization is being added...", "no-organization-or-team-found": "No organization or team found",
"organization-name-is-required": "Organization name is required", "no-organization-specified": "no organization specified",
"organizations": "Organizations", "no-organizations-found": "No organizations found",
"organizations-are-being-loaded": "organizations are being loaded...", "no-runners-found": "No runners found",
"orgs": "Organizations", "no-tracks-added-yet": "there are no tracks added yet.",
"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!", "non-blanko": "Non/Blanko",
"password": "Password", "open": "OPEN",
"password-changed": "Password changed!", "organization": "Organization",
"password-is-required": "Password is required", "organization-added": "Organization added",
"password-reset-failed": "Password reset failed!", "organization-deleted": "Organization deleted",
"password-reset-in-progress": "Password Reset in Progress...", "organization-detail-is-being-loaded": "organization detail is being loaded...",
"password-reset-mail-sent": "Password reset mail was sent to \"{usersEmail}\".", "organization-is-being-added": "Organization is being added...",
"password-reset-successful": "Password Reset successful!", "organization-name-is-required": "Organization name is required",
"passwords-dont-match": "Passwords don't match!", "organizations": "Organizations",
"pdf-generation-failed": "PDF generation failed!", "organizations-are-being-loaded": "organizations are being loaded...",
"pdf-successfully-generated": "PDF successfully generated!", "orgs": "Organizations",
"pdfs-successfully-generated": "PDFs 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!",
"per-kilometer": "per Kilometer", "paid": "PAID",
"permissions": "Permissions", "paid-amount": "Paid amount",
"permissions-updated": "Permissions updated!", "password": "Password",
"phone": "Phone", "password-changed": "Password changed!",
"please-copy-the-token-and-store-it-somewhere-save": "Please copy the token and store it somewhere safe.", "password-is-required": "Password is required",
"please-provide-a-password": "Please provide a password...", "password-reset-failed": "Password reset failed!",
"please-provide-the-nessecary-information-to-add-a-new-donor": "Please provide the nessecary information to add a new donor", "password-reset-in-progress": "Password Reset in Progress...",
"please-provide-the-nessecary-information-to-create-a-new-donation": "Please provide the nessecary information to create a new donation", "password-reset-mail-sent": "Password reset mail was sent to \"{usersEmail}\".",
"please-provide-the-nessecary-information-to-create-a-new-scan": "Please provide the nessecary information to create a new scan.", "password-reset-successful": "Password Reset successful!",
"please-provide-the-required-csv-xlsx-file": "Please provide the required csv/ xlsx file", "passwords-dont-match": "Passwords don't match!",
"please-provide-the-required-information-for-creating-a-new-user-group": "Please provide the required information for creating a new user group.", "payment-amount-must-be-greater-than-0-00eur": "Payment amount must be greater than 0.00€!",
"please-provide-the-required-information-to-add-a-new-contact": "Please provide the required information to add a new contact.", "pdf-generation-failed": "PDF generation failed!",
"please-provide-the-required-information-to-add-a-new-organization": "Please provide the required information to add a new organization.", "pdf-successfully-generated": "PDF successfully generated!",
"please-provide-the-required-information-to-add-a-new-runner": "Please provide the required information to add a new runner.", "pdfs-successfully-generated": "PDFs successfully generated!",
"please-provide-the-required-information-to-add-a-new-team": "Please provide the required information to add a new team.", "per-kilometer": "per Kilometer",
"please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.", "permissions": "Permissions",
"please-provide-the-required-information-to-add-a-new-user": "Please provide the required information to add a new user.", "permissions-updated": "Permissions updated!",
"please-provide-the-required-information-to-create-a-new-scanstation": "Please provide the required information to create a new scanstation", "phone": "Phone",
"please-request-a-new-reset-mail": "Please request a new reset mail...", "please-copy-the-token-and-store-it-somewhere-save": "Please copy the token and store it somewhere safe.",
"privacy": "Privacy", "please-provide-a-password": "Please provide a password...",
"privacy-loading": "Privacy loading...", "please-provide-the-nessecary-information-to-add-a-new-donor": "Please provide the nessecary information to add a new donor",
"profile": "Profile", "please-provide-the-nessecary-information-to-create-a-new-donation": "Please provide the nessecary information to create a new donation",
"profile-picture": "Profile Picture", "please-provide-the-nessecary-information-to-create-a-new-scan": "Please provide the nessecary information to create a new scan.",
"profile-updated": "Profile updated!", "please-provide-the-required-csv-xlsx-file": "Please provide the required csv/ xlsx file",
"read-license": "Read License", "please-provide-the-required-information-for-creating-a-new-user-group": "Please provide the required information for creating a new user group.",
"receipt-needed": "Receipt needed", "please-provide-the-required-information-to-add-a-new-contact": "Please provide the required information to add a new contact.",
"repo_link": "Link", "please-provide-the-required-information-to-add-a-new-organization": "Please provide the required information to add a new organization.",
"request-a-new-reset-mail": "Request a new reset mail", "please-provide-the-required-information-to-add-a-new-runner": "Please provide the required information to add a new runner.",
"reset-my-password": "Reset my password", "please-provide-the-required-information-to-add-a-new-team": "Please provide the required information to add a new team.",
"reset-password": "Reset your password", "please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.",
"runner": "Runner", "please-provide-the-required-information-to-add-a-new-user": "Please provide the required information to add a new user.",
"runner-added": "Runner added", "please-provide-the-required-information-to-create-a-new-scanstation": "Please provide the required information to create a new scanstation",
"runner-import": "Runner Import", "please-request-a-new-reset-mail": "Please request a new reset mail...",
"runner-is-being-added": "Runner is being added...", "please-wait-a-moment-your-login-is-still-being-processed": "Please wait a moment, your login is still being processed",
"runner-updated": "Runner updated!", "privacy": "Privacy",
"runnercards": "Runnercards", "privacy-loading": "Privacy loading...",
"runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"", "profile": "Profile",
"runners": "Runners", "profile-deleted": "Profile deleted!",
"runners-are-being-imported": "Runners are being imported...", "profile-picture": "Profile Picture",
"runners-are-being-loaded": "runners are being loaded...", "profile-updated": "Profile updated!",
"save": "Save", "read-license": "Read License",
"save-changes": "Save Changes", "receipt-needed": "Receipt needed",
"scan-added": "Scan added", "repo_link": "Link",
"scan-is-being-updated": "Scan is being updated", "request-a-new-reset-mail": "Request a new reset mail",
"scan-with-fixed-distance": "Scan with fixed distance", "reset-my-password": "Reset my password",
"scans": "Scans", "reset-password": "Reset your password",
"scans-are-being-loaded": "Scans are being loaded", "runner": "Runner",
"scanstation": "Scanstation", "runner-added": "Runner added",
"scanstation-added": "Scanstation added", "runner-import": "Runner Import",
"scanstation-is-being-added": "Adding scanstation...", "runner-is-being-added": "Runner is being added...",
"scanstations": "Scanstations", "runner-updated": "Runner updated!",
"scanstations-are-being-loaded": "Loading scanstations...", "runnercards": "Runnercards",
"search-for-an-organization-by-name-or-id": "Search for an organization (by name or id)", "runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"",
"search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or id)", "runners": "Runners",
"search-for-donor-name-or-id": "Search for donor (by name or id)", "runners-are-being-imported": "Runners are being imported...",
"search-for-permission": "Search for permission", "runners-are-being-loaded": "runners are being loaded...",
"search-for-runner-by-name-or-id": "Search for runner (by name or id)", "save": "Save",
"select-all": "select all", "save-changes": "Save Changes",
"select-language": "Select language", "scan-added": "Scan added",
"selfservice-registration": "Selfservice registration", "scan-is-being-updated": "Scan is being updated",
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services", "scan-with-fixed-distance": "Scan with fixed distance",
"set-the-user-active-inactive": "set the user active/ inactive", "scans": "Scans",
"settings": "Settings", "scans-are-being-loaded": "Scans are being loaded",
"settings-for-your-profile": "Settings for your profile", "scanstation": "Scanstation",
"something-about-the-group": "Something about the group...", "scanstation-added": "Scanstation added",
"sponsorings": "Sponsorings", "scanstation-is-being-added": "Adding scanstation...",
"stats-are-being-loaded": "stats are being loaded...", "scanstations": "Scanstations",
"status": "Status", "scanstations-are-being-loaded": "Loading scanstations...",
"stuff-that-could-harm-your-profile": "Stuff that could harm your profile", "search-for-an-organization-by-name-or-id": "Search for an organization (by name or id)",
"successful-password-reset": "Successful password reset!", "search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or id)",
"team": "Team", "search-for-donor-name-or-id": "Search for donor (by name or id)",
"team-detail-is-being-loaded": "team detail is being loaded...", "search-for-permission": "Search for permission",
"team-name": "Team name", "search-for-runner-by-name-or-id": "Search for runner (by name or id)",
"team-name-is-required": "team name is required", "select-all": "select all",
"teams": "Teams", "select-language": "Select language",
"teams-are-being-loaded": "teams are being loaded...", "selfservice-registration": "Selfservice registration",
"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...", "send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
"the-scans-distance-must-be-greater-than-0m": "The scan's distance must be greater than 0m", "set-the-user-active-inactive": "set the user active/ inactive",
"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": "Settings",
"there-are-no-cards-yet": "There are no cards yet.", "settings-for-your-profile": "Settings for your profile",
"there-are-no-contacts-added-yet": "There are no contacts added yet.", "something-about-the-group": "Something about the group...",
"there-are-no-donations-yet": "There are no donations yet", "sponsoring-quittungs-liste_herunterladen": "Download donor receipt list",
"there-are-no-donors-yet": "There are no donors yet", "sponsorings": "Sponsorings",
"there-are-no-groups-yet": "There are no groups yet", "stats-are-being-loaded": "stats are being loaded...",
"there-are-no-organizations-added-yet": "There are no organizations added yet.", "status": "Status",
"there-are-no-runners-added-yet": "There are no runners added yet.", "stuff-that-could-harm-your-profile": "Stuff that could harm your profile",
"there-are-no-scans-yet": "There are no scans yet", "successful-password-reset": "Successful password reset!",
"there-are-no-teams-added-yet": "There are no teams added yet.", "team": "Team",
"there-are-no-users-added-yet": "There are no users added yet.", "team-added": "Team added",
"this-card-is": "This card is", "team-deleted": "Team deleted",
"this-might-take-a-moment": "This might take a moment 👀", "team-detail-is-being-loaded": "team detail is being loaded...",
"this-scanstation-is": "This scanstation is", "team-is-being-added": "Team is being added...",
"token": "Token", "team-name": "Team name",
"total-distance": "total distance", "team-name-is-required": "team name is required",
"total-donation-amount": "total donation amount", "teams": "Teams",
"total-donations": "total donations", "teams-are-being-loaded": "teams are being loaded...",
"total-scans": "total scans", "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...",
"track": "Track", "the-scans-distance-must-be-greater-than-0m": "The scan's distance must be greater than 0m",
"track-added": "Track added", "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-data-is-being-loaded": "Track data is being loaded", "there-are-no-cards-yet": "There are no cards yet.",
"track-is-being-added": "Track is being added...", "there-are-no-contacts-added-yet": "There are no contacts added yet.",
"track-length-in-m": "Track Length in m", "there-are-no-donations-yet": "There are no donations yet",
"track-length-must-be-greater-than-0": "Track length must be greater than 0", "there-are-no-donors-yet": "There are no donors yet",
"track-name": "Track name", "there-are-no-groups-yet": "There are no groups yet",
"track-name-must-not-be-empty": "Track name must not be empty", "there-are-no-organizations-added-yet": "There are no organizations added yet.",
"tracks": "Tracks", "there-are-no-runners-added-yet": "There are no runners added yet.",
"update-card": "Update Card", "there-are-no-scans-yet": "There are no scans yet",
"update-password": "Update password", "there-are-no-teams-added-yet": "There are no teams added yet.",
"updated-contact": "Updated contact!", "there-are-no-users-added-yet": "There are no users added yet.",
"updated-donor": "updated donor", "this-card-is": "This card is",
"updated-organization": "updated organization", "this-might-take-a-moment": "This might take a moment 👀",
"updated-scan": "updated scan", "this-scanstation-is": "This scanstation is",
"updateing-group": "updateing group...", "token": "Token",
"updating-card": "Updating card", "total-distance": "total distance",
"updating-organization": "updating organization", "total-donation-amount": "total donation amount",
"updating-permissions": "updating permissions...", "total-donations": "total donations",
"updating-runner": "Updating runner...", "total-paid-amount": "Total paid amount",
"updating-user": "updating user...", "total-scans": "total scans",
"updating-your-profile": "Updating your profile...", "total_donation_amount_in_eur": "Total donation amount in €",
"user-added": "User added", "track": "Track",
"user-groups": "User Groups", "track-added": "Track added",
"user-is-being-added": "User is being added...", "track-data-is-being-loaded": "Track data is being loaded",
"user-updated": "User updated", "track-is-being-added": "Track is being added...",
"username": "Username", "track-is-being-updated": "Track is being updated...",
"users": "Users", "track-length-in-m": "Track Length in m",
"valid": "Valid", "track-length-must-be-greater-than-0": "Track length must be greater than 0",
"valid-city-is-required": "Valid city is required", "track-name": "Track name",
"valid-email-is-required": "valid email is required", "track-name-must-not-be-empty": "Track name must not be empty",
"valid-international-phone-number-is-required": "valid international phone number is required...", "track-was-updated": "Track was updated!",
"valid-zipcode-postal-code-is-required": "Valid zipcode/ postal code is required", "tracks": "Tracks",
"verfuegbare": "availdable", "unpaid": "Unpaid",
"welcome_wavinghand": "Welcome 👋", "update-card": "Update Card",
"yes-i-copied-the-token": "Yes, I copied the token", "update-password": "Update password",
"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-contact": "Updated contact!",
"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-donor": "updated donor",
"you-can-provide-a-runner-but-you-dont-have-to": "You can provide a runner, but you don't have to.", "updated-organization": "updated organization",
"you-dont-have-any-scanstations-yet": "You don't have any scanstations yet", "updated-scan": "updated scan",
"you-have-to-provide-an-organization": "You have to provide an organization", "updated-team": "Updated team",
"you-have-to-save-your-changes-to-generate-a-link": "You have to save your changes to generate a link.", "updateing-group": "updateing group...",
"you-must-create-at-least-one-card-or-cancel": "You must create at least one card (or cancel).", "updating-card": "Updating card",
"zip-postal-code": "ZIP/ postal code" "updating-donation": "Updating donation",
} "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 'windi.css'; import './style.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';

3
src/style.css Normal file
View File

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

View File

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

View File

@@ -1,5 +1,4 @@
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';
// //
@@ -24,17 +23,6 @@ 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,