Compare commits
164
Commits
0.11.0
...
96c55db63d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96c55db63d
|
||
|
|
fecb07ee37
|
||
|
|
e10c6480a5
|
||
|
|
f3cc07c009
|
||
|
|
068076dd47
|
||
|
|
02158605be
|
||
|
|
674e6a90ec
|
||
|
|
f679330466
|
||
|
|
93fc7c2e83
|
||
|
|
f299617c60
|
||
|
|
28cbc5b98c
|
||
|
|
c28f1ee0bc
|
||
|
|
cff112d705
|
||
|
|
9fc4ad63c4 | ||
|
|
97054a71c1 | ||
|
|
2391668a25
|
||
|
|
717d33547c | ||
|
|
997be32679 | ||
|
|
134f00c40e
|
||
|
|
47c898bdfd
|
||
|
|
e752ee12d1 | ||
|
|
cc4515ff66
|
||
|
|
f190292171 | ||
|
|
b246f2b349
|
||
|
|
76b69d851a | ||
|
|
224f586368 | ||
|
|
9add6c8ff1 | ||
|
|
7a63d4eed1 | ||
|
|
e54a4807f7 | ||
|
|
cee04c1d6f | ||
|
|
cbec78589d | ||
|
|
a85db7cb3f | ||
|
|
2bd3779839 | ||
|
|
303e33cafb | ||
|
|
b4e689dddf | ||
|
|
98a0b036c5 | ||
|
|
fb3f30fb10 | ||
|
|
6213952007 | ||
|
|
07ac041d69 | ||
|
|
5c02028841 | ||
|
|
c561b53670 | ||
|
|
dcd0d5a362 | ||
|
|
18acac83bc | ||
|
|
d7d44470bb | ||
|
|
0f0aae7ba4 | ||
|
|
4c0886a5d9 | ||
|
|
04a3038369 | ||
|
|
bdcf5d3fc0 | ||
|
|
c7a858eed7 | ||
|
|
de5aa9237d | ||
|
|
d015f97395 | ||
|
|
57618156b4 | ||
|
|
865254d646 | ||
|
|
1dbab03fe7 | ||
|
|
a943aaf5fc | ||
|
|
6e6e8b2617 | ||
|
|
4c2c24af2c | ||
|
|
3d3a10aafb | ||
|
|
000fc97beb | ||
|
|
5645eeaafa | ||
|
|
961477d522 | ||
|
|
a5f71015a6 | ||
|
|
e42ea943b7 | ||
|
|
9c5fc6b61c | ||
|
|
302caf015f | ||
|
|
e11296071a | ||
|
|
112eb29f93 | ||
|
|
c6c97516b3 | ||
|
|
03676b2894 | ||
|
|
9ca57fac2e | ||
|
|
18f151c1fb | ||
|
|
e90e56d8b2 | ||
|
|
d241ca5698 | ||
|
|
b512cf8667 | ||
|
|
a24d2923c6 | ||
|
|
467808abef | ||
|
|
861f1f2216 | ||
|
|
509b22bea0 | ||
|
|
7447b2f4c1 | ||
|
|
fef14b6e4f | ||
|
|
01d2a7e6aa | ||
|
|
ac586fec5a | ||
|
|
5476808683 | ||
|
|
331d737796 | ||
|
|
ef81b8adf9 | ||
|
|
8a7d635cef | ||
|
|
4c259c1eef | ||
|
|
5b4ede5e2f | ||
|
|
d0ab3dda78 | ||
|
|
d9cf51b4bb | ||
|
|
aa17f24220 | ||
|
|
cf60edf7d4 | ||
|
|
ffbc243194 | ||
|
|
b6b07cf30c | ||
|
|
495a6b22bd | ||
|
|
0acaffbdfa | ||
|
|
6043bc4517 | ||
|
|
e6ed066e3f | ||
|
|
ee4e8655b8 | ||
|
|
37970d2be6 | ||
|
|
1376788016 | ||
|
|
4cad86cf85 | ||
|
|
6304116edb | ||
|
|
834ff8fa63 | ||
|
|
1f428a535e | ||
|
|
0c40966970 | ||
|
|
9da071fe9b | ||
|
|
892a04f289 | ||
|
|
27cc9727f1 | ||
|
|
f0738d451b | ||
|
|
9e6a8daf2c | ||
|
|
bfacfec765 | ||
|
|
0bae5bf32b | ||
|
|
22b09d16d0 | ||
|
|
9c867e106e | ||
|
|
304f28a3c1 | ||
|
|
d65d3793de | ||
|
|
3638d87bd2 | ||
|
|
b97a92860d | ||
|
|
7c86a5eeb3 | ||
|
|
d23dbaaf69 | ||
|
|
e6ffc371e1 | ||
|
|
3177c6eaa3 | ||
|
|
acd2f0519d | ||
|
|
18ec100c33 | ||
|
|
fa55fce76e | ||
|
|
f47d5e347d | ||
|
|
7488a8b597 | ||
|
|
2e3ac154be | ||
|
|
2472640755 | ||
|
|
7b685d6cad | ||
|
|
17f6f4e616 | ||
|
|
48cfc15cfb | ||
|
|
bb9b779cee | ||
|
|
af63ce67ae | ||
|
|
5cc4871ec4 | ||
|
|
c8cfe669b8 | ||
|
|
8b74d6d759 | ||
|
|
a9227768de | ||
|
|
d966e1d4de | ||
|
|
ceb2146c1b | ||
|
|
8d006d8c74 | ||
|
|
777304f259 | ||
|
|
12433f7c23 | ||
|
|
44b53da345 | ||
|
|
ab45fc144e | ||
|
|
e99e9e0708 | ||
|
|
467404bfc8 | ||
|
|
ce50fa2a62 | ||
|
|
10a011d842 | ||
|
|
5352410d0c | ||
|
|
c5d155396a | ||
|
|
93187099d3 | ||
|
|
aa24b1dce5 | ||
|
|
eb3ede9593 | ||
|
|
d7fecfbd0b | ||
|
|
b065b4ff21 | ||
|
|
0cd3e937d8 | ||
|
|
6be2ee626a | ||
|
|
008027db0e | ||
|
|
aec5e3473e | ||
|
|
95c8fde72f | ||
|
|
0f32968fae | ||
|
|
ae79e9fea1 |
No files matched your search
@@ -0,0 +1,6 @@
|
|||||||
|
FROM mcr.microsoft.com/vscode/devcontainers/base:alpine-3.12
|
||||||
|
RUN apk update
|
||||||
|
RUN apk add --upgrade nodejs-current npm
|
||||||
|
RUN npm i -g yarn rimraf
|
||||||
|
RUN rimraf node_modules
|
||||||
|
RUN yarn set version berry
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "Node.js",
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.shell.linux": "/bin/sh"
|
||||||
|
},
|
||||||
|
"extensions": [
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"2gua.rainbow-brackets",
|
||||||
|
"christian-kohler.npm-intellisense",
|
||||||
|
"remimarsal.prettier-now",
|
||||||
|
"svelte.svelte-vscode",
|
||||||
|
"lokalise.i18n-ally",
|
||||||
|
"fivethree.vscode-svelte-snippets",
|
||||||
|
"voorjaar.windicss-intellisense"
|
||||||
|
],
|
||||||
|
"postCreateCommand": "yarn && yarn dev --open"
|
||||||
|
}
|
||||||
+1
-3
@@ -1,3 +1 @@
|
|||||||
public/env.sample.js
|
public/env.sample.js
|
||||||
public/workbox-*.js
|
|
||||||
public/workbox-*.js.map
|
|
||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+5
-5
@@ -1,11 +1,11 @@
|
|||||||
node_modules
|
node_modules
|
||||||
build
|
|
||||||
package-lock.json
|
package-lock.json
|
||||||
yarn.lock
|
yarn.lock
|
||||||
*.map
|
*.map
|
||||||
public/env.js
|
public/env.js
|
||||||
public/sw.js
|
|
||||||
public/index.html
|
|
||||||
public/workbox-*.js
|
|
||||||
svelte.config.js
|
|
||||||
public/index.html
|
public/index.html
|
||||||
|
/dist
|
||||||
|
.yarn
|
||||||
|
.pnp.js
|
||||||
|
.yarnrc.yml
|
||||||
|
pnpm-lock.yaml
|
||||||
Vendored
+2
-1
@@ -5,7 +5,8 @@
|
|||||||
"remimarsal.prettier-now",
|
"remimarsal.prettier-now",
|
||||||
"svelte.svelte-vscode",
|
"svelte.svelte-vscode",
|
||||||
"lokalise.i18n-ally",
|
"lokalise.i18n-ally",
|
||||||
"fivethree.vscode-svelte-snippets"
|
"fivethree.vscode-svelte-snippets",
|
||||||
|
"voorjaar.windicss-intellisense"
|
||||||
],
|
],
|
||||||
"unwantedRecommendations": [
|
"unwantedRecommendations": [
|
||||||
"antfu.i18n-ally"
|
"antfu.i18n-ally"
|
||||||
|
|||||||
Vendored
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
"i18n-ally.localesPaths": "src/locales",
|
"i18n-ally.localesPaths": "src/locales",
|
||||||
"i18n-ally.keystyle": "nested"
|
"i18n-ally.keystyle": "nested",
|
||||||
|
"windicss.enableCodeFolding": false,
|
||||||
}
|
}
|
||||||
+227
-1
@@ -2,15 +2,241 @@
|
|||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
> 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)
|
||||||
|
|
||||||
|
#### [0.12.3](https://git.odit.services/lfk/frontend/compare/0.12.2...0.12.3)
|
||||||
|
|
||||||
|
> 8 April 2021
|
||||||
|
|
||||||
|
- Merge pull request 'fix' (#126) from bugfix/125-mobile into dev [`#125`](https://git.odit.services/lfk/frontend/issues/125)
|
||||||
|
- almost fixed... [`495a6b2`](https://git.odit.services/lfk/frontend/commit/495a6b22bd8036593f390bdb862d325524cefbcc)
|
||||||
|
- 🐞 bugfix for svelte x tailwind class names [`b6b07cf`](https://git.odit.services/lfk/frontend/commit/b6b07cf30cc6533bd5dbfec1f813c16fde85634d)
|
||||||
|
- fix [`0acaffb`](https://git.odit.services/lfk/frontend/commit/0acaffbdfa359e52654a5afe2788aa59fe6f9036)
|
||||||
|
- 🚀RELEASE v0.12.3 [`d9cf51b`](https://git.odit.services/lfk/frontend/commit/d9cf51b4bbc2136594a03c5d0eeb8cb3f3440b2a)
|
||||||
|
- custom css fix for collapsed_navigation [`ffbc243`](https://git.odit.services/lfk/frontend/commit/ffbc243194c7faeb4fe61c12711a1c441c3994ef)
|
||||||
|
- new license file version [CI SKIP] [`aa17f24`](https://git.odit.services/lfk/frontend/commit/aa17f242209f7e7cecff774ace7a35b581adec1f)
|
||||||
|
|
||||||
|
#### [0.12.2](https://git.odit.services/lfk/frontend/compare/0.12.1...0.12.2)
|
||||||
|
|
||||||
|
> 7 April 2021
|
||||||
|
|
||||||
|
- 🚀RELEASE v0.12.2 [`6043bc4`](https://git.odit.services/lfk/frontend/commit/6043bc45174d51ab110b0ed10a8679d96127ab87)
|
||||||
|
- Merge pull request 'feature/110-virtual_list' (#124) from feature/110-virtual_list into dev [`e6ed066`](https://git.odit.services/lfk/frontend/commit/e6ed066e3ffabba6519f94d801d21a27819d0492)
|
||||||
|
- wip on virtuallist [`6304116`](https://git.odit.services/lfk/frontend/commit/6304116edb7f5e3c7b67c15e0b1740d34c513155)
|
||||||
|
- fixed height table [`4cad86c`](https://git.odit.services/lfk/frontend/commit/4cad86cf852468428d77103d052c6974b17c34c3)
|
||||||
|
- pre-merge fixes [`37970d2`](https://git.odit.services/lfk/frontend/commit/37970d2be6b6502701914e41e5bfe2c418438480)
|
||||||
|
- updated virtual scroll list [`1376788`](https://git.odit.services/lfk/frontend/commit/1376788016e767f006661f8c9e6747781f2dce55)
|
||||||
|
|
||||||
|
#### [0.12.1](https://git.odit.services/lfk/frontend/compare/0.12.0...0.12.1)
|
||||||
|
|
||||||
|
> 6 April 2021
|
||||||
|
|
||||||
|
- 🚀RELEASE v0.12.1 [`834ff8f`](https://git.odit.services/lfk/frontend/commit/834ff8fa63178f36dcacf931c128ba67a3e7bd1b)
|
||||||
|
- Merge pull request 'ImportRunnerModal Cancel Button feature/122-import_cancel' (#123) from feature/112-import_cancel into dev [`1f428a5`](https://git.odit.services/lfk/frontend/commit/1f428a535e3ae619cbf8db51d04255aac8dd8614)
|
||||||
|
- Added cancel button for the first stage of runner import [`0c40966`](https://git.odit.services/lfk/frontend/commit/0c409669700d3a8096cc04716154b0fdca458fe5)
|
||||||
|
- Escape now triggers foll modal close (including reset) instead of just hiding th modal [`9da071f`](https://git.odit.services/lfk/frontend/commit/9da071fe9ba067160334682bf00163e3630fe919)
|
||||||
|
|
||||||
|
#### [0.12.0](https://git.odit.services/lfk/frontend/compare/0.11.0...0.12.0)
|
||||||
|
|
||||||
|
> 5 April 2021
|
||||||
|
|
||||||
|
- Merge pull request 'feature/108_vite_migration' (#118) from feature/108_vite_migration into dev [`#108`](https://git.odit.services/lfk/frontend/issues/108)
|
||||||
|
- 🚀RELEASE v0.12.0 [`892a04f`](https://git.odit.services/lfk/frontend/commit/892a04f28930481715eb486b1ef4efeb98a6e999)
|
||||||
|
- Fixed package version [`27cc972`](https://git.odit.services/lfk/frontend/commit/27cc9727f1d02d186c3ccadb06e5b4b1b1d6202d)
|
||||||
|
- Merge pull request 'Implmented certificate generation feature/119-Certificate_generation' (#120) from feature/119-Certificate_generation into dev [`f0738d4`](https://git.odit.services/lfk/frontend/commit/f0738d451b02e4a298b5f9cb8ab0be16aed10a38)
|
||||||
|
- The PFS Prefixes now get translated via i18n [`bfacfec`](https://git.odit.services/lfk/frontend/commit/bfacfec76511cae3015f52698fdcbd80a7a15981)
|
||||||
|
- Sorted translations 🌍 [`9e6a8da`](https://git.odit.services/lfk/frontend/commit/9e6a8daf2c394cf17da532382ec7d049a0f89577)
|
||||||
|
- added missing/ wrong translations + formatting! [`7c86a5e`](https://git.odit.services/lfk/frontend/commit/7c86a5eeb370a43451d180a09a501066b023b9a0)
|
||||||
|
- Added i18n [`17f6f4e`](https://git.odit.services/lfk/frontend/commit/17f6f4e616bf57424ee12ad53b939429c02a0171)
|
||||||
|
- Added basic certificate generation component [`af63ce6`](https://git.odit.services/lfk/frontend/commit/af63ce67ae7d8f8a70706c3bd6755197908996ff)
|
||||||
|
- basic ViteJS migration [`ae79e9f`](https://git.odit.services/lfk/frontend/commit/ae79e9fea1963e977ef468e8e56f87d68916fadd)
|
||||||
|
- Implemented generation for orgs [`2e3ac15`](https://git.odit.services/lfk/frontend/commit/2e3ac154be0bf0776cd00f7d510f41ec676ae690)
|
||||||
|
- Implemented generation for teams [`2472640`](https://git.odit.services/lfk/frontend/commit/2472640755e3e41259a44127a875d00517a25842)
|
||||||
|
- updated default entrypoint [`95c8fde`](https://git.odit.services/lfk/frontend/commit/95c8fde72fca5cd5a644d51a33dc88e0b59fce92)
|
||||||
|
- ⏫📍 version bump + pin [`b065b4f`](https://git.odit.services/lfk/frontend/commit/b065b4ff218d07952fa45989e6e2ee7df13e07c1)
|
||||||
|
- 🧹 reorder + fix package [`12433f7`](https://git.odit.services/lfk/frontend/commit/12433f7c236906fe2b29848a0acaa6be1724da56)
|
||||||
|
- 🔨 re-added VS Code devcontainer config [`9318709`](https://git.odit.services/lfk/frontend/commit/93187099d32c506329b1437642aae985f2850689)
|
||||||
|
- 🐳 new Dockerfiles [`0f32968`](https://git.odit.services/lfk/frontend/commit/0f32968fae8b55a13d387918211983d0e61f85ab)
|
||||||
|
- 📃 added readme [`aa24b1d`](https://git.odit.services/lfk/frontend/commit/aa24b1dce5d6d73c8f42fc57f81b692350bf9665)
|
||||||
|
- Copy-paste fix [`f47d5e3`](https://git.odit.services/lfk/frontend/commit/f47d5e347d97ee127fa0380620138a9672665cd5)
|
||||||
|
- 🔨🔥 alpine based devcontainer with working yarn PnP [`777304f`](https://git.odit.services/lfk/frontend/commit/777304f2593df36f4e89d2ba7680add183ff062f)
|
||||||
|
- Copy-paste fix [`7488a8b`](https://git.odit.services/lfk/frontend/commit/7488a8b597a148c309e1b4499d277fed7f3bf9f4)
|
||||||
|
- You can now generate certificates from the runner overview [`bb9b779`](https://git.odit.services/lfk/frontend/commit/bb9b779cee909ab85ef52f13be0a917f1c0a9e62)
|
||||||
|
- Cleaned up generation strings and added the schem for single runner generations for cards [`9c867e1`](https://git.odit.services/lfk/frontend/commit/9c867e106edd68784e6d19743519c1952a0f0bc7)
|
||||||
|
- Changed the basic nameing generation for runenr certificate files [`d65d379`](https://git.odit.services/lfk/frontend/commit/d65d3793de869bcd6733a1bbdac378d0bc1128b3)
|
||||||
|
- ⏫ version bumps [`d7fecfb`](https://git.odit.services/lfk/frontend/commit/d7fecfbd0bc01f1cd44dea3c3837e0cc44afab12)
|
||||||
|
- Cleaned up generation strings and added the schem for single runner generations for sponsoring contracts [`22b09d1`](https://git.odit.services/lfk/frontend/commit/22b09d16d0acc2883e3448dad95ed0f4ea7c6aeb)
|
||||||
|
- Certificate generation from org overview [`3177c6e`](https://git.odit.services/lfk/frontend/commit/3177c6eaa31636ed4546f4797775a0f0a930f5d1)
|
||||||
|
- certificate pdf names now include their locale [`304f28a`](https://git.odit.services/lfk/frontend/commit/304f28a3c10bc4745aa5b7c80d7ba0e651540706)
|
||||||
|
- Runnercard pdfs now include their locale [`3638d87`](https://git.odit.services/lfk/frontend/commit/3638d87bd2ff83618eefda5af18ba19e38e3c2eb)
|
||||||
|
- 🐞 fix await for esNext [`a922776`](https://git.odit.services/lfk/frontend/commit/a9227768de29305b51d10c8a6e4fa1d39b7d998f)
|
||||||
|
- Certificate generation from team overview [`18ec100`](https://git.odit.services/lfk/frontend/commit/18ec100c33a1fbab526187e769dbae54d9db0867)
|
||||||
|
- Added certificate generation from runner overview and detail [`7b685d6`](https://git.odit.services/lfk/frontend/commit/7b685d6cad97d2f7f48c4b19bfc128e1355b70c4)
|
||||||
|
- package cleanup [`6be2ee6`](https://git.odit.services/lfk/frontend/commit/6be2ee626addaf5113b4b4821bd99a276bf4f329)
|
||||||
|
- sponsoring pdf names now include their locale [`0bae5bf`](https://git.odit.services/lfk/frontend/commit/0bae5bf32b8687057dca50cde21022ea8c3abee8)
|
||||||
|
- ✨ update licenses.json [`e99e9e0`](https://git.odit.services/lfk/frontend/commit/e99e9e07089520d5a48021e10d2af7739656641a)
|
||||||
|
- added windicss settings for VSCode [`008027d`](https://git.odit.services/lfk/frontend/commit/008027db0e2736a9bb9defd67178ab3fe580de04)
|
||||||
|
- Certificate generation from team detail [`acd2f05`](https://git.odit.services/lfk/frontend/commit/acd2f0519d62e55dad8e9c3c41e77b6967212502)
|
||||||
|
- ⚡💾 prevent env.js from being cached [`c5d1553`](https://git.odit.services/lfk/frontend/commit/c5d155396a92dfee6d592fb24a936ab521215f6d)
|
||||||
|
- for await fix - ViteJS [`aec5e34`](https://git.odit.services/lfk/frontend/commit/aec5e3473e687415fbfd69c550d9b012e1b1be43)
|
||||||
|
- Certificate generation from org detail [`e6ffc37`](https://git.odit.services/lfk/frontend/commit/e6ffc371e1ca2d4451e7dd4a3ca3c05564edb5fb)
|
||||||
|
- 🧹 drop unused dependencies [`ce50fa2`](https://git.odit.services/lfk/frontend/commit/ce50fa2a62f8ff98e8be9c66432caeebb3952019)
|
||||||
|
- 🐞 fix NGINX config [`5352410`](https://git.odit.services/lfk/frontend/commit/5352410d0c76fd14575d7beafc6a83f028062efe)
|
||||||
|
- Fixed wrong permissiong getting checked [`b97a928`](https://git.odit.services/lfk/frontend/commit/b97a92860d71eb0384170e245a67fa3ea3fd8e85)
|
||||||
|
- new license file version [CI SKIP] [`5cc4871`](https://git.odit.services/lfk/frontend/commit/5cc4871ec4be9f0af07738f6e3d44bdbe31cd25a)
|
||||||
|
- ⏫ bump @odit/lfk-client-js@0.10.1 [`8b74d6d`](https://git.odit.services/lfk/frontend/commit/8b74d6d759c8481f012c201e2ea0d12b29ddef90)
|
||||||
|
- 🔨 dev container open ⚡ [`ceb2146`](https://git.odit.services/lfk/frontend/commit/ceb2146c1b08bbe9250e4db7846e06bd89526c21)
|
||||||
|
- ⏫ version bump: vite-plugin-windicss@0.12.2 [`8d006d8`](https://git.odit.services/lfk/frontend/commit/8d006d8c74d71c43a9031d58f5a8c7fc55ed95fc)
|
||||||
|
- 🚚 move @svitejs/vite-plugin-svelte to @sveltejs/vite-plugin-svelte [`44b53da`](https://git.odit.services/lfk/frontend/commit/44b53da34516b00671b3e5060ba831e409ac3dd5)
|
||||||
|
- ⏫ upgrade vite-plugin-windicss@0.12.1 [`ab45fc1`](https://git.odit.services/lfk/frontend/commit/ab45fc144eaf14f63d86ee53c1db4eefd88f9c7f)
|
||||||
|
- 🐞 fix main.js linking [`467404b`](https://git.odit.services/lfk/frontend/commit/467404bfc87f3c08c5e227f194d71eea7cc48921)
|
||||||
|
- 🐞 fix vite config for production system [`10a011d`](https://git.odit.services/lfk/frontend/commit/10a011d8426e475105ff5d2d5cf4adca2ef7625c)
|
||||||
|
- fix dev script [`eb3ede9`](https://git.odit.services/lfk/frontend/commit/eb3ede9593e2e527df3e3a2f81c8e179bb555f51)
|
||||||
|
- ⏫ bump vite to 2.1.3 [`0cd3e93`](https://git.odit.services/lfk/frontend/commit/0cd3e937d852eeabe43eb6298bfabe20834240b2)
|
||||||
|
- Removed useless console.log [`d23dbaa`](https://git.odit.services/lfk/frontend/commit/d23dbaaf695a60fe5ebbc9945646a16b5fc45a16)
|
||||||
|
- Removed useless console log [`48cfc15`](https://git.odit.services/lfk/frontend/commit/48cfc15cfb09096db1bd5ddbe9138b1a604d581f)
|
||||||
|
|
||||||
#### [0.11.0](https://git.odit.services/lfk/frontend/compare/0.10.0...0.11.0)
|
#### [0.11.0](https://git.odit.services/lfk/frontend/compare/0.10.0...0.11.0)
|
||||||
|
|
||||||
- Merge pull request 'Generate and print bulk blank cards feature/116-download_blanc_cards' (#117) from feature/116-download_blanc_cards into dev [`25d8b86`](https://git.odit.services/lfk/frontend/commit/25d8b86efd89c442d1bf308a8743134820acfd1f)
|
> 30 March 2021
|
||||||
|
|
||||||
- Added button (including translations [`0614c76`](https://git.odit.services/lfk/frontend/commit/0614c76e924b18b512bab59933a26fec07cf483d)
|
- Added button (including translations [`0614c76`](https://git.odit.services/lfk/frontend/commit/0614c76e924b18b512bab59933a26fec07cf483d)
|
||||||
- Added button (including translations [`97e338f`](https://git.odit.services/lfk/frontend/commit/97e338f9d4f388596d550990457254c7fa1a3492)
|
- Added button (including translations [`97e338f`](https://git.odit.services/lfk/frontend/commit/97e338f9d4f388596d550990457254c7fa1a3492)
|
||||||
- Sorted translations [`89bb9c2`](https://git.odit.services/lfk/frontend/commit/89bb9c215e356e0940678f5cabd9e38bc203040e)
|
- Sorted translations [`89bb9c2`](https://git.odit.services/lfk/frontend/commit/89bb9c215e356e0940678f5cabd9e38bc203040e)
|
||||||
- Added function for generating cards with pdf [`c8d6390`](https://git.odit.services/lfk/frontend/commit/c8d639024a5f2f72d6e30d2ce990b08bd71a5471)
|
- Added function for generating cards with pdf [`c8d6390`](https://git.odit.services/lfk/frontend/commit/c8d639024a5f2f72d6e30d2ce990b08bd71a5471)
|
||||||
|
- 🚀RELEASE v0.11.0 [`f8ccf4f`](https://git.odit.services/lfk/frontend/commit/f8ccf4f5d8f68ecee31430029889b8ab1ecec682)
|
||||||
- Fixed button styling [`08cb079`](https://git.odit.services/lfk/frontend/commit/08cb079e9798392e26515d559af2637e74deea97)
|
- Fixed button styling [`08cb079`](https://git.odit.services/lfk/frontend/commit/08cb079e9798392e26515d559af2637e74deea97)
|
||||||
- Now returning cards on creation with pdf [`1d999d4`](https://git.odit.services/lfk/frontend/commit/1d999d4910acb5efa21b3f9922cdb359babff404)
|
- Now returning cards on creation with pdf [`1d999d4`](https://git.odit.services/lfk/frontend/commit/1d999d4910acb5efa21b3f9922cdb359babff404)
|
||||||
|
- new license file version [CI SKIP] [`8f8b998`](https://git.odit.services/lfk/frontend/commit/8f8b9988ad94ee9f3729a3fe6fdb4c558828d892)
|
||||||
|
- Merge pull request 'Generate and print bulk blank cards feature/116-download_blanc_cards' (#117) from feature/116-download_blanc_cards into dev [`25d8b86`](https://git.odit.services/lfk/frontend/commit/25d8b86efd89c442d1bf308a8743134820acfd1f)
|
||||||
- Added comment [`636f018`](https://git.odit.services/lfk/frontend/commit/636f018daa33b99468a257bfc33477e1e644d081)
|
- Added comment [`636f018`](https://git.odit.services/lfk/frontend/commit/636f018daa33b99468a257bfc33477e1e644d081)
|
||||||
- Bumped lfk client js version [`2d18686`](https://git.odit.services/lfk/frontend/commit/2d18686ce782a434ca7bd34c07c36a35b9497273)
|
- Bumped lfk client js version [`2d18686`](https://git.odit.services/lfk/frontend/commit/2d18686ce782a434ca7bd34c07c36a35b9497273)
|
||||||
- Bumped lfk-client-js [`7dfaa75`](https://git.odit.services/lfk/frontend/commit/7dfaa7579a22b13194fcdd1c02b4437958261472)
|
- Bumped lfk-client-js [`7dfaa75`](https://git.odit.services/lfk/frontend/commit/7dfaa7579a22b13194fcdd1c02b4437958261472)
|
||||||
|
|||||||
+6
-12
@@ -1,18 +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
|
||||||
RUN npm i -g pnpm
|
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN pnpm i
|
RUN yarn
|
||||||
COPY package.json *.config.js workbox-config.js template-copy.js index.template.html s-config.template.js ./
|
COPY package.json *.config.js postcss.config.cjs index.html ./
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
COPY public ./public
|
COPY public ./public
|
||||||
RUN pnpm run 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/build /app
|
COPY --from=0 /app/dist /usr/share/nginx/html
|
||||||
RUN rm -rf /app/build/_dist_/components
|
|
||||||
RUN rm -rf /app/build/_dist_/locales
|
|
||||||
RUN rm -rf /app/build-manifest.json
|
|
||||||
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
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# @odit/lfk-frontend
|
||||||
|
|
||||||
|
## ✒️ Overview
|
||||||
|
This is an API client for [https://git.odit.services/lfk/backend](@lfk/backend)
|
||||||
|
- WebApp built with [Svelte](https://svelte.dev), [WindiCSS](https://windicss.org/) (to compile [TailwindCSS](https://tailwindcss.com/)) and [Vite](https://vitejs.dev).
|
||||||
|
|
||||||
|
This application is intended for use by admin users/ members only.
|
||||||
|
|
||||||
|
## 🚀 Getting Started
|
||||||
|
```
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
## Development
|
||||||
|
```
|
||||||
|
yarn dev
|
||||||
|
/
|
||||||
|
yarn dev --open
|
||||||
|
```
|
||||||
|
## Build
|
||||||
|
```
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
@@ -10,14 +10,13 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="description" content="Lauf Für Kaya! - Admin" />
|
<meta name="description" content="Lauf Für Kaya! - Admin" />
|
||||||
<title>Lauf für Kaya! - Admin</title>
|
<title>Lauf für Kaya! - Admin</title>
|
||||||
__TAILWIND_INSERT__
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.11.0-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 defer type="module" src="/_dist_/index.js"></script>
|
<script type="module" src="/src/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
+14
@@ -6,6 +6,20 @@ 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 {
|
||||||
|
add_header Cache-Control 'no-store';
|
||||||
|
}
|
||||||
|
location = / {
|
||||||
|
add_header Cache-Control 'no-store';
|
||||||
|
}
|
||||||
|
location = /env.js {
|
||||||
|
add_header Cache-Control 'no-store';
|
||||||
|
}
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-34
@@ -1,46 +1,40 @@
|
|||||||
{
|
{
|
||||||
"name": "@odit/lfk-frontend",
|
"name": "@odit/lfk-frontend",
|
||||||
"version": "0.11.0",
|
"version": "0.15.6",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"i18n-order": "node order.js",
|
"i18n-order": "node order.js",
|
||||||
"dev:all": "yarn prebuild && snowpack dev",
|
"dev": "vite",
|
||||||
"dev": "cross-env NODE_ENV_ODIT=development_fast node template-copy.js && yarn build:sw && snowpack dev",
|
"build": "vite build",
|
||||||
"build": "yarn prebuild && snowpack build",
|
|
||||||
"prebuild": "cross-env NODE_ENV_ODIT=production node template-copy.js && yarn build:sw",
|
|
||||||
"build:sw": "workbox generateSW workbox-config.js",
|
|
||||||
"release": "release-it",
|
"release": "release-it",
|
||||||
"licenses:export": "license-exporter --json -o public"
|
"licenses:export": "license-exporter --json -o public"
|
||||||
},
|
},
|
||||||
"license": "CC-BY-NC-SA-4.0",
|
"license": "CC-BY-NC-SA-4.0",
|
||||||
"dependencies": {
|
|
||||||
"@odit/lfk-client-js": "0.9.2",
|
|
||||||
"check-password-strength": "^2.0.2",
|
|
||||||
"csvtojson": "^2.0.10",
|
|
||||||
"gridjs": "3.3.0",
|
|
||||||
"localforage": "1.9.0",
|
|
||||||
"marked": "^2.0.1",
|
|
||||||
"svelte-focus-trap": "1.0.1",
|
|
||||||
"svelte-i18n": "3.3.7",
|
|
||||||
"svelte-select": "^3.17.0",
|
|
||||||
"tailwindcss": "2.0.3",
|
|
||||||
"tinro": "0.6.1",
|
|
||||||
"toastify-js": "1.9.3",
|
|
||||||
"validator": "13.5.2",
|
|
||||||
"xlsx": "^0.16.9"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@odit/license-exporter": "^0.0.11",
|
"@odit/lfk-client-js": "0.13.1",
|
||||||
"@snowpack/plugin-svelte": "3.5.2",
|
"@odit/license-exporter": "0.0.11",
|
||||||
"auto-changelog": "^2.2.1",
|
"@sveltejs/vite-plugin-svelte": "1.0.0-next.6",
|
||||||
|
"@types/html-minifier": "4.0.0",
|
||||||
|
"auto-changelog": "2.2.1",
|
||||||
"autoprefixer": "10.2.5",
|
"autoprefixer": "10.2.5",
|
||||||
"cross-env": "^7.0.3",
|
"check-password-strength": "2.0.2",
|
||||||
"postcss": "8.2.8",
|
"csvtojson": "2.0.10",
|
||||||
"postcss-load-config": "3.0.1",
|
"gridjs": "3.4.0",
|
||||||
"release-it": "^14.4.1",
|
"html-minifier": "4.0.0",
|
||||||
"snowpack": "3.0.13",
|
"localforage": "1.9.0",
|
||||||
"svelte": "3.35.0",
|
"marked": "2.0.3",
|
||||||
"svelte-preprocess": "4.6.9",
|
"postcss": "8.2.10",
|
||||||
"workbox-cli": "6.1.2"
|
"release-it": "14.6.1",
|
||||||
|
"svelte": "3.37.0",
|
||||||
|
"svelte-focus-trap": "1.2.0",
|
||||||
|
"svelte-i18n": "3.3.9",
|
||||||
|
"svelte-preprocess": "4.7.0",
|
||||||
|
"svelte-select": "3.17.0",
|
||||||
|
"tailwindcss": "2.1.1",
|
||||||
|
"tinro": "0.6.1",
|
||||||
|
"toastify-js": "1.10.0",
|
||||||
|
"validator": "13.5.2",
|
||||||
|
"vite": "2.1.5",
|
||||||
|
"xlsx": "0.16.9"
|
||||||
},
|
},
|
||||||
"release-it": {
|
"release-it": {
|
||||||
"git": {
|
"git": {
|
||||||
@@ -56,7 +50,7 @@
|
|||||||
"publish": false
|
"publish": false
|
||||||
},
|
},
|
||||||
"hooks": {
|
"hooks": {
|
||||||
"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node versionbuilder.js && git add index.template.html && node order.js && git add src/locales"
|
"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node versionbuilder.js && git add index.html && node order.js && git add src/locales"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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',
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
[{"author":"ODIT.Services","repo":{"type":"git","url":"git+https://git.odit.services/lfk/lfk-client-js"},"description":"A lib to interact with https://git.odit.services/lfk/backend. Use this version for native JS applications.","name":"@odit/lfk-client-js","license":"CC-BY-NC-SA-4.0","version":"0.9.2","licensetext":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Creative\r\nCommons Corporation (\"Creative Commons\") is not a law firm and does not provide\r\nlegal services or legal advice. Distribution of Creative Commons public licenses\r\ndoes not create a lawyer-client or other relationship. Creative Commons makes\r\nits licenses and related information available on an \"as-is\" basis. Creative\r\nCommons gives no warranties regarding its licenses, any material licensed\r\nunder their terms and conditions, or any related information. Creative Commons\r\ndisclaims all liability for damages resulting from their use to the fullest\r\nextent possible.\r\n\r\nUsing Creative Commons Public Licenses\r\n\r\nCreative Commons public licenses provide a standard set of terms and conditions\r\nthat creators and other rights holders may use to share original works of\r\nauthorship and other material subject to copyright and certain other rights\r\nspecified in the public license below. The following considerations are for\r\ninformational purposes only, are not exhaustive, and do not form part of our\r\nlicenses.\r\n\r\nConsiderations for licensors: Our public licenses are intended for use by\r\nthose authorized to give the public permission to use material in ways otherwise\r\nrestricted by copyright and certain other rights. Our licenses are irrevocable.\r\nLicensors should read and understand the terms and conditions of the license\r\nthey choose before applying it. Licensors should also secure all rights necessary\r\nbefore applying our licenses so that the public can reuse the material as\r\nexpected. Licensors should clearly mark any material not subject to the license.\r\nThis includes other CC-licensed material, or material used under an exception\r\nor limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors\r\n\r\nConsiderations for the public: By using one of our public licenses, a licensor\r\ngrants the public permission to use the licensed material under specified\r\nterms and conditions. If the licensor's permission is not necessary for any\r\nreason–for example, because of any applicable exception or limitation to copyright–then\r\nthat use is not regulated by the license. Our licenses grant only permissions\r\nunder copyright and certain other rights that a licensor has authority to\r\ngrant. Use of the licensed material may still be restricted for other reasons,\r\nincluding because others have copyright or other rights in the material. A\r\nlicensor may make special requests, such as asking that all changes be marked\r\nor described. Although not required by our licenses, you are encouraged to\r\nrespect those requests where reasonable. More considerations for the public\r\n: wiki.creativecommons.org/Considerations_for_licensees\r\n\r\nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public\r\nLicense\r\n\r\nBy exercising the Licensed Rights (defined below), You accept and agree to\r\nbe bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike\r\n4.0 International Public License (\"Public License\"). To the extent this Public\r\nLicense may be interpreted as a contract, You are granted the Licensed Rights\r\nin consideration of Your acceptance of these terms and conditions, and the\r\nLicensor grants You such rights in consideration of benefits the Licensor\r\nreceives from making the Licensed Material available under these terms and\r\nconditions.\r\n\r\nSection 1 – Definitions.\r\n\r\na. Adapted Material means material subject to Copyright and Similar Rights\r\nthat is derived from or based upon the Licensed Material and in which the\r\nLicensed Material is translated, altered, arranged, transformed, or otherwise\r\nmodified in a manner requiring permission under the Copyright and Similar\r\nRights held by the Licensor. For purposes of this Public License, where the\r\nLicensed Material is a musical work, performance, or sound recording, Adapted\r\nMaterial is always produced where the Licensed Material is synched in timed\r\nrelation with a moving image.\r\n\r\nb. Adapter's License means the license You apply to Your Copyright and Similar\r\nRights in Your contributions to Adapted Material in accordance with the terms\r\nand conditions of this Public License.\r\n\r\nc. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses,\r\napproved by Creative Commons as essentially the equivalent of this Public\r\nLicense.\r\n\r\nd. Copyright and Similar Rights means copyright and/or similar rights closely\r\nrelated to copLine truncated
|
[{"author":"ODIT.Services","repo":{"type":"git","url":"git+https://git.odit.services/lfk/lfk-client-js"},"description":"A lib to interact with https://git.odit.services/lfk/backend. Use this version for native JS applications.","name":"@odit/lfk-client-js","license":"CC-BY-NC-SA-4.0","version":"0.11.0","licensetext":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Creative\r\nCommons Corporation (\"Creative Commons\") is not a law firm and does not provide\r\nlegal services or legal advice. Distribution of Creative Commons public licenses\r\ndoes not create a lawyer-client or other relationship. Creative Commons makes\r\nits licenses and related information available on an \"as-is\" basis. Creative\r\nCommons gives no warranties regarding its licenses, any material licensed\r\nunder their terms and conditions, or any related information. Creative Commons\r\ndisclaims all liability for damages resulting from their use to the fullest\r\nextent possible.\r\n\r\nUsing Creative Commons Public Licenses\r\n\r\nCreative Commons public licenses provide a standard set of terms and conditions\r\nthat creators and other rights holders may use to share original works of\r\nauthorship and other material subject to copyright and certain other rights\r\nspecified in the public license below. The following considerations are for\r\ninformational purposes only, are not exhaustive, and do not form part of our\r\nlicenses.\r\n\r\nConsiderations for licensors: Our public licenses are intended for use by\r\nthose authorized to give the public permission to use material in ways otherwise\r\nrestricted by copyright and certain other rights. Our licenses are irrevocable.\r\nLicensors should read and understand the terms and conditions of the license\r\nthey choose before applying it. Licensors should also secure all rights necessary\r\nbefore applying our licenses so that the public can reuse the material as\r\nexpected. Licensors should clearly mark any material not subject to the license.\r\nThis includes other CC-licensed material, or material used under an exception\r\nor limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors\r\n\r\nConsiderations for the public: By using one of our public licenses, a licensor\r\ngrants the public permission to use the licensed material under specified\r\nterms and conditions. If the licensor's permission is not necessary for any\r\nreason–for example, because of any applicable exception or limitation to copyright–then\r\nthat use is not regulated by the license. Our licenses grant only permissions\r\nunder copyright and certain other rights that a licensor has authority to\r\ngrant. Use of the licensed material may still be restricted for other reasons,\r\nincluding because others have copyright or other rights in the material. A\r\nlicensor may make special requests, such as asking that all changes be marked\r\nor described. Although not required by our licenses, you are encouraged to\r\nrespect those requests where reasonable. More considerations for the public\r\n: wiki.creativecommons.org/Considerations_for_licensees\r\n\r\nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public\r\nLicense\r\n\r\nBy exercising the Licensed Rights (defined below), You accept and agree to\r\nbe bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike\r\n4.0 International Public License (\"Public License\"). To the extent this Public\r\nLicense may be interpreted as a contract, You are granted the Licensed Rights\r\nin consideration of Your acceptance of these terms and conditions, and the\r\nLicensor grants You such rights in consideration of benefits the Licensor\r\nreceives from making the Licensed Material available under these terms and\r\nconditions.\r\n\r\nSection 1 – Definitions.\r\n\r\na. Adapted Material means material subject to Copyright and Similar Rights\r\nthat is derived from or based upon the Licensed Material and in which the\r\nLicensed Material is translated, altered, arranged, transformed, or otherwise\r\nmodified in a manner requiring permission under the Copyright and Similar\r\nRights held by the Licensor. For purposes of this Public License, where the\r\nLicensed Material is a musical work, performance, or sound recording, Adapted\r\nMaterial is always produced where the Licensed Material is synched in timed\r\nrelation with a moving image.\r\n\r\nb. Adapter's License means the license You apply to Your Copyright and Similar\r\nRights in Your contributions to Adapted Material in accordance with the terms\r\nand conditions of this Public License.\r\n\r\nc. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses,\r\napproved by Creative Commons as essentially the equivalent of this Public\r\nLicense.\r\n\r\nd. Copyright and Similar Rights means copyright and/or similar rights closely\r\nrelated to coLine truncated
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
const sveltePreprocess = require('svelte-preprocess');
|
|
||||||
const preprocess = sveltePreprocess(__insert__);
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
preprocess
|
|
||||||
};
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/** @type {import("snowpack").SnowpackUserConfig } */
|
|
||||||
module.exports = {
|
|
||||||
mount: {
|
|
||||||
public: '/',
|
|
||||||
src: '/_dist_'
|
|
||||||
},
|
|
||||||
plugins: [ '@snowpack/plugin-svelte' ],
|
|
||||||
routes: [
|
|
||||||
/* Enable an SPA Fallback in development: */
|
|
||||||
{ match: 'routes', src: '.*', dest: '/index.html' }
|
|
||||||
],
|
|
||||||
packageOptions: {
|
|
||||||
/* ... */
|
|
||||||
sourceMap: false
|
|
||||||
},
|
|
||||||
devOptions: {
|
|
||||||
/* ... */
|
|
||||||
},
|
|
||||||
buildOptions: {
|
|
||||||
/* ... */
|
|
||||||
},
|
|
||||||
alias: {
|
|
||||||
/* ... */
|
|
||||||
},
|
|
||||||
optimize: { bundle: true, minify: true }
|
|
||||||
};
|
|
||||||
+231
-224
@@ -1,224 +1,231 @@
|
|||||||
<script>
|
<script>
|
||||||
import "./TailwindStyles.svelte";
|
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 { Route, router } from "tinro";
|
||||||
import { Route, router } from "tinro";
|
router.subscribe((routeInfo) => {
|
||||||
router.subscribe((routeInfo) => {
|
window.scrollTo(0, 0);
|
||||||
window.scrollTo(0, 0);
|
});
|
||||||
});
|
if (config.prefersHashRouting) {
|
||||||
if (config.prefersHashRouting) {
|
if (config.prefersHashRouting === true) {
|
||||||
if (config.prefersHashRouting === true) {
|
router.useHashNavigation();
|
||||||
router.useHashNavigation();
|
}
|
||||||
}
|
}
|
||||||
}
|
import localForage from "localforage";
|
||||||
import localForage from "localforage";
|
import { addMessages, init, getLocaleFromNavigator } from "svelte-i18n";
|
||||||
import { addMessages, init, getLocaleFromNavigator } from "svelte-i18n";
|
import en from "./locales/en.json";
|
||||||
import en from "./locales/en.json";
|
import de from "./locales/de.json";
|
||||||
import de from "./locales/de.json";
|
addMessages("en", en);
|
||||||
addMessages("en", en);
|
addMessages("de", de);
|
||||||
addMessages("de", de);
|
init({
|
||||||
init({
|
fallbackLocale: "en",
|
||||||
fallbackLocale: "en",
|
initialLocale: getLocaleFromNavigator(),
|
||||||
initialLocale: getLocaleFromNavigator(),
|
});
|
||||||
});
|
localForage.config({
|
||||||
localForage.config({
|
name: "lfk_admin",
|
||||||
name: "lfk_admin",
|
version: 1.0,
|
||||||
version: 1.0,
|
storeName: "lfk_admin",
|
||||||
storeName: "lfk_admin",
|
description: "LfK! admin dashbaord",
|
||||||
description: "LfK! admin dashbaord",
|
});
|
||||||
});
|
window.onunhandledrejection = (event) => {
|
||||||
window.onunhandledrejection = (event) => {
|
if (event.reason.toString() == "Error: Unauthorized") {
|
||||||
if (event.reason.toString() == "Error: Unauthorized") {
|
console.log("Found 1");
|
||||||
console.log("Found 1");
|
localForage.clear();
|
||||||
localForage.clear();
|
location.replace("/");
|
||||||
location.replace("/");
|
}
|
||||||
}
|
};
|
||||||
};
|
//
|
||||||
//
|
import Login from "./components/auth/Login.svelte";
|
||||||
import Login from "./components/auth/Login.svelte";
|
import Dashboard from "./components/dashboard/Dashboard.svelte";
|
||||||
import Dashboard from "./components/dashboard/Dashboard.svelte";
|
import store from "./store.js";
|
||||||
import store from "./store.js";
|
import ForgotPassword from "./components/auth/ForgotPassword.svelte";
|
||||||
import ForgotPassword from "./components/auth/ForgotPassword.svelte";
|
import MainDashContent from "./components/dashboard/MainDashContent.svelte";
|
||||||
import MainDashContent from "./components/dashboard/MainDashContent.svelte";
|
import Users from "./components/users/Users.svelte";
|
||||||
import Users from "./components/users/Users.svelte";
|
import About from "./components/general/About.svelte";
|
||||||
import About from "./components/general/About.svelte";
|
import Settings from "./components/settings/Settings.svelte";
|
||||||
import Settings from "./components/settings/Settings.svelte";
|
import Transition from "./components/base/Transition.svelte";
|
||||||
import Transition from "./components/base/Transition.svelte";
|
import Orgs from "./components/orgs/Orgs.svelte";
|
||||||
import Orgs from "./components/orgs/Orgs.svelte";
|
import Runners from "./components/runners/Runners.svelte";
|
||||||
import Runners from "./components/runners/Runners.svelte";
|
import Footer from "./components/general/Footer.svelte";
|
||||||
import Footer from "./components/general/Footer.svelte";
|
import TracksOverview from "./components/tracks/TracksOverview.svelte";
|
||||||
import TracksOverview from "./components/tracks/TracksOverview.svelte";
|
import OrgDetail from "./components/orgs/OrgDetail.svelte";
|
||||||
import OrgDetail from "./components/orgs/OrgDetail.svelte";
|
import Teams from "./components/teams/Teams.svelte";
|
||||||
import Teams from "./components/teams/Teams.svelte";
|
import { OpenAPI } from "@odit/lfk-client-js";
|
||||||
import { OpenAPI } from "@odit/lfk-client-js";
|
import UserDetail from "./components/users/UserDetail.svelte";
|
||||||
import UserDetail from "./components/users/UserDetail.svelte";
|
OpenAPI.BASE = config.baseurl;
|
||||||
OpenAPI.BASE = config.baseurl;
|
import TeamDetail from "./components/teams/TeamDetail.svelte";
|
||||||
import { register as registerSW } from "./swmodule";
|
import UserPermissions from "./components/users/UserPermissions.svelte";
|
||||||
import TeamDetail from "./components/teams/TeamDetail.svelte";
|
import GroupPermissions from "./components/groups/GroupPermissions.svelte";
|
||||||
import UserPermissions from "./components/users/UserPermissions.svelte";
|
import RunnerDetail from "./components/runners/RunnerDetail.svelte";
|
||||||
import GroupPermissions from "./components/groups/GroupPermissions.svelte";
|
import Imprint from "./components/general/Imprint.svelte";
|
||||||
import RunnerDetail from "./components/runners/RunnerDetail.svelte";
|
import Privacy from "./components/general/Privacy.svelte";
|
||||||
import Imprint from "./components/general/Imprint.svelte";
|
import ResetPassword from "./components/auth/ResetPassword.svelte";
|
||||||
import Privacy from "./components/general/Privacy.svelte";
|
import Contacts from "./components/contacts/Contacts.svelte";
|
||||||
import ResetPassword from "./components/auth/ResetPassword.svelte";
|
import ContactDetail from "./components/contacts/ContactDetail.svelte";
|
||||||
import Contacts from "./components/contacts/Contacts.svelte";
|
import Donors from "./components/donors/Donors.svelte";
|
||||||
import ContactDetail from "./components/contacts/ContactDetail.svelte";
|
import Groups from "./components/groups/Groups.svelte";
|
||||||
import Donors from "./components/donors/Donors.svelte";
|
import DonorDetail from "./components/donors/DonorDetail.svelte";
|
||||||
import Groups from "./components/groups/Groups.svelte";
|
import Donations from "./components/donations/Donations.svelte";
|
||||||
import DonorDetail from "./components/donors/DonorDetail.svelte";
|
import DonationDetail from "./components/donations/DonationDetail.svelte";
|
||||||
import Donations from "./components/donations/Donations.svelte";
|
import GroupDetail from "./components/groups/GroupDetail.svelte";
|
||||||
import DonationDetail from "./components/donations/DonationDetail.svelte";
|
import ScanStations from "./components/scanstations/ScanStations.svelte";
|
||||||
import GroupDetail from "./components/groups/GroupDetail.svelte";
|
import ScanStationDetail from "./components/scanstations/ScanStationDetail.svelte";
|
||||||
import ScanStations from "./components/scanstations/ScanStations.svelte";
|
import Scans from "./components/scans/Scans.svelte";
|
||||||
import ScanStationDetail from "./components/scanstations/ScanStationDetail.svelte";
|
import ScanDetail from "./components/scans/ScanDetail.svelte";
|
||||||
import Scans from "./components/scans/Scans.svelte";
|
import Cards from "./components/cards/Cards.svelte";
|
||||||
import ScanDetail from "./components/scans/ScanDetail.svelte";
|
import StatsClients from "./components/statsclients/StatsClients.svelte";
|
||||||
import Cards from "./components/cards/Cards.svelte";
|
import StatsClientDetail from "./components/statsclients/StatsClientDetail.svelte";
|
||||||
store.init();
|
store.init();
|
||||||
registerSW();
|
</script>
|
||||||
</script>
|
|
||||||
|
<Route>
|
||||||
<Route>
|
{#if $router.path === '/forgot_password'}
|
||||||
{#if $router.path === '/forgot_password'}
|
<Route path="/forgot_password">
|
||||||
<Route path="/forgot_password">
|
<ForgotPassword />
|
||||||
<ForgotPassword />
|
</Route>
|
||||||
</Route>
|
{:else if $router.path.includes('/reset')}
|
||||||
{:else if $router.path.includes('/reset')}
|
<Route path="/reset/:resetkey" let:params>
|
||||||
<Route path="/reset/:resetkey" let:params>
|
<ResetPassword {params} />
|
||||||
<ResetPassword {params} />
|
</Route>
|
||||||
</Route>
|
{:else if $router.path === '/about'}
|
||||||
{:else if $router.path === '/about'}
|
<Route path="/about">
|
||||||
<Route path="/about">
|
<About />
|
||||||
<About />
|
</Route>
|
||||||
</Route>
|
{:else if $router.path === '/imprint'}
|
||||||
{:else if $router.path === '/imprint'}
|
<Route path="/imprint">
|
||||||
<Route path="/imprint">
|
<Imprint />
|
||||||
<Imprint />
|
</Route>
|
||||||
</Route>
|
{:else if $router.path === '/privacy'}
|
||||||
{:else if $router.path === '/privacy'}
|
<Route path="/privacy">
|
||||||
<Route path="/privacy">
|
<Privacy />
|
||||||
<Privacy />
|
</Route>
|
||||||
</Route>
|
{:else if $store.isLoggedIn}
|
||||||
{:else if $store.isLoggedIn}
|
<Dashboard>
|
||||||
<Dashboard>
|
<Transition>
|
||||||
<Transition>
|
<Route path="/">
|
||||||
<Route path="/">
|
<MainDashContent />
|
||||||
<MainDashContent />
|
</Route>
|
||||||
</Route>
|
<Route path="/users/*">
|
||||||
<Route path="/users/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Users />
|
||||||
<Users />
|
</Route>
|
||||||
</Route>
|
<Route path="/:userid/*" let:params>
|
||||||
<Route path="/:userid/*" let:params>
|
<Route path="/">
|
||||||
<Route path="/">
|
<UserDetail {params} />
|
||||||
<UserDetail {params} />
|
</Route>
|
||||||
</Route>
|
<Route path="/permissions/">
|
||||||
<Route path="/permissions/">
|
<UserPermissions {params} />
|
||||||
<UserPermissions {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/groups/*">
|
||||||
<Route path="/groups/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Groups />
|
||||||
<Groups />
|
</Route>
|
||||||
</Route>
|
<Route path="/:groupid/*" let:params>
|
||||||
<Route path="/:groupid/*" let:params>
|
<Route path="/">
|
||||||
<Route path="/">
|
<GroupDetail {params} />
|
||||||
<GroupDetail {params} />
|
</Route>
|
||||||
</Route>
|
<Route path="/permissions/">
|
||||||
<Route path="/permissions/">
|
<GroupPermissions {params} />
|
||||||
<GroupPermissions {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/tracks/*">
|
||||||
<Route path="/tracks/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<TracksOverview />
|
||||||
<TracksOverview />
|
</Route>
|
||||||
</Route>
|
<Route path="/:trackid" let:params />
|
||||||
<Route path="/:trackid" let:params />
|
</Route>
|
||||||
</Route>
|
<Route path="/runners/*">
|
||||||
<Route path="/runners/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Runners />
|
||||||
<Runners />
|
</Route>
|
||||||
</Route>
|
<Route path="/:runnerid" let:params>
|
||||||
<Route path="/:runnerid" let:params>
|
<RunnerDetail {params} />
|
||||||
<RunnerDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/teams/*">
|
||||||
<Route path="/teams/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Teams />
|
||||||
<Teams />
|
</Route>
|
||||||
</Route>
|
<Route path="/:teamid" let:params>
|
||||||
<Route path="/:teamid" let:params>
|
<TeamDetail {params} />
|
||||||
<TeamDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/contacts/*">
|
||||||
<Route path="/contacts/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Contacts />
|
||||||
<Contacts />
|
</Route>
|
||||||
</Route>
|
<Route path="/:contact" let:params>
|
||||||
<Route path="/:contact" let:params>
|
<ContactDetail {params} />
|
||||||
<ContactDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/orgs/*">
|
||||||
<Route path="/orgs/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Orgs />
|
||||||
<Orgs />
|
</Route>
|
||||||
</Route>
|
<Route path="/:orgid" let:params>
|
||||||
<Route path="/:orgid" let:params>
|
<OrgDetail {params} />
|
||||||
<OrgDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/donors/*">
|
||||||
<Route path="/donors/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Donors />
|
||||||
<Donors />
|
</Route>
|
||||||
</Route>
|
<Route path="/:donorid" let:params>
|
||||||
<Route path="/:donorid" let:params>
|
<DonorDetail {params} />
|
||||||
<DonorDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/donations/*">
|
||||||
<Route path="/donations/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Donations />
|
||||||
<Donations />
|
</Route>
|
||||||
</Route>
|
<Route path="/:donationid" let:params>
|
||||||
<Route path="/:donationid" let:params>
|
<DonationDetail {params} />
|
||||||
<DonationDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/cards/*">
|
||||||
<Route path="/cards/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Cards />
|
||||||
<Cards />
|
</Route>
|
||||||
</Route>
|
<!-- <Route path="/:scanid" let:params>
|
||||||
<!-- <Route path="/:scanid" let:params>
|
<ScanDetail {params} />
|
||||||
<ScanDetail {params} />
|
</Route> -->
|
||||||
</Route> -->
|
</Route>
|
||||||
</Route>
|
<Route path="/scans/*">
|
||||||
<Route path="/scans/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<Scans />
|
||||||
<Scans />
|
</Route>
|
||||||
</Route>
|
<Route path="/:scanid" let:params>
|
||||||
<Route path="/:scanid" let:params>
|
<ScanDetail {params} />
|
||||||
<ScanDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/scanstations/*">
|
||||||
<Route path="/scanstations/*">
|
<Route path="/">
|
||||||
<Route path="/">
|
<ScanStations />
|
||||||
<ScanStations />
|
</Route>
|
||||||
</Route>
|
<Route path="/:stationid" let:params>
|
||||||
<Route path="/:stationid" let:params>
|
<ScanStationDetail {params} />
|
||||||
<ScanStationDetail {params} />
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
<Route path="/statsclients/*">
|
||||||
<Route path="/about">
|
<Route path="/">
|
||||||
<About />
|
<StatsClients />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="/settings">
|
<Route path="/:clientid" let:params>
|
||||||
<Settings />
|
<StatsClientDetail {params} />
|
||||||
</Route>
|
</Route>
|
||||||
</Transition>
|
</Route>
|
||||||
<Footer />
|
<Route path="/about">
|
||||||
</Dashboard>
|
<About />
|
||||||
{:else}
|
</Route>
|
||||||
<Login />
|
<Route path="/settings">
|
||||||
{/if}
|
<Settings />
|
||||||
</Route>
|
</Route>
|
||||||
|
</Transition>
|
||||||
|
<Footer />
|
||||||
|
</Dashboard>
|
||||||
|
{:else}
|
||||||
|
<Login />
|
||||||
|
{/if}
|
||||||
|
</Route>
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<style global>
|
|
||||||
/*! @import */
|
|
||||||
@tailwind base;
|
|
||||||
@tailwind components;
|
|
||||||
@tailwind utilities;
|
|
||||||
</style>
|
|
||||||
@@ -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%)",
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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: {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import { getLocaleFromNavigator, json, _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { RunnerCardService } from "@odit/lfk-client-js";
|
import { RunnerCardService } from "@odit/lfk-client-js";
|
||||||
import store from "../../store";
|
import store from "../../store";
|
||||||
import Toastify from "toastify-js";
|
import Toastify from "toastify-js";
|
||||||
@@ -11,11 +11,21 @@
|
|||||||
export let editable = {};
|
export let editable = {};
|
||||||
export let original_data = {};
|
export let original_data = {};
|
||||||
export let current_cards = [];
|
export let current_cards = [];
|
||||||
|
$: filtered_cards = current_cards.filter(function (c) {
|
||||||
|
if (
|
||||||
|
c.code.toLowerCase().includes(searchvalue_lowercase) ||
|
||||||
|
c.runner?.firstname.toLowerCase().includes(searchvalue_lowercase) ||
|
||||||
|
c.runner?.middlename.toLowerCase().includes(searchvalue_lowercase) ||
|
||||||
|
c.runner?.lastname.toLowerCase().includes(searchvalue_lowercase) ||
|
||||||
|
should_display_based_on_id(c.id)
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
$: searchvalue = "";
|
$: searchvalue = "";
|
||||||
|
$: searchvalue_lowercase = searchvalue.toLowerCase();
|
||||||
$: active_deletes = [];
|
$: active_deletes = [];
|
||||||
$: cards_show = current_cards.some(
|
$: cards_show = current_cards.some((r) => r.is_selected === true);
|
||||||
(r) => r.is_selected === true
|
|
||||||
);
|
|
||||||
$: generate_cards = current_cards.filter((r) => r.is_selected === true);
|
$: generate_cards = current_cards.filter((r) => r.is_selected === true);
|
||||||
const cards_promise = RunnerCardService.runnerCardControllerGetAll().then(
|
const cards_promise = RunnerCardService.runnerCardControllerGetAll().then(
|
||||||
(val) => {
|
(val) => {
|
||||||
@@ -46,8 +56,38 @@
|
|||||||
original_data = Object.assign(original_data, card);
|
original_data = Object.assign(original_data, card);
|
||||||
edit_modal_open = true;
|
edit_modal_open = true;
|
||||||
}
|
}
|
||||||
|
// -----------------
|
||||||
|
let scrollTop = 0;
|
||||||
|
$: rendered = filtered_cards;
|
||||||
|
let innerHeight = 0;
|
||||||
|
let ele;
|
||||||
|
$: updateSlice(scrollTop);
|
||||||
|
$: innerHeight = `${filtered_cards.length * 25}px`;
|
||||||
|
$: if (ele) updateSlice();
|
||||||
|
function updateSlice() {
|
||||||
|
const height = ele ? parseInt(ele.clientHeight) : 100;
|
||||||
|
const init = scrollTop / 25;
|
||||||
|
const end = Math.ceil((scrollTop + height) / 25);
|
||||||
|
rendered = filtered_cards.slice(init, end + 15);
|
||||||
|
}
|
||||||
|
function updateScroll($event) {
|
||||||
|
scrollTop = $event.target.scrollTop;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
table tbody {
|
||||||
|
display: block;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
table thead, table tbody tr {
|
||||||
|
display: table;
|
||||||
|
width: 100%;
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:UPDATE')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:UPDATE')}
|
||||||
<CardDetailModal
|
<CardDetailModal
|
||||||
bind:current_cards
|
bind:current_cards
|
||||||
@@ -121,107 +161,111 @@
|
|||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-gray-200">
|
<tbody class="divide-y divide-gray-200 virtual-wrapper"
|
||||||
{#each current_cards as card}
|
on:scroll={updateScroll}
|
||||||
{#if card.code
|
style="height: 70vh; width:100%"
|
||||||
.toLowerCase()
|
bind:this={ele}
|
||||||
.includes(
|
>
|
||||||
searchvalue.toLowerCase()
|
{#each filtered_cards as card, index}
|
||||||
) || card.runner?.firstname
|
{#if card.code
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
.includes(
|
.includes(
|
||||||
searchvalue.toLowerCase()
|
searchvalue.toLowerCase()
|
||||||
) || card.runner?.middlename
|
) || card.runner?.firstname
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
.includes(
|
.includes(
|
||||||
searchvalue.toLowerCase()
|
searchvalue.toLowerCase()
|
||||||
) || card.runner?.lastname
|
) || card.runner?.middlename
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
.includes(
|
.includes(
|
||||||
searchvalue.toLowerCase()
|
searchvalue.toLowerCase()
|
||||||
) || should_display_based_on_id(card.id)}
|
) || card.runner?.lastname
|
||||||
<tr data-rowid="card_{card.id}">
|
.toLowerCase()
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
.includes(
|
||||||
<input
|
searchvalue.toLowerCase()
|
||||||
bind:checked={card.is_selected}
|
) || should_display_based_on_id(card.id)}
|
||||||
type="checkbox"
|
<tr data-rowid="card_{card.id}">
|
||||||
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" />
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
</td>
|
<input
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
bind:checked={card.is_selected}
|
||||||
<div class="flex items-center">{card.code}</div>
|
type="checkbox"
|
||||||
</td>
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" />
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
</td>
|
||||||
<div class="flex items-center">
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
{#if card.runner}
|
<div class="flex items-center">{card.code}</div>
|
||||||
<a
|
</td>
|
||||||
href="../runners/{card.runner.id}"
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{card.runner.firstname}
|
<div class="flex items-center">
|
||||||
{card.runner.middlename || ''}
|
{#if card.runner}
|
||||||
{card.runner.lastname}</a>
|
<a
|
||||||
{:else}{$_('non-blanko')}{/if}
|
href="../runners/{card.runner.id}"
|
||||||
</div>
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{card.runner.firstname}
|
||||||
</td>
|
{card.runner.middlename || ''}
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
{card.runner.lastname}</a>
|
||||||
<div class="flex items-center">
|
{:else}{$_('non-blanko')}{/if}
|
||||||
{#if card.enabled}
|
</div>
|
||||||
<span
|
</td>
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">{$_('enabled')}</span>
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
{:else}
|
<div class="flex items-center">
|
||||||
<span
|
{#if card.enabled}
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">{$_('disabled')}</span>
|
<span
|
||||||
{/if}
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">{$_('enabled')}</span>
|
||||||
</div>
|
{:else}
|
||||||
</td>
|
<span
|
||||||
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">{$_('disabled')}</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
|
||||||
{#if active_deletes[card.id] === true}
|
{#if active_deletes[card.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">
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
active_deletes[card.id] = false;
|
active_deletes[card.id] = false;
|
||||||
}}
|
}}
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
|
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
RunnerCardService.runnerCardControllerRemove(card.id, false).then(
|
RunnerCardService.runnerCardControllerRemove(card.id, false).then(
|
||||||
(resp) => {
|
(resp) => {
|
||||||
current_cards = current_cards.filter(
|
current_cards = current_cards.filter(
|
||||||
(obj) => obj.id !== card.id
|
(obj) => obj.id !== card.id
|
||||||
);
|
);
|
||||||
Toastify({
|
Toastify({
|
||||||
text: $_('card-deleted'),
|
text: $_('card-deleted'),
|
||||||
duration: 500,
|
duration: 500,
|
||||||
backgroundColor:
|
backgroundColor:
|
||||||
'linear-gradient(to right, #00b09b, #96c93d)',
|
'linear-gradient(to right, #00b09b, #96c93d)',
|
||||||
}).showToast();
|
}).showToast();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
|
||||||
</td>
|
</td>
|
||||||
{: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
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
open_edit_modal(card);
|
open_edit_modal(card);
|
||||||
}}
|
}}
|
||||||
class="text-indigo-600 hover:text-indigo-900">{$_('details')}</button>
|
class="text-indigo-600 hover:text-indigo-900">{$_('details')}</button>
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:DELETE')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:DELETE')}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
active_deletes[card.id] = true;
|
active_deletes[card.id] = true;
|
||||||
}}
|
}}
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
|
||||||
{/if}
|
{/if}
|
||||||
</td>
|
</td>
|
||||||
{/if}
|
{/if}
|
||||||
</tr>
|
</tr>
|
||||||
{/if}
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -12,11 +12,21 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.collapsed_navigation {
|
||||||
|
transform: translateX(-100%);
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.collapsed_navigation {
|
||||||
|
transform: translateX(0px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<section class="min-h-screen bg-gray-50">
|
<section class="min-h-screen bg-gray-50">
|
||||||
<nav
|
<div
|
||||||
class:-translate-x-full={!navOpen}
|
class:collapsed_navigation={!navOpen}
|
||||||
class:translate-x-0={navOpen}
|
class="select-none fixed top-0 left-0 z-20 h-full pb-10 overflow-x-hidden overflow-y-auto transition origin-left transform border-r w-60 bg-gray-50">
|
||||||
class="select-none fixed top-0 left-0 z-20 h-full pb-10 overflow-x-hidden overflow-y-auto transition origin-left transform border-r w-60 md:translate-x-0 bg-gray-50">
|
|
||||||
<a href="/" class="flex items-center px-4 py-5">
|
<a href="/" class="flex items-center px-4 py-5">
|
||||||
<img src="/lfk-logo.png" alt="Logo" class="h-10" />
|
<img src="/lfk-logo.png" alt="Logo" class="h-10" />
|
||||||
<h3 class="text-lg">Lauf für Kaya! Admin</h3>
|
<h3 class="text-lg">Lauf für Kaya! Admin</h3>
|
||||||
@@ -246,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"
|
||||||
@@ -297,14 +327,15 @@
|
|||||||
<span>{$_('logout')}</span>
|
<span>{$_('logout')}</span>
|
||||||
</span>
|
</span>
|
||||||
</nav>
|
</nav>
|
||||||
</nav>
|
</div>
|
||||||
<div class="ml-0 transition md:ml-60">
|
<div class="ml-0 transition md:ml-60">
|
||||||
<header
|
<header
|
||||||
on:click={() => {
|
|
||||||
navOpen = true;
|
|
||||||
}}
|
|
||||||
class="flex items-center justify-between w-full px-4 bg-white border-b h-14 md:hidden">
|
class="flex items-center justify-between w-full px-4 bg-white border-b h-14 md:hidden">
|
||||||
<button class="block btn btn-light md:hidden">
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
navOpen = true;
|
||||||
|
}}
|
||||||
|
class="block btn btn-light md:hidden">
|
||||||
<span class="sr-only">Menu</span><svg
|
<span class="sr-only">Menu</span><svg
|
||||||
class="w-4 h-4"
|
class="w-4 h-4"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@@ -318,10 +349,13 @@
|
|||||||
<NoComponentLoaded />
|
<NoComponentLoaded />
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
<div
|
{#if navOpen === true}
|
||||||
on:click={() => {
|
<div
|
||||||
navOpen = false;
|
on:click={() => {
|
||||||
}}
|
navOpen = false;
|
||||||
class:hidden={!navOpen}
|
console.log({ navOpen });
|
||||||
class="fixed inset-0 z-10 w-screen h-screen bg-black bg-opacity-25 md:hidden" />
|
}}
|
||||||
|
class:hidden={!navOpen}
|
||||||
|
class="fixed inset-0 z-10 w-screen h-screen bg-black bg-opacity-25 md:hidden" />
|
||||||
|
{/if}
|
||||||
</section>
|
</section>
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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">​</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}
|
||||||
@@ -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} />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
-
|
-
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
import Select from "svelte-select";
|
import Select from "svelte-select";
|
||||||
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
||||||
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
||||||
|
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
||||||
import { tick } from "svelte";
|
import { tick } from "svelte";
|
||||||
$: delete_triggered = false;
|
$: delete_triggered = false;
|
||||||
$: address_valid_or_none =
|
$: address_valid_or_none =
|
||||||
@@ -34,6 +35,7 @@
|
|||||||
$: iscityvalid = editable.address?.city?.trim().length !== 0;
|
$: iscityvalid = editable.address?.city?.trim().length !== 0;
|
||||||
$: sponsoring_contracts_show = true;
|
$: sponsoring_contracts_show = true;
|
||||||
$: cards_show = true;
|
$: cards_show = true;
|
||||||
|
$: certificates_show = true;
|
||||||
$: generate_orgs = [original_object];
|
$: generate_orgs = [original_object];
|
||||||
$: registrationLink = `${config.baseurl}/selfservice/register/${editable.registrationKey}`;
|
$: registrationLink = `${config.baseurl}/selfservice/register/${editable.registrationKey}`;
|
||||||
const getContactLabel = (option) =>
|
const getContactLabel = (option) =>
|
||||||
@@ -176,6 +178,7 @@
|
|||||||
bind:sponsoring_contracts_show
|
bind:sponsoring_contracts_show
|
||||||
bind:generate_orgs />
|
bind:generate_orgs />
|
||||||
<GenerateRunnerCards bind:cards_show bind:generate_orgs />
|
<GenerateRunnerCards bind:cards_show bind:generate_orgs />
|
||||||
|
<GenerateRunnerCertificates bind:certificates_show bind:generate_orgs />
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
@@ -186,7 +189,7 @@
|
|||||||
{$_('import-runners')}
|
{$_('import-runners')}
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('USER:DELETE')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:DELETE')}
|
||||||
{#if delete_triggered}
|
{#if delete_triggered}
|
||||||
<button
|
<button
|
||||||
on:click={deleteOrganization}
|
on:click={deleteOrganization}
|
||||||
|
|||||||
@@ -9,11 +9,15 @@
|
|||||||
import Toastify from "toastify-js";
|
import Toastify from "toastify-js";
|
||||||
import ConfirmOrgDeletion from "./ConfirmOrgDeletion.svelte";
|
import ConfirmOrgDeletion from "./ConfirmOrgDeletion.svelte";
|
||||||
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
||||||
|
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
||||||
$: searchvalue = "";
|
$: searchvalue = "";
|
||||||
$: active_deletes = [];
|
$: active_deletes = [];
|
||||||
$: sponsoring_contracts_show = current_organizations.some((r) => r.is_selected === true);
|
$: sponsoring_contracts_show = current_organizations.some((r) => r.is_selected === true);
|
||||||
$: cards_show = current_organizations.some((r) => r.is_selected === true);
|
$: cards_show = current_organizations.some((r) => r.is_selected === true);
|
||||||
$: generate_orgs = current_organizations.filter((r) => r.is_selected === true);
|
$: generate_orgs = current_organizations.filter((r) => r.is_selected === true);
|
||||||
|
$: certificates_show = current_organizations.some(
|
||||||
|
(r) => r.is_selected === true
|
||||||
|
);
|
||||||
export let current_organizations = [];
|
export let current_organizations = [];
|
||||||
|
|
||||||
const promise = RunnerOrganizationService.runnerOrganizationControllerGetAll().then(
|
const promise = RunnerOrganizationService.runnerOrganizationControllerGetAll().then(
|
||||||
@@ -55,6 +59,9 @@
|
|||||||
<GenerateRunnerCards
|
<GenerateRunnerCards
|
||||||
bind:cards_show
|
bind:cards_show
|
||||||
bind:generate_orgs />
|
bind:generate_orgs />
|
||||||
|
<GenerateRunnerCertificates
|
||||||
|
bind:certificates_show
|
||||||
|
bind:generate_orgs />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
||||||
|
|||||||
@@ -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: {
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
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.pdf";
|
a.download = `${$_('runnercards')}-${locale}.pdf`;
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
a.remove();
|
a.remove();
|
||||||
@@ -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: {
|
||||||
@@ -127,7 +127,12 @@
|
|||||||
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.pdf";
|
if(generate_runners.length == 1){
|
||||||
|
a.download = `${$_('runnercards')}_${generate_runners[0].firstname}_${generate_runners[0].lastname}-${locale}.pdf`;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
a.download = `Runnercards-${locale}.pdf`;
|
||||||
|
}
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
a.remove();
|
a.remove();
|
||||||
@@ -149,7 +154,7 @@
|
|||||||
}).showToast();
|
}).showToast();
|
||||||
let count = 0;
|
let count = 0;
|
||||||
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
||||||
for await (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
|
||||||
);
|
);
|
||||||
@@ -164,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: {
|
||||||
@@ -191,7 +196,7 @@
|
|||||||
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_" + t.name + ".pdf";
|
a.download = `${$_('runnercards')}_${t.name}-${locale}.pdf`;
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
a.remove();
|
a.remove();
|
||||||
@@ -211,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();
|
||||||
for await (const o of generate_orgs) {
|
let count = 0;
|
||||||
const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
|
let count_orgs =0;
|
||||||
o.id
|
for (const o of generate_orgs) {
|
||||||
);
|
count_orgs++;
|
||||||
|
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);
|
||||||
@@ -230,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: {
|
||||||
@@ -240,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 = "Sponsorings_" + o.name + ".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>
|
||||||
|
|||||||
@@ -0,0 +1,332 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import {
|
||||||
|
DonationService,
|
||||||
|
RunnerTeamService,
|
||||||
|
RunnerOrganizationService
|
||||||
|
} from "@odit/lfk-client-js";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
export let certificates_show = false;
|
||||||
|
export let generate_runners = [];
|
||||||
|
export let generate_orgs = [];
|
||||||
|
export let generate_teams = [];
|
||||||
|
$: certificates_dropdown_open = false;
|
||||||
|
document.addEventListener("click", function (e) {
|
||||||
|
if (
|
||||||
|
e.target.parentNode?.parentNode?.id != "certificates:dropdown" &&
|
||||||
|
e.target.parentNode?.parentNode?.id != "certificates:dropdown:menu"
|
||||||
|
) {
|
||||||
|
certificates_dropdown_open = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function generateCertificates(locale) {
|
||||||
|
certificates_dropdown_open = false;
|
||||||
|
|
||||||
|
if (generate_orgs.length > 0) {
|
||||||
|
generateOrgCertificates(locale);
|
||||||
|
} else if (generate_teams.length > 0) {
|
||||||
|
generateTeamCertificates(locale);
|
||||||
|
} else {
|
||||||
|
generateRunnerCertificates(locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function generateRunnerCertificates(locale) {
|
||||||
|
const toast = Toastify({
|
||||||
|
text: $_("generating-pdf"),
|
||||||
|
duration: -1,
|
||||||
|
}).showToast();
|
||||||
|
const current_donations = (await DonationService.donationControllerGetAll()) || [];
|
||||||
|
let certificateRunners = [];
|
||||||
|
for (let runner of generate_runners) {
|
||||||
|
runner.distanceDonations = current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
||||||
|
console.log(runner.distanceDonations)
|
||||||
|
certificateRunners.push(runner);
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
if(generate_runners.length == 1){
|
||||||
|
a.download = `${$_('certificates')}_${generate_runners[0].firstname}_${generate_runners[0].lastname}-${locale}.pdf`;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
a.download = `${$_('certificates')}-${locale}.pdf`;
|
||||||
|
}
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
a.remove();
|
||||||
|
toast.hideToast();
|
||||||
|
Toastify({
|
||||||
|
text: $_("pdf-successfully-generated"),
|
||||||
|
duration: 3500,
|
||||||
|
backgroundColor:
|
||||||
|
"linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
})
|
||||||
|
.catch((err) => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function generateTeamCertificates(locale) {
|
||||||
|
const toast = Toastify({
|
||||||
|
text: $_("generating-pdfs"),
|
||||||
|
duration: -1,
|
||||||
|
}).showToast();
|
||||||
|
let count = 0;
|
||||||
|
const current_donations = (await DonationService.donationControllerGetAll()) || [];
|
||||||
|
for (const t of generate_teams) {
|
||||||
|
const 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);
|
||||||
|
}
|
||||||
|
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) => {
|
||||||
|
count++;
|
||||||
|
const url = window.URL.createObjectURL(blob);
|
||||||
|
let a = document.createElement("a");
|
||||||
|
a.href = url;
|
||||||
|
a.download = `${$_('certificates')}_${t.name}-${locale}.pdf`;
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
a.remove();
|
||||||
|
if (count === generate_teams.length) {
|
||||||
|
toast.hideToast();
|
||||||
|
Toastify({
|
||||||
|
text: $_("pdfs-successfully-generated"),
|
||||||
|
duration: 3500,
|
||||||
|
backgroundColor:
|
||||||
|
"linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function generateOrgCertificates(locale) {
|
||||||
|
const toast = Toastify({
|
||||||
|
text: $_("generating-pdfs"),
|
||||||
|
duration: -1,
|
||||||
|
}).showToast();
|
||||||
|
const current_donations = (await DonationService.donationControllerGetAll()) || [];
|
||||||
|
let count = 0;
|
||||||
|
let count_orgs =0;
|
||||||
|
for (const o of generate_orgs) {
|
||||||
|
count_orgs++;
|
||||||
|
let count = 0;
|
||||||
|
let runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(o.id, true)
|
||||||
|
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}_direct-${locale}.pdf`;
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
a.remove();
|
||||||
|
if (count === o.teams.length && count_orgs === generate_orgs.length) {
|
||||||
|
toast.hideToast();
|
||||||
|
console.log("here")
|
||||||
|
Toastify({
|
||||||
|
text: $_("pdfs-successfully-generated"),
|
||||||
|
duration: 3500,
|
||||||
|
backgroundColor:
|
||||||
|
"linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.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>
|
||||||
|
|
||||||
|
{#if certificates_show}
|
||||||
|
<div id="certificates:dropdown" class="relative inline-block">
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
certificates_dropdown_open = !certificates_dropdown_open;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-gray-600 text-base font-medium text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 sm:ml-3 sm:w-auto sm:text-sm inline-flex"
|
||||||
|
id="options-menu"
|
||||||
|
aria-haspopup="true"
|
||||||
|
aria-expanded="true">
|
||||||
|
{$_('generate-runner-certificates')}
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
class="-mr-1 ml-2 h-5 w-5"><path
|
||||||
|
fill="none"
|
||||||
|
d="M0 0h24v24H0z" />
|
||||||
|
<path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M3 19h18v2H3v-2zm10-5.83l6.07-6.07 1.42 1.41L12 17 3.52 8.52l1.4-1.42L11 13.17V2h2v11.17z" /></svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{#if certificates_dropdown_open}
|
||||||
|
<div
|
||||||
|
class="origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5"
|
||||||
|
id="certificates:dropdown:menu">
|
||||||
|
<div
|
||||||
|
class="py-1"
|
||||||
|
role="menu"
|
||||||
|
aria-orientation="vertical"
|
||||||
|
aria-labelledby="options-menu">
|
||||||
|
<span
|
||||||
|
class="block w-full text-left px-4 py-2 text-sm text-gray-700">{$_('select-language')}</span>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
generateCertificates('de');
|
||||||
|
}}
|
||||||
|
type="submit"
|
||||||
|
class="block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900 focus:outline-none focus:bg-gray-100 focus:text-gray-900"
|
||||||
|
role="menuitem">
|
||||||
|
{$_('german')}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
generateCertificates('en');
|
||||||
|
}}
|
||||||
|
type="submit"
|
||||||
|
class="block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900 focus:outline-none focus:bg-gray-100 focus:text-gray-900"
|
||||||
|
role="menuitem">
|
||||||
|
{$_('english')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
@@ -37,13 +37,13 @@
|
|||||||
duration: -1,
|
duration: -1,
|
||||||
}).showToast();
|
}).showToast();
|
||||||
let count = 0;
|
let count = 0;
|
||||||
for await (const t of generate_teams) {
|
for (const t of generate_teams) {
|
||||||
count++;
|
count++;
|
||||||
const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
||||||
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: {
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
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_" + t.name + ".pdf";
|
a.download = `${$_('sponsorings')}_${t.name}-${locale}.pdf`;
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
a.remove();
|
a.remove();
|
||||||
@@ -92,12 +92,13 @@
|
|||||||
text: $_("generating-pdf"),
|
text: $_("generating-pdf"),
|
||||||
duration: -1,
|
duration: -1,
|
||||||
}).showToast();
|
}).showToast();
|
||||||
for await (const o of generate_orgs) {
|
let count_orgs =0;
|
||||||
const runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
|
for (const o of generate_orgs) {
|
||||||
o.id
|
count_orgs++;
|
||||||
);
|
let count = 0;
|
||||||
fetch(
|
let runners = await RunnerOrganizationService.runnerOrganizationControllerGetRunners(o.id, true)
|
||||||
`${config.baseurl}/documents/contracts?locale=${locale}&download=true&key=${config.documentserver_key}`,
|
await fetch(
|
||||||
|
`${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 + ".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: {
|
||||||
@@ -174,7 +223,10 @@
|
|||||||
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 = "Sponsoring.pdf";
|
if(generate_runners.length == 1){
|
||||||
|
a.download = `${$_('sponsorings')}_${generate_runners[0].firstname}_${generate_runners[0].lastname}-${locale}.pdf`;
|
||||||
|
}
|
||||||
|
a.download = `${$_('sponsorings')}-${locale}.pdf`;
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
a.remove();
|
a.remove();
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
document.onkeydown = (e) => {
|
document.onkeydown = (e) => {
|
||||||
e = e || window.event;
|
e = e || window.event;
|
||||||
if (e.key === "Escape") {
|
if (e.key === "Escape") {
|
||||||
import_modal_open = false;
|
cancelModal();
|
||||||
}
|
}
|
||||||
if (e.keyCode === 13) {
|
if (e.keyCode === 13) {
|
||||||
//
|
//
|
||||||
@@ -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();
|
||||||
@@ -281,6 +281,16 @@
|
|||||||
bind:files
|
bind:files
|
||||||
type="file" />
|
type="file" />
|
||||||
</div>
|
</div>
|
||||||
|
<div class="overflow-hidden relative mt-4 mb-4">
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
cancelModal();
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full 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 md:ml-40 mr-0 sm:ml-0 sm:w-auto sm:text-sm">
|
||||||
|
{$_('cancel')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{#if json_output.length > 0}
|
{#if json_output.length > 0}
|
||||||
{#if opened_from === 'OrgOverview'}
|
{#if opened_from === 'OrgOverview'}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import { getLocaleFromNavigator, _ } from "svelte-i18n";
|
import { getLocaleFromNavigator, _ } from "svelte-i18n";
|
||||||
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
||||||
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
||||||
|
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
||||||
import store from "../../store";
|
import store from "../../store";
|
||||||
import {
|
import {
|
||||||
RunnerService,
|
RunnerService,
|
||||||
@@ -36,6 +37,7 @@
|
|||||||
editable.group != null;
|
editable.group != null;
|
||||||
$: sponsoring_contracts_show = true;
|
$: sponsoring_contracts_show = true;
|
||||||
$: cards_show = true;
|
$: cards_show = true;
|
||||||
|
$: certificates_show = true;
|
||||||
$: generate_runners = [original_data_pdf];
|
$: generate_runners = [original_data_pdf];
|
||||||
runner_promise.then((data) => {
|
runner_promise.then((data) => {
|
||||||
data_loaded = true;
|
data_loaded = true;
|
||||||
@@ -158,7 +160,10 @@
|
|||||||
bind:sponsoring_contracts_show
|
bind:sponsoring_contracts_show
|
||||||
bind:generate_runners />
|
bind:generate_runners />
|
||||||
<GenerateRunnerCards
|
<GenerateRunnerCards
|
||||||
bind:sponsoring_contracts_show
|
bind:cards_show
|
||||||
|
bind:generate_runners />
|
||||||
|
<GenerateRunnerCertificates
|
||||||
|
bind:certificates_show
|
||||||
bind:generate_runners />
|
bind:generate_runners />
|
||||||
{#if !delete_triggered}
|
{#if !delete_triggered}
|
||||||
<button
|
<button
|
||||||
@@ -289,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}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
import Select from "svelte-select";
|
import Select from "svelte-select";
|
||||||
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
||||||
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
||||||
|
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
||||||
$: searchvalue = "";
|
$: searchvalue = "";
|
||||||
$: active_deletes = [];
|
$: active_deletes = [];
|
||||||
export let current_runners = [];
|
export let current_runners = [];
|
||||||
@@ -27,6 +28,9 @@
|
|||||||
$: cards_show = current_runners.some(
|
$: cards_show = current_runners.some(
|
||||||
(r) => r.is_selected === true
|
(r) => r.is_selected === true
|
||||||
);
|
);
|
||||||
|
$: certificates_show = current_runners.some(
|
||||||
|
(r) => r.is_selected === true
|
||||||
|
);
|
||||||
$: generate_runners = current_runners.filter((r) => r.is_selected === true);
|
$: generate_runners = current_runners.filter((r) => r.is_selected === true);
|
||||||
$: teams = [];
|
$: teams = [];
|
||||||
$: orgs = [];
|
$: orgs = [];
|
||||||
@@ -92,6 +96,9 @@
|
|||||||
<GenerateRunnerCards
|
<GenerateRunnerCards
|
||||||
bind:cards_show
|
bind:cards_show
|
||||||
bind:generate_runners />
|
bind:generate_runners />
|
||||||
|
<GenerateRunnerCertificates
|
||||||
|
bind:certificates_show
|
||||||
|
bind:generate_runners />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
||||||
@@ -190,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} > {runner.group.name}</a>
|
||||||
{/if}
|
{/if}
|
||||||
{#if runner.group.responseType === 'RUNNERORGANIZATION'}
|
{#if runner.group.responseType === 'RUNNERORGANIZATION'}
|
||||||
<a
|
<a
|
||||||
@@ -199,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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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">​</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}
|
||||||
@@ -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">​</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}
|
||||||
@@ -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">​</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}
|
||||||
@@ -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}
|
||||||
@@ -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}
|
||||||
@@ -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 />
|
||||||
@@ -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}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 920.11 411.95" width="920.11" height="411.95"><path d="M436.53 410h195.59c7.72 0 7.73-12 0-12h-195.6c-7.71 0-7.73 12 0 12z" fill="#e6e6e6"/><path d="M383.72 149.23H188.79a7.78 7.78 0 00-7.77 7.77v38.72c9.72.23 16.03 8.26 17.56 18v35.1h.74a.44.44 0 01.45.45v18.68a.44.44 0 01-.45.44h-.74v112.9l-.02 7.02h185.16a7.78 7.78 0 007.77-7.77V157a7.78 7.78 0 00-7.77-7.77z" fill="#6c63ff"/><path d="M745.9 21.81v211.9H404.97v-93.3a16 16 0 00-15.98-15.97h-63.94V21.8z" fill="#6c63ff"/><path d="M766.95 263.58h-361.6v-1.47h360.12V12.55A11.09 11.09 0 00754.4 1.48H312.14a11.09 11.09 0 00-11.08 11.07v110.93h-1.47V12.55A12.57 12.57 0 01312.14 0H754.4a12.57 12.57 0 0112.55 12.55z" fill="#3f3d56"/><path d="M732.69 308.62H405.35v-1.48h327.34a32.82 32.82 0 0032.78-32.78v-10.78H405.35v-1.47h361.6v12.25a34.3 34.3 0 01-34.26 34.26z" fill="#3f3d56"/><path d="M635.54 380.98c-18.25-17.52-30.25-40.39-34.11-72.36h-134.5c-1.36 29.91-13.29 52.35-34.8 72.28l-2.28.08c22.2-20.12 34.43-42.72 35.64-73.13l.03-.7h137.22l.08.65c3.79 32.51 16.04 55.52 34.74 73.06zM388.63 411.52H181.46v-1.47h207.17a16 16 0 0015.98-15.98V140.75a16 16 0 00-15.98-15.97H181.46a16 16 0 00-15.98 15.97v54.67h-1.47v-54.67a17.47 17.47 0 0117.45-17.45h207.17a17.47 17.47 0 0117.46 17.45v253.32a17.47 17.47 0 01-17.46 17.45z" fill="#3f3d56"/><path d="M285.05 141.98a5 5 0 115-5 5.01 5.01 0 01-5 5zm0-8.85a3.85 3.85 0 103.85 3.85 3.85 3.85 0 00-3.85-3.85zM285.05 405.86a6.39 6.39 0 116.39-6.38 6.4 6.4 0 01-6.4 6.38zm0-11.3a4.91 4.91 0 104.91 4.92 4.92 4.92 0 00-4.91-4.92zM179.38 411.95H110.8a19.5 19.5 0 01-19.47-19.47V214.89a19.5 19.5 0 0119.47-19.47h68.58a19.5 19.5 0 0119.47 19.47v31.78a1.92 1.92 0 011.19 1.78v20.67a1.92 1.92 0 01-1.19 1.78v121.58a19.5 19.5 0 01-19.47 19.47zM110.8 196.9a18.02 18.02 0 00-18 18v177.58a18.02 18.02 0 0018 18h68.58a18.02 18.02 0 0018-18V269.57h.74a.44.44 0 00.44-.45v-20.67a.44.44 0 00-.44-.45h-.74v-33.1a18.02 18.02 0 00-18-18z" fill="#3f3d56"/><path d="M180.14 201.03h-8.96a6.65 6.65 0 01-6.15 9.16h-39.29a6.65 6.65 0 01-6.15-9.16h-8.36a14 14 0 00-14 14v177.32a14 14 0 0014 13.99h68.9a14 14 0 0014-14V215.04a14 14 0 00-14-14z" fill="#6c63ff"/><path d="M919.23 411.66H.88a.88.88 0 110-1.76h918.35a.88.88 0 110 1.76z" fill="#3f3d56"/><path d="M636 411.25H431.48a15.5 15.5 0 110-31.01H636a15.5 15.5 0 010 31zm-204.52-29.53a14.03 14.03 0 000 28.05H636a14.03 14.03 0 000-28.05z" fill="#3f3d56"/><path fill="#ffb8b8" d="M784.5 293.2l5.72 11.97 48.92-16.4-8.45-17.67-46.2 22.1z"/><path d="M790.15 333.59l-18-37.64 14.54-6.96 11.58 24.21a14.89 14.89 0 01-7 19.85l-1.12.54z" fill="#2f2e41"/><path fill="#ffb8b8" d="M772.96 400.14l13.27-.45.56-51.64-15.55.92 1.72 51.17z"/><path d="M811.97 411.86h-41.72v-16.12h26.84a14.89 14.89 0 0114.88 14.88v1.24zM774.06 392.38a4.97 4.97 0 01-4.84-3.78c-7.26-29.2-34.3-176.34-10.4-205.23l.22-.26.31-.08c1.68-.42 33.33-10.22 51.9 5.08l.21.17 10.34 29.92 27.86 41.35a20.4 20.4 0 01-6.04 28.66l-36.58 23.08a5 5 0 01-5.75-.4 5.06 5.06 0 01-1.5-2.1l-7.69-19.21a5.03 5.03 0 012.4-6.33l17.15-8.57a3.67 3.67 0 001.83-2.5 2.96 2.96 0 00-1.03-2.55l-19.9-17.15a3 3 0 00-4.95 2.38l4.93 130.2a5 5 0 01-4.22 5.13l-13.46 2.13a5.05 5.05 0 01-.8.06z" fill="#2f2e41"/><path d="M808.38 193.41l-.34-.01-49.62-3.68a4.5 4.5 0 01-3.91-5.97 47.1 47.1 0 001.07-27.31c-3.23-12.75-3.3-36.44-3.06-49.42a8.75 8.75 0 018.28-8.53v-.01h1c8.08.12 22.91.7 35.05 3.22a18.39 18.39 0 0114.66 17.7c.28 12.06.32 28.38-1.05 37.66-1.16 7.83.98 22.86 2.35 31.12a4.5 4.5 0 01-4.43 5.23z" fill="#3f3d56"/><path d="M826.09 240.71a10.02 10.02 0 01-3.81-14.9L799.36 127h17.33l20.22 96.87a10.08 10.08 0 01-10.82 16.84zM717.56 137.7l27.43-25.95 10.34 14.47-25.84 22.74 33.89 26.91c.24-.01.49-.04.74-.04a10.85 10.85 0 11-10.75 12.3l-.1.1-35.28-30.56a13.47 13.47 0 01-.43-19.97z" fill="#ffb8b8"/><path d="M801.19 133.33a4.47 4.47 0 01-4.05-2.55 52.81 52.81 0 01-4.47-14.57c-1.2-8.25 4.54-13.15 10.37-14.22 5.67-1.04 12.58 1.45 14.34 9.38a20.45 20.45 0 01.35 2.04c.7 6 1.37 10.68 1.97 13.9a4.5 4.5 0 01-4.2 5.31l-14.08.7-.23.01z" fill="#3f3d56"/><circle cx="781.54" cy="59.98" r="30" fill="#2f2e41"/><circle cx="781.73" cy="67.77" r="24.56" fill="#ffb8b8"/><path d="M738.13 121.38a4.47 4.47 0 01-1.26-4.62 52.81 52.81 0 016.55-13.76c4.7-6.88 12.23-6.63 17.25-3.48 4.89 3.07 8.3 9.57 4.24 16.61a20.45 20.45 0 01-1.12 1.73c-3.54 4.91-6.21 8.8-7.93 11.58a4.5 4.5 0 01-6.7 1.09l-10.85-9q-.1-.07-.18-.15z" fill="#3f3d56"/><path d="M775.72 33.19c-6.04-3.6-7.35-12.57-3.75-18.61s10.86-9.2 17.9-9.4c10.03-.3 19.72 4.7 26.75 11.87s11.66 16.36 15.2 25.76 6.06 19.15 9.54 28.57c1.79 4.83 3.99 9.8 8.07 12.93s10.59 3.7 14.08-.08c-.01 6.06-4.66 11.57-10.42 13.45s-12.29.46-17.34-2.9c-8.76-5.8-13-16.4-15.41-26.64s-3.61-20.95-8.48-30.27c-2.01-3.87-4.77-7.54-8.66-9.5s-9.06-1.85-12.19 1.19c-1.44 1.4-2.38 3.32-4.02 4.5a8.05 8.05 0 01-7.04.72 23.8 23.8 0 01-6.36-3.59" fill="#2f2e41"/><path d="M756.07 51.17a29.38 29.38 0 0042.13 5.26c2.38-1.94 4.6-4.61 4.45-7.68-.16-3.15-2.73-5.62Line truncated
|
||||||
|
After Width: | Height: | Size: 5.0 KiB |
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
import Teams from "./Teams.svelte";
|
import Teams from "./Teams.svelte";
|
||||||
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
||||||
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
||||||
|
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
||||||
let [teamdata, original, delete_team, orgs, contacts, modal_open] = [
|
let [teamdata, original, delete_team, orgs, contacts, modal_open] = [
|
||||||
{},
|
{},
|
||||||
{},
|
{},
|
||||||
@@ -25,11 +26,12 @@
|
|||||||
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;
|
||||||
$: generate_teams = [original];
|
$: generate_teams = [original];
|
||||||
$: group = {};
|
$: group = {};
|
||||||
$: contact = {};
|
$: contact = {};
|
||||||
@@ -45,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);
|
||||||
@@ -65,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();
|
||||||
@@ -79,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;
|
||||||
@@ -90,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();
|
||||||
@@ -122,6 +126,9 @@
|
|||||||
<GenerateRunnerCards
|
<GenerateRunnerCards
|
||||||
bind:cards_show
|
bind:cards_show
|
||||||
bind:generate_teams />
|
bind:generate_teams />
|
||||||
|
<GenerateRunnerCertificates
|
||||||
|
bind:certificates_show
|
||||||
|
bind:generate_teams />
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
import { clickOutside } from "../base/outsideclick";
|
import { clickOutside } from "../base/outsideclick";
|
||||||
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
||||||
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
||||||
|
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
||||||
$: searchvalue = "";
|
$: searchvalue = "";
|
||||||
$: active_deletes = [];
|
$: active_deletes = [];
|
||||||
$: sponsoring_contracts_show = current_teams.some(
|
$: sponsoring_contracts_show = current_teams.some(
|
||||||
@@ -17,6 +18,9 @@
|
|||||||
$: cards_show = current_teams.some(
|
$: cards_show = current_teams.some(
|
||||||
(r) => r.is_selected === true
|
(r) => r.is_selected === true
|
||||||
);
|
);
|
||||||
|
$: certificates_show = current_teams.some(
|
||||||
|
(r) => r.is_selected === true
|
||||||
|
);
|
||||||
$: generate_teams = current_teams.filter((r) => r.is_selected === true);
|
$: generate_teams = current_teams.filter((r) => r.is_selected === true);
|
||||||
export let current_teams = [];
|
export let current_teams = [];
|
||||||
let modal_open = false;
|
let modal_open = false;
|
||||||
@@ -61,6 +65,9 @@
|
|||||||
<GenerateRunnerCards
|
<GenerateRunnerCards
|
||||||
bind:cards_show
|
bind:cards_show
|
||||||
bind:generate_teams />
|
bind:generate_teams />
|
||||||
|
<GenerateRunnerCertificates
|
||||||
|
bind:certificates_show
|
||||||
|
bind:generate_teams />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
import App from './App.svelte';
|
|
||||||
|
|
||||||
const app = new App({
|
|
||||||
target: document.body
|
|
||||||
});
|
|
||||||
|
|
||||||
export default app;
|
|
||||||
// HMR
|
|
||||||
if (import.meta.hot) {
|
|
||||||
import.meta.hot.accept();
|
|
||||||
import.meta.hot.dispose(() => {
|
|
||||||
app.$destroy();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
+474
-426
@@ -1,427 +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",
|
||||||
"change-your-password-here": "Hier kannst du dein Passwort ändern",
|
"card-updated": "Karte aktualisiert",
|
||||||
"changing-your-password": "Passwort wird geändert",
|
"cards": "Läuferkarten",
|
||||||
"city": "Stadt",
|
"certificates": "Urkunden",
|
||||||
"click-to-copy-the-link-into-your-clipboard": "Klicke auf den Link, um ihn in deine Zwischenablage zu kopieren",
|
"change-your-password-here": "Hier kannst du dein Passwort ändern",
|
||||||
"click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren",
|
"changing-your-password": "Passwort wird geändert",
|
||||||
"close": "Schließen",
|
"city": "Stadt",
|
||||||
"code": "Code",
|
"click-to-copy-the-link-into-your-clipboard": "Klicke auf den Link, um ihn in deine Zwischenablage zu kopieren",
|
||||||
"configure-the-tracks-and-minimum-lap-times": "Bearbeite die Tracks und ihre minimale Rundenzeit",
|
"click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren",
|
||||||
"confirm": "Bestätigen",
|
"close": "Schließen",
|
||||||
"confirm-delete": "Löschung Bestätigen",
|
"code": "Code",
|
||||||
"confirm-delete-donor-with-all-donations": "Bestätigen, Sponsor:in mit allen Sponsorings löschen",
|
"configure-the-tracks-and-minimum-lap-times": "Bearbeite die Tracks und ihre minimale Rundenzeit",
|
||||||
"confirm-delete-my-user-profile": "Bestätigung, mein Benutzerprofil löschen",
|
"confirm": "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": "Löschung Bestätigen",
|
||||||
"confirm-delete-team-and-associated-runners": "Bestätigung, lösche das Team mitsamt seinen Läufer:innen.",
|
"confirm-delete-donor-with-all-donations": "Bestätigen, Sponsor:in mit allen Sponsorings löschen",
|
||||||
"confirm-deletion": "Löschung Bestätigen",
|
"confirm-delete-my-user-profile": "Bestätigung, mein Benutzerprofil löschen",
|
||||||
"confirm-the-new-password": "Neues Passwort bestätigen",
|
"confirm-delete-organization-and-associated-teams-runners": "Bestätugung, lösche die Organisation und alle zugehörigen Teams und Läufer:innen.",
|
||||||
"contact": "Kontakt",
|
"confirm-delete-team-and-associated-runners": "Bestätigung, lösche das Team mitsamt seinen Läufer:innen.",
|
||||||
"contact-deleted": "Kontakt gelöscht",
|
"confirm-deletion": "Löschung Bestätigen",
|
||||||
"contact-information": "Kontaktinformation",
|
"confirm-the-new-password": "Neues Passwort bestätigen",
|
||||||
"contact-is-being-updated": "Kontakt wird aktualisiert ...",
|
"contact": "Kontakt",
|
||||||
"contact-is-not-a-member-in-any-group": "Kontakt gehört zu keiner Gruppe",
|
"contact-added": "Kontakt wurde hinzugefügt",
|
||||||
"contacts": "Kontakte",
|
"contact-deleted": "Kontakt gelöscht",
|
||||||
"contacts-are-being-loaded": "Kontakte werden geladen ...",
|
"contact-information": "Kontaktinformation",
|
||||||
"copied-link-to-clipboard": "Link wurde in die Zwischenablage kopiert",
|
"contact-is-being-added": "Kontakt wird erstellt...",
|
||||||
"copied-token-to-clipboard": "Token wurde in die Zwischenablage kopiert",
|
"contact-is-being-updated": "Kontakt wird aktualisiert ...",
|
||||||
"count_organizations": "Organisationen (Anzahl)",
|
"contact-is-not-a-member-in-any-group": "Kontakt gehört zu keiner Gruppe",
|
||||||
"count_teams": "Teams (Anzahl)",
|
"contacts": "Kontakte",
|
||||||
"create": "Erstellen",
|
"contacts-are-being-loaded": "Kontakte werden geladen ...",
|
||||||
"create-a-new": "Erstelle eine neue",
|
"copied-link-to-clipboard": "Link wurde in die Zwischenablage kopiert",
|
||||||
"create-a-new-card": "Neue Läuferkarte erstellen",
|
"copied-token-to-clipboard": "Token wurde in die Zwischenablage kopiert",
|
||||||
"create-a-new-contact": "Kontakt erstellen",
|
"count_organizations": "Organisationen (Anzahl)",
|
||||||
"create-a-new-distance-donation": "Erstelle ein neues Sponsoring",
|
"count_teams": "Teams (Anzahl)",
|
||||||
"create-a-new-donor": "Neue Sponsor:in erstellen",
|
"create": "Erstellen",
|
||||||
"create-a-new-fixed-donation": "Erstelle eine neue Festbetragsspende",
|
"create-a-new": "Erstelle eine neue",
|
||||||
"create-a-new-organization": "Neue Organisation anlegen",
|
"create-a-new-card": "Neue Läuferkarte erstellen",
|
||||||
"create-a-new-runner": "Neue Läufer:in erstellen",
|
"create-a-new-contact": "Kontakt erstellen",
|
||||||
"create-a-new-scan-fixed-only": "Neuen Scan erstellen (nur mit Festdistanz)",
|
"create-a-new-distance-donation": "Erstelle ein neues Sponsoring",
|
||||||
"create-a-new-scanstation": "Neue Station erstellen",
|
"create-a-new-donor": "Neue Sponsor:in erstellen",
|
||||||
"create-a-new-team": "Erstelle ein neues Team",
|
"create-a-new-fixed-donation": "Erstelle eine neue Festbetragsspende",
|
||||||
"create-a-new-track": "Neuen Track erstellen",
|
"create-a-new-organization": "Neue Organisation anlegen",
|
||||||
"create-a-new-user": "Neue Benutzer:in anlegen",
|
"create-a-new-runner": "Neue Läufer:in erstellen",
|
||||||
"create-a-new-user-group": "Erstelle eine neue Gruppe",
|
"create-a-new-scan-fixed-only": "Neuen Scan erstellen (nur mit Festdistanz)",
|
||||||
"create-and-generate-pdf": "Erstellen und PDF herunterladen",
|
"create-a-new-scanstation": "Neue Station erstellen",
|
||||||
"create-bulk-blanco-cards": "Blankokarten erstellen",
|
"create-a-new-team": "Erstelle ein neues Team",
|
||||||
"create-bulk-cards": "Blankokarten erstellen",
|
"create-a-new-track": "Neuen Track erstellen",
|
||||||
"create-organization": "Organisation erstellen",
|
"create-a-new-user": "Neue Benutzer:in anlegen",
|
||||||
"create-team": "Team erstellen",
|
"create-a-new-user-group": "Erstelle eine neue Gruppe",
|
||||||
"create-track": "Track erstellen",
|
"create-and-generate-pdf": "Erstellen und PDF herunterladen",
|
||||||
"create-user": "Benutzer anlegen",
|
"create-bulk-blanco-cards": "Blankokarten erstellen",
|
||||||
"create-without-pdf": "Ohne PDF erstellen",
|
"create-bulk-cards": "Blankokarten erstellen",
|
||||||
"created-blanco-cards": "Blankokarten wurden erstellt",
|
"create-organization": "Organisation erstellen",
|
||||||
"creating-blanco-cards": "Erstelle Blankokarten",
|
"create-team": "Team erstellen",
|
||||||
"credits": "Credits",
|
"create-track": "Track erstellen",
|
||||||
"csv_import__class": "Klasse",
|
"create-user": "Benutzer anlegen",
|
||||||
"csv_import__firstname": "Vorname",
|
"create-without-pdf": "Ohne PDF erstellen",
|
||||||
"csv_import__lastname": "Nachname",
|
"created-blanco-cards": "Blankokarten wurden erstellt",
|
||||||
"csv_import__middlename": "Mittelname",
|
"creating-blanco-cards": "Erstelle Blankokarten",
|
||||||
"csv_import__team": "Team",
|
"credits": "Credits",
|
||||||
"danger-zone": "Gefahrenzone",
|
"csv_import__class": "Klasse",
|
||||||
"dashboard-greeting": "Hallo",
|
"csv_import__firstname": "Vorname",
|
||||||
"dashboard-title": "Dashboard",
|
"csv_import__lastname": "Nachname",
|
||||||
"datatable": {
|
"csv_import__middlename": "Mittelname",
|
||||||
"search": "🔍 Suche ...",
|
"csv_import__team": "Team",
|
||||||
"an_error_happened_while_fetching_the_data": "Beim Abrufen der Daten ist ein Fehler aufgetreten",
|
"danger-zone": "Gefahrenzone",
|
||||||
"loading": "Wird geladen...",
|
"dashboard-greeting": "Hallo",
|
||||||
"next": "Nächste",
|
"dashboard-title": "Dashboard",
|
||||||
"of": "von",
|
"datatable": {
|
||||||
"previous": "Vorherige",
|
"search": "🔍 Suche ...",
|
||||||
"to": "bis",
|
"an_error_happened_while_fetching_the_data": "Beim Abrufen der Daten ist ein Fehler aufgetreten",
|
||||||
"showing": "Zeige",
|
"loading": "Wird geladen...",
|
||||||
"no_matching_records_found": "Keine passenden Einträge gefunden",
|
"next": "Nächste",
|
||||||
"page": "Seite",
|
"of": "von",
|
||||||
"records": "Einträge",
|
"previous": "Vorherige",
|
||||||
"sort_column_ascending": "Spalte aufsteigend sortieren",
|
"to": "bis",
|
||||||
"sort_column_descending": "Spalte absteigend sortieren"
|
"showing": "Zeige",
|
||||||
},
|
"no_matching_records_found": "Keine passenden Einträge gefunden",
|
||||||
"delete": "Löschen",
|
"page": "Seite",
|
||||||
"delete-contact": "Kontakt löschen",
|
"records": "Einträge",
|
||||||
"delete-donation": "Sponsporing löschen",
|
"sort_column_ascending": "Spalte aufsteigend sortieren",
|
||||||
"delete-donor": "Sponsor:in löschen",
|
"sort_column_descending": "Spalte absteigend sortieren"
|
||||||
"delete-group": "Gruppe löschen",
|
},
|
||||||
"delete-organization": "Organisation löschen",
|
"delete": "Löschen",
|
||||||
"delete-profile": "Profil löschen",
|
"delete-contact": "Kontakt löschen",
|
||||||
"delete-runner": "Läufer:in löschen",
|
"delete-donation": "Sponsoring löschen",
|
||||||
"delete-scan": "Scan löschen",
|
"delete-donor": "Sponsor:in löschen",
|
||||||
"delete-station": "Station löschen",
|
"delete-group": "Gruppe löschen",
|
||||||
"delete-team": "Team Löschen",
|
"delete-organization": "Organisation löschen",
|
||||||
"delete-user": "Benutzer:in löschen",
|
"delete-profile": "Profil löschen",
|
||||||
"deleted-scan": "Scan wurde gelöscht",
|
"delete-runner": "Läufer:in löschen",
|
||||||
"dependency_name": "Name",
|
"delete-scan": "Scan löschen",
|
||||||
"description": "Beschreibung",
|
"delete-station": "Station löschen",
|
||||||
"description-optional": "Beschreibung (optional)",
|
"delete-team": "Team Löschen",
|
||||||
"deselect-all": "Alle abwählen",
|
"delete-user": "Benutzer:in löschen",
|
||||||
"details": "Details",
|
"deleted-scan": "Scan wurde gelöscht",
|
||||||
"disabled": "deaktiviert",
|
"dependency_name": "Name",
|
||||||
"distance": "Distanz",
|
"description": "Beschreibung",
|
||||||
"distance-donation": "Sponsoring",
|
"description-optional": "Beschreibung (optional)",
|
||||||
"distance-in-km": "Distanz (in KM)",
|
"deselect-all": "Alle abwählen",
|
||||||
"distance-track": "Distanz (+Track)",
|
"details": "Details",
|
||||||
"do-you-really-want-to-delete-your-profile": "Möchtest du dein Profil wirklich löschen?",
|
"disabled": "deaktiviert",
|
||||||
"do-you-want-to-delete-the-organization-delete_org-name": "Möchtest du die Organisation {orgname} löschen?",
|
"distance": "Distanz",
|
||||||
"do-you-want-to-delete-the-team-delete_team-name": "Möchtest du das Team {teamname} löschen?",
|
"distance-donation": "Sponsoring",
|
||||||
"do-you-want-to-delete-this-donor-with-all-related-donations": "Möchtest du diese Sponsor:in mit all ihren Sponsorings löschen?",
|
"distance-in-km": "Distanz (in KM)",
|
||||||
"documentation": "Dokumentation",
|
"distance-track": "Distanz (+Track)",
|
||||||
"donation-amount": "Sponsoringbetrag",
|
"do-you-really-want-to-delete-your-profile": "Möchtest du dein Profil wirklich 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-organization-delete_org-name": "Möchtest du die Organisation {orgname} löschen?",
|
||||||
"donations": "Sponsorings",
|
"do-you-want-to-delete-the-team-delete_team-name": "Möchtest du das Team {teamname} löschen?",
|
||||||
"donor": "Sponsor:in",
|
"do-you-want-to-delete-this-donor-with-all-related-donations": "Möchtest du diese Sponsor:in mit all ihren Sponsorings löschen?",
|
||||||
"donor-added": "Sponsor:in hinzugefügt",
|
"documentation": "Dokumentation",
|
||||||
"donor-deleted": "Sponsor:in gelöscht",
|
"donation-amount": "Sponsoringbetrag",
|
||||||
"donor-has-no-associated-donations": "Zur Sponsor:in gibt es noch keine Sponsorings",
|
"donation-amount-must-be-greater-that-0-00eur": "Der Sponsoringbetrag muss größer als 0.00€ sein.",
|
||||||
"donor-is-being-added": "Sponsor:in wird hinzugefügt...",
|
"donation-deleted": "Sponsoring gelöscht",
|
||||||
"donor-is-being-updated": "Sponsor:in wird aktualisiert",
|
"donation-updated": "Sponsoring wurde aktualisiert",
|
||||||
"donors": "Sponsor:innen",
|
"donation_added": "Sponsoring hinzugefügt",
|
||||||
"donors-are-being-loaded": "Sponsor:innen werden geladen",
|
"donations": "Sponsorings",
|
||||||
"dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?",
|
"donor": "Sponsor:in",
|
||||||
"dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌",
|
"donor-added": "Sponsor:in hinzugefügt",
|
||||||
"e-mail-adress": "E-Mail-Adresse",
|
"donor-deleted": "Sponsor:in gelöscht",
|
||||||
"edit": "Bearbeiten",
|
"donor-has-no-associated-donations": "Zur Sponsor:in gibt es noch keine Sponsorings",
|
||||||
"edit-a-card": "Läuferkarte bearbeiten",
|
"donor-is-being-added": "Sponsor:in wird hinzugefügt...",
|
||||||
"edit-permissions": "Berechtigungen bearbeiten",
|
"donor-is-being-updated": "Sponsor:in wird aktualisiert",
|
||||||
"email_address_or_username": "E-Mail-Adresse/ Benutzername",
|
"donors": "Sponsor:innen",
|
||||||
"enabled": "aktiviert",
|
"donors-are-being-loaded": "Sponsor:innen werden geladen",
|
||||||
"enabled_large": "Aktiviert",
|
"dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?",
|
||||||
"english": "Englisch",
|
"dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌",
|
||||||
"error-during-import": "Fehler beim Importieren",
|
"e-mail-adress": "E-Mail-Adresse",
|
||||||
"error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage",
|
"edit": "Bearbeiten",
|
||||||
"error_on_login": "😢Fehler beim Login",
|
"edit-a-card": "Läuferkarte bearbeiten",
|
||||||
"erteilte": "Direkt erteilte",
|
"edit-permissions": "Berechtigungen bearbeiten",
|
||||||
"everything-concerning-your-profile": "Alles zu deinem Profil",
|
"email_address_or_username": "E-Mail-Adresse/ Benutzername",
|
||||||
"everything-is-more-fun-together": "Im Team macht's mehr Spaß 🏃♂️🏃♀️🏃♂️",
|
"enabled": "aktiviert",
|
||||||
"faq": "FAQ",
|
"enabled_large": "Aktiviert",
|
||||||
"filter-by-organization-team": "Filtern nach Organisation / Team",
|
"english": "Englisch",
|
||||||
"first-name": "Vorname",
|
"enter-payment": "Zahlung eingeben",
|
||||||
"first-name-is-required": "Vorname muss angegeben werden",
|
"error-during-import": "Fehler beim Importieren",
|
||||||
"first-scan-of-the-day": "Erster Scan des Tages",
|
"error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage",
|
||||||
"fixed-donation": "Festbetragsspende",
|
"error_on_login": "😢Fehler beim Login",
|
||||||
"forgot_password": "Passwort vergessen?",
|
"erteilte": "Direkt erteilte",
|
||||||
"geerbte": "geerbte",
|
"everything-concerning-your-profile": "Alles zu deinem Profil",
|
||||||
"general-stats": "Allgemeine Statistiken",
|
"everything-is-more-fun-together": "Im Team macht's mehr Spaß 🏃♂️🏃♀️🏃♂️",
|
||||||
"general_promise_error": "😢 Ein unbekannter Fehler ist aufgetreten",
|
"faq": "FAQ",
|
||||||
"generate-runnercards": "Läuferkarten generieren",
|
"filename_sponsoringquittungsliste": "SponsoringQuittungsListe",
|
||||||
"generate-sponsoring-contract": "Sponsoringvertrag generieren",
|
"filter-by-organization-team": "Filtern nach Organisation / Team",
|
||||||
"generate-sponsoring-contracts": "Sponsoringverträge generieren",
|
"first-name": "Vorname",
|
||||||
"generating-pdf": "Pdf wird generiert...",
|
"first-name-is-required": "Vorname muss angegeben werden",
|
||||||
"generating-pdfs": "PDFs werden generiert...",
|
"first-scan-of-the-day": "Erster Scan des Tages",
|
||||||
"generic-ui-logic-error": "Etwas ist in der Benutzeroberfläche schiefgelaufen.",
|
"fixed-donation": "Festbetragsspende",
|
||||||
"german": "Deutsch",
|
"forgot_password": "Passwort vergessen?",
|
||||||
"go-to-login": "Zum Login",
|
"geerbte": "geerbte",
|
||||||
"goback": "Zur Startseite",
|
"general-stats": "Allgemeine Statistiken",
|
||||||
"granted": "Gewährt",
|
"general_promise_error": "😢 Ein unbekannter Fehler ist aufgetreten",
|
||||||
"group": "Gruppe",
|
"generate-runner-certificate": "Urkunde generieren",
|
||||||
"group-added": "Gruppe hinzugefügt",
|
"generate-runner-certificates": "Urkunden generieren",
|
||||||
"group-is-being-added": "Gruppe wird erstellt",
|
"generate-runnercards": "Läuferkarten generieren",
|
||||||
"group-name-is-required": "Der Gruppenname muss angegeben werden.",
|
"generate-sponsoring-contract": "Sponsoringvertrag generieren",
|
||||||
"group-updated": "Gruppe aktualisiert",
|
"generate-sponsoring-contracts": "Sponsoringverträge generieren",
|
||||||
"groups": "Gruppen",
|
"generating-pdf": "PDF wird generiert...",
|
||||||
"groups-are-being-loaded": "Gruppen werden geladen",
|
"generating-pdfs": "PDFs werden generiert...",
|
||||||
"home": "Start",
|
"generic-ui-logic-error": "Etwas ist in der Benutzeroberfläche schiefgelaufen.",
|
||||||
"icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:",
|
"german": "Deutsch",
|
||||||
"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.",
|
"go-to-login": "Zum Login",
|
||||||
"import-finished": "Import abgeschlossen",
|
"goback": "Zur Startseite",
|
||||||
"import-runners": "Läufer:innen importieren",
|
"granted": "Gewährt",
|
||||||
"import__target-organization": "Ziel Organisation",
|
"group": "Gruppe",
|
||||||
"imprint": "Impressum ",
|
"group-added": "Gruppe hinzugefügt",
|
||||||
"imprint-loading": "Impressum lädt...",
|
"group-is-being-added": "Gruppe wird erstellt",
|
||||||
"inactive": "Inaktiv",
|
"group-name-is-required": "Der Gruppenname muss angegeben werden.",
|
||||||
"installed-version": "Installierte Version",
|
"group-updated": "Gruppe aktualisiert",
|
||||||
"internal-error": "Interner Fehler",
|
"groups": "Gruppen",
|
||||||
"invalid": "Ungültig",
|
"groups-are-being-loaded": "Gruppen werden geladen",
|
||||||
"invalid-mail-reset": "Das ist keine gültige E-Mail",
|
"home": "Start",
|
||||||
"just-enter-how-many-you-want-and-the-system-will-create-them": "Gebe einfach ein, wie viele Blankokarten das System erstellen soll.",
|
"icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:",
|
||||||
"laeufer-hinzufuegen": "Läufer:in hinzufügen",
|
"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.",
|
||||||
"laeufer-importieren": "Läufer:innen importieren",
|
"import-finished": "Import abgeschlossen",
|
||||||
"laptime": "Rundenzeit",
|
"import-runners": "Läufer:innen importieren",
|
||||||
"last-name": "Nachname",
|
"import__target-organization": "Ziel Organisation",
|
||||||
"last-name-is-required": "Nachname muss angegeben werden",
|
"imprint": "Impressum ",
|
||||||
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
|
"imprint-loading": "Impressum lädt...",
|
||||||
"license": "Lizenz",
|
"inactive": "Inaktiv",
|
||||||
"licenses-are-being-loaded": "Lizenzen werden geladen...",
|
"installed-version": "Installierte Version",
|
||||||
"loading-cards": "Läuferkarten werden geladen",
|
"internal-error": "Interner Fehler",
|
||||||
"loading-contact-details": "Kontaktdaten werden geladen ...",
|
"invalid": "Ungültig",
|
||||||
"loading-donation-details": "Lade Sponsoringdetails",
|
"invalid-mail-reset": "Das ist keine gültige E-Mail",
|
||||||
"loading-donor-details": "Lade Details",
|
"just-enter-how-many-you-want-and-the-system-will-create-them": "Gebe einfach ein, wie viele Blankokarten das System erstellen soll.",
|
||||||
"loading-group-detail": "Lade Gruppendetails...",
|
"laeufer-hinzufuegen": "Läufer:in hinzufügen",
|
||||||
"loading-profile-data": "Lade Profildaten",
|
"laeufer-importieren": "Läufer:innen importieren",
|
||||||
"loading-runners": "Läufer:innen werden geladen...",
|
"laptime": "Rundenzeit",
|
||||||
"loading-station-details": "Lade Scanstation-Details ...",
|
"last-name": "Nachname",
|
||||||
"log_in": "Anmelden",
|
"last-name-is-required": "Nachname muss angegeben werden",
|
||||||
"log_in_to_your_account": "Bitte melde dich an",
|
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
|
||||||
"login_is_checked": "Login wird überprüft",
|
"license": "Lizenz",
|
||||||
"logout": "Abmelden",
|
"licenses-are-being-loaded": "Lizenzen werden geladen...",
|
||||||
"mail-validation-in-progress": "E-Mail Verifizierung läuft... ",
|
"loading-cards": "Läuferkarten werden geladen",
|
||||||
"manage-admin-users": "Nutzer verwalten",
|
"loading-contact-details": "Kontaktdaten werden geladen ...",
|
||||||
"middle-name": "Mittelname",
|
"loading-donation-details": "Lade Sponsoringdetails",
|
||||||
"minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)",
|
"loading-donor-details": "Lade Details",
|
||||||
"minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein",
|
"loading-group-detail": "Lade Gruppendetails...",
|
||||||
"must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!",
|
"loading-profile-data": "Lade Profildaten",
|
||||||
"must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!",
|
"loading-runners": "Läufer:innen werden geladen...",
|
||||||
"must-contain-a-number": "Passwort muss eine Zahl enthalten!",
|
"loading-station-details": "Lade Scanstation-Details ...",
|
||||||
"must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!",
|
"log_in": "Anmelden",
|
||||||
"name": "Name",
|
"log_in_to_your_account": "Bitte melde dich an",
|
||||||
"name-is-required": "Der Gruppenname muss angegeben werden",
|
"login_is_checked": "Login wird überprüft",
|
||||||
"new-password": "Neues Passwort",
|
"logout": "Abmelden",
|
||||||
"no-contact-found": "Keine Kontakte gefunden",
|
"mail-validation-in-progress": "E-Mail Verifizierung läuft... ",
|
||||||
"no-contact-selected": "Kein Kontakt ausgewählt",
|
"manage-admin-users": "Nutzer verwalten",
|
||||||
"no-contact-specified": "Kein Kontakt angegeben",
|
"middle-name": "Mittelname",
|
||||||
"no-donors-found": "Keine Spender:innen gefunden",
|
"minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)",
|
||||||
"no-license-text-could-be-found": "Kein Lizenz-Text gefunden 😢",
|
"minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein",
|
||||||
"no-organization-or-team-found": "Keine Organisationen oder Teams gefunden",
|
"must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!",
|
||||||
"no-organization-specified": "Keine Organisation angegeben",
|
"must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!",
|
||||||
"no-organizations-found": "Keine Organisationen gefunden",
|
"must-contain-a-number": "Passwort muss eine Zahl enthalten!",
|
||||||
"no-runners-found": "Keine Läufer:innen gefunden",
|
"must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!",
|
||||||
"no-tracks-added-yet": "Es wurden noch keine Tracks erstellt.",
|
"name": "Name",
|
||||||
"non-blanko": "Keine/Blankokarte",
|
"name-is-required": "Der Gruppenname muss angegeben werden",
|
||||||
"organization": "Organisation",
|
"new-password": "Neues Passwort",
|
||||||
"organization-added": "Organisation hinzugefügt",
|
"no-contact-found": "Keine Kontakte gefunden",
|
||||||
"organization-deleted": "Organisation gelöscht",
|
"no-contact-selected": "Kein Kontakt ausgewählt",
|
||||||
"organization-detail-is-being-loaded": "Organisationsdetails werden geladen ...",
|
"no-contact-specified": "Kein Kontakt angegeben",
|
||||||
"organization-is-being-added": "Organisation wird hinzugefügt ...",
|
"no-donors-found": "Keine Spender:innen gefunden",
|
||||||
"organization-name-is-required": "Der Name muss angegeben werden",
|
"no-license-text-could-be-found": "Kein Lizenz-Text gefunden 😢",
|
||||||
"organizations": "Organisationen",
|
"no-organization-or-team-found": "Keine Organisationen oder Teams gefunden",
|
||||||
"organizations-are-being-loaded": "Organisationen werden geladen ...",
|
"no-organization-specified": "Keine Organisation angegeben",
|
||||||
"orgs": "Organisationen",
|
"no-organizations-found": "Keine Organisationen gefunden",
|
||||||
"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!",
|
"no-runners-found": "Keine Läufer:innen gefunden",
|
||||||
"password": "Passwort",
|
"no-tracks-added-yet": "Es wurden noch keine Tracks erstellt.",
|
||||||
"password-changed": "Passwort wurde aktualisiert!",
|
"non-blanko": "Keine/Blankokarte",
|
||||||
"password-is-required": "Passwort muss angegeben werden",
|
"open": "OFFEN",
|
||||||
"password-reset-failed": "Passwort zurücksetzen ist fehlgeschlagen!",
|
"organization": "Organisation",
|
||||||
"password-reset-in-progress": "Passwort wird zurückgesetzt...",
|
"organization-added": "Organisation hinzugefügt",
|
||||||
"password-reset-mail-sent": "Passwort-Reset Mail wurde an \"{usersEmail}\" geschickt.",
|
"organization-deleted": "Organisation gelöscht",
|
||||||
"password-reset-successful": "Passwort erfolgreich zurückgesetzt!",
|
"organization-detail-is-being-loaded": "Organisationsdetails werden geladen ...",
|
||||||
"passwords-dont-match": "Die Passwörter stimmen nicht überein!",
|
"organization-is-being-added": "Organisation wird hinzugefügt ...",
|
||||||
"pdf-generation-failed": "PDF Generierung fehlgeschlagen!",
|
"organization-name-is-required": "Der Name muss angegeben werden",
|
||||||
"pdf-successfully-generated": "PDF wurde erfolgreich generiert!",
|
"organizations": "Organisationen",
|
||||||
"pdfs-successfully-generated": "Alle PDFs wurden generiert!",
|
"organizations-are-being-loaded": "Organisationen werden geladen ...",
|
||||||
"per-kilometer": "pro Kilometer",
|
"orgs": "Organisationen",
|
||||||
"permissions": "Berechtigungen",
|
"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!",
|
||||||
"permissions-updated": "Berechtigungen aktualisiert!",
|
"paid": "BEZAHLT",
|
||||||
"phone": "Telefon",
|
"paid-amount": "Gezahlter Betrag",
|
||||||
"please-copy-the-token-and-store-it-somewhere-save": "Bitte kopiere dir den Token und bewahre ihn gut auf.",
|
"password": "Passwort",
|
||||||
"please-provide-a-password": "Bitte gebe ein Passwort an...",
|
"password-changed": "Passwort wurde aktualisiert!",
|
||||||
"please-provide-the-nessecary-information-to-add-a-new-donor": "Bitte mach die Notwendigen Angaben, um eine neue Sponsor:in zu erstellen",
|
"password-is-required": "Passwort muss angegeben werden",
|
||||||
"please-provide-the-nessecary-information-to-create-a-new-donation": "Bitte gebe alle für das Sponsoring notwendigen Daten an.",
|
"password-reset-failed": "Passwort zurücksetzen ist fehlgeschlagen!",
|
||||||
"please-provide-the-nessecary-information-to-create-a-new-scan": "Bitte gebe alle notwendigen Informationen an, um einen neuen Scan zu erstellen.",
|
"password-reset-in-progress": "Passwort wird zurückgesetzt...",
|
||||||
"please-provide-the-required-csv-xlsx-file": "Bitte eine CSV oder XLSX Datei hochladen.",
|
"password-reset-mail-sent": "Passwort-Reset Mail wurde an \"{usersEmail}\" geschickt.",
|
||||||
"please-provide-the-required-information-for-creating-a-new-user-group": "Bitte gebe alle für eine neue Gruppe notwendigen Informationen an.",
|
"password-reset-successful": "Passwort erfolgreich zurückgesetzt!",
|
||||||
"please-provide-the-required-information-to-add-a-new-contact": "Bitte gebe alle nötigen Informationen an, im den neuen Kontakt zu erstellen.",
|
"passwords-dont-match": "Die Passwörter stimmen nicht überein!",
|
||||||
"please-provide-the-required-information-to-add-a-new-organization": "Bitte gebe alle nötigen Informationen an, im die neue Organisation zu erstellen.",
|
"payment-amount-must-be-greater-than-0-00eur": "Der Zahlungsbetrag muss größer als 0.00€ sein!",
|
||||||
"please-provide-the-required-information-to-add-a-new-runner": "Bitte die benötigten Informationen angeben.",
|
"pdf-generation-failed": "PDF Generierung fehlgeschlagen!",
|
||||||
"please-provide-the-required-information-to-add-a-new-team": "Bitte gebe alle nötigen Informationen an, im das neue Team zu erstellen.",
|
"pdf-successfully-generated": "PDF wurde erfolgreich generiert!",
|
||||||
"please-provide-the-required-information-to-add-a-new-track": "Bitte die benötigten Informationen angeben.",
|
"pdfs-successfully-generated": "Alle PDFs wurden generiert!",
|
||||||
"please-provide-the-required-information-to-add-a-new-user": "Bitte gebe alle nötigen Informationen an, im die neue Benutzer:in zu erstellen.",
|
"per-kilometer": "pro Kilometer",
|
||||||
"please-provide-the-required-information-to-create-a-new-scanstation": "Bitte gebe alle für eine Scannerstation notwendigen Informationen an",
|
"permissions": "Berechtigungen",
|
||||||
"please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...",
|
"permissions-updated": "Berechtigungen aktualisiert!",
|
||||||
"privacy": "Datenschutz",
|
"phone": "Telefon",
|
||||||
"privacy-loading": "Datenschutzerklärung lädt...",
|
"please-copy-the-token-and-store-it-somewhere-save": "Bitte kopiere dir den Token und bewahre ihn gut auf.",
|
||||||
"profile": "Profil",
|
"please-provide-a-password": "Bitte gebe ein Passwort an...",
|
||||||
"profile-picture": "Profilbild",
|
"please-provide-the-nessecary-information-to-add-a-new-donor": "Bitte mach die Notwendigen Angaben, um eine neue Sponsor:in zu erstellen",
|
||||||
"profile-updated": "Profil wurde aktualisiert!",
|
"please-provide-the-nessecary-information-to-create-a-new-donation": "Bitte gebe alle für das Sponsoring notwendigen Daten an.",
|
||||||
"read-license": "Lizenz-Text lesen",
|
"please-provide-the-nessecary-information-to-create-a-new-scan": "Bitte gebe alle notwendigen Informationen an, um einen neuen Scan zu erstellen.",
|
||||||
"receipt-needed": "Spendenquittung benötigt",
|
"please-provide-the-required-csv-xlsx-file": "Bitte eine CSV oder XLSX Datei hochladen.",
|
||||||
"repo_link": "Link",
|
"please-provide-the-required-information-for-creating-a-new-user-group": "Bitte gebe alle für eine neue Gruppe notwendigen Informationen an.",
|
||||||
"request-a-new-reset-mail": "Neue Reset-Mail anfordern",
|
"please-provide-the-required-information-to-add-a-new-contact": "Bitte gebe alle nötigen Informationen an, im den neuen Kontakt zu erstellen.",
|
||||||
"reset-my-password": "Passwort zurücksetzen",
|
"please-provide-the-required-information-to-add-a-new-organization": "Bitte gebe alle nötigen Informationen an, im die neue Organisation zu erstellen.",
|
||||||
"reset-password": "Passwort zurücksetzen",
|
"please-provide-the-required-information-to-add-a-new-runner": "Bitte die benötigten Informationen angeben.",
|
||||||
"runner": "Läufer:in",
|
"please-provide-the-required-information-to-add-a-new-team": "Bitte gebe alle nötigen Informationen an, im das neue Team zu erstellen.",
|
||||||
"runner-added": "Läufer:in hinzugefügt",
|
"please-provide-the-required-information-to-add-a-new-track": "Bitte die benötigten Informationen angeben.",
|
||||||
"runner-import": "Läufer:innen Import",
|
"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-is-being-added": "Läufer:in wird hinzugefügt...",
|
"please-provide-the-required-information-to-create-a-new-scanstation": "Bitte gebe alle für eine Scannerstation notwendigen Informationen an",
|
||||||
"runner-updated": "Läufer:in aktualisiert!",
|
"please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...",
|
||||||
"runnerimport_verify_runners_org": "Bitte die Läufer:innen für den Import in die Organisation \"{org_name}\" bestätigen",
|
"please-wait-a-moment-your-login-is-still-being-processed": "Bitte warte einen Moment, deine Anmeldung wird verarbeitet",
|
||||||
"runners": "Läufer",
|
"privacy": "Datenschutz",
|
||||||
"runners-are-being-imported": "Läufer:innen werden importiert ...",
|
"privacy-loading": "Datenschutzerklärung lädt...",
|
||||||
"runners-are-being-loaded": "Läufer:innen werden geladen ...",
|
"profile": "Profil",
|
||||||
"save": "Speichern",
|
"profile-deleted": "Profil gelöscht!",
|
||||||
"save-changes": "Änderungen speichern",
|
"profile-picture": "Profilbild",
|
||||||
"scan-added": "Scan hinzugefügt",
|
"profile-updated": "Profil wurde aktualisiert!",
|
||||||
"scan-is-being-updated": "Scan wird aktualisiert",
|
"read-license": "Lizenz-Text lesen",
|
||||||
"scan-with-fixed-distance": "Scan mit Festdistanz",
|
"receipt-needed": "Spendenquittung benötigt",
|
||||||
"scans": "Scans",
|
"repo_link": "Link",
|
||||||
"scans-are-being-loaded": "Scans werden geladen",
|
"request-a-new-reset-mail": "Neue Reset-Mail anfordern",
|
||||||
"scanstation": "Scanner Station",
|
"reset-my-password": "Passwort zurücksetzen",
|
||||||
"scanstation-added": "Station wurde erstellt",
|
"reset-password": "Passwort zurücksetzen",
|
||||||
"scanstation-is-being-added": "Scannerstation wird angelegt...",
|
"runner": "Läufer:in",
|
||||||
"scanstations": "Scanner Stationen",
|
"runner-added": "Läufer:in hinzugefügt",
|
||||||
"scanstations-are-being-loaded": "Scannerstationen werden geladen...",
|
"runner-import": "Läufer:innen Import",
|
||||||
"search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder Id)",
|
"runner-is-being-added": "Läufer:in wird hinzugefügt...",
|
||||||
"search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder Id)",
|
"runner-updated": "Läufer:in aktualisiert!",
|
||||||
"search-for-donor-name-or-id": "Suche eine Spender:in (via Name oder Id)",
|
"runnercards": "Laeuferkarten",
|
||||||
"search-for-permission": "Berechtigungen durchsuchen",
|
"runnerimport_verify_runners_org": "Bitte die Läufer:innen für den Import in die Organisation \"{org_name}\" bestätigen",
|
||||||
"search-for-runner-by-name-or-id": "Suche eine Läufer:in (via Name oder Id)",
|
"runners": "Läufer",
|
||||||
"select-all": "Alle auswählen",
|
"runners-are-being-imported": "Läufer:innen werden importiert ...",
|
||||||
"select-language": "Sprache auswählen",
|
"runners-are-being-loaded": "Läufer:innen werden geladen ...",
|
||||||
"selfservice-registration": "Selfservice Registrierung",
|
"save": "Speichern",
|
||||||
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
|
"save-changes": "Änderungen speichern",
|
||||||
"set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen",
|
"scan-added": "Scan hinzugefügt",
|
||||||
"settings": "Einstellungen",
|
"scan-is-being-updated": "Scan wird aktualisiert",
|
||||||
"settings-for-your-profile": "Die Einstellungen deines Accounts",
|
"scan-with-fixed-distance": "Scan mit Festdistanz",
|
||||||
"something-about-the-group": "Infos zur Gruppe",
|
"scans": "Scans",
|
||||||
"stats-are-being-loaded": "Die Statistiken werden geladen...",
|
"scans-are-being-loaded": "Scans werden geladen",
|
||||||
"status": "Status",
|
"scanstation": "Scanner Station",
|
||||||
"stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können",
|
"scanstation-added": "Station wurde erstellt",
|
||||||
"successful-password-reset": "Passwort erfolgreich zurückgesetzt!",
|
"scanstation-is-being-added": "Scannerstation wird angelegt...",
|
||||||
"team": "Team",
|
"scanstations": "Scanner Stationen",
|
||||||
"team-detail-is-being-loaded": "Team wird geladen...",
|
"scanstations-are-being-loaded": "Scannerstationen werden geladen...",
|
||||||
"team-name": "Teamname",
|
"search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder Id)",
|
||||||
"team-name-is-required": "Teamname ist erforderlich",
|
"search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder Id)",
|
||||||
"teams": "Teams",
|
"search-for-donor-name-or-id": "Suche eine Spender:in (via Name oder Id)",
|
||||||
"teams-are-being-loaded": "Teams werden geladen ...",
|
"search-for-permission": "Berechtigungen durchsuchen",
|
||||||
"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...",
|
"search-for-runner-by-name-or-id": "Suche eine Läufer:in (via Name oder Id)",
|
||||||
"the-scans-distance-must-be-greater-than-0m": "Die Distanz muss größer als 0m sein.",
|
"select-all": "Alle auswählen",
|
||||||
"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!",
|
"select-language": "Sprache auswählen",
|
||||||
"there-are-no-cards-yet": "Es gibt noch keine Läuferkarten.",
|
"selfservice-registration": "Selfservice Registrierung",
|
||||||
"there-are-no-contacts-added-yet": "Es wurden noch keine Kontakte hinzugefügt.",
|
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
|
||||||
"there-are-no-donations-yet": "Es gibt noch keine Sponsorings",
|
"set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen",
|
||||||
"there-are-no-donors-yet": "Es gibt noch keine Sponsor:innen",
|
"settings": "Einstellungen",
|
||||||
"there-are-no-groups-yet": "Es gibt noch keine Gruppen",
|
"settings-for-your-profile": "Die Einstellungen deines Accounts",
|
||||||
"there-are-no-organizations-added-yet": "Es wurden noch keine Organisationen hinzugefügt.",
|
"something-about-the-group": "Infos zur Gruppe",
|
||||||
"there-are-no-runners-added-yet": "Es wurden noch keine Läufer:innen hinzugefügt.",
|
"sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen",
|
||||||
"there-are-no-scans-yet": "Es gibt noch keine Scans",
|
"sponsorings": "Sponsoringerklaerungen",
|
||||||
"there-are-no-teams-added-yet": "Es wurden noch keine Teams hinzugefügt.",
|
"stats-are-being-loaded": "Die Statistiken werden geladen...",
|
||||||
"there-are-no-users-added-yet": "Es wurden noch keine Benutzer hinzugefügt.",
|
"status": "Status",
|
||||||
"this-card-is": "Diese Karte ist",
|
"stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können",
|
||||||
"this-might-take-a-moment": "Das könnte einen kleinen Moment dauern",
|
"successful-password-reset": "Passwort erfolgreich zurückgesetzt!",
|
||||||
"this-scanstation-is": "Diese Station ist",
|
"team": "Team",
|
||||||
"token": "Token",
|
"team-added": "Team wurde hinzugefügt",
|
||||||
"total-distance": "gelaufene Strecke",
|
"team-deleted": "Team gelöscht",
|
||||||
"total-donation-amount": "Gesamtbetrag",
|
"team-detail-is-being-loaded": "Team wird geladen...",
|
||||||
"total-donations": "Spendensumme",
|
"team-is-being-added": "Team wird erstellt...",
|
||||||
"total-scans": "gesamte Scans",
|
"team-name": "Teamname",
|
||||||
"track": "Track",
|
"team-name-is-required": "Teamname ist erforderlich",
|
||||||
"track-added": "Track hinzugefügt",
|
"teams": "Teams",
|
||||||
"track-data-is-being-loaded": "Trackdaten werden geladen",
|
"teams-are-being-loaded": "Teams werden geladen ...",
|
||||||
"track-is-being-added": "Track wird hinzugefügt...",
|
"the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "Die angegebene Telefonnummer ist nicht korrekt. <br /> Bitte gebe eine Telefonnummer im internationalen Format an...",
|
||||||
"track-length-in-m": "Tracklänge (in Metern)",
|
"the-scans-distance-must-be-greater-than-0m": "Die Distanz muss größer als 0m sein.",
|
||||||
"track-length-must-be-greater-than-0": "Die Länge muss größer als 0 (Meter) sein",
|
"the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "Der Scannerstation Token wird nur einmal angezeigt - du kannst ihn nicht ändern oder ihn dir nochmal anzeigen lassen!",
|
||||||
"track-name": "Trackname",
|
"there-are-no-cards-yet": "Es gibt noch keine Läuferkarten.",
|
||||||
"track-name-must-not-be-empty": "Der Name muss angegeben werden",
|
"there-are-no-contacts-added-yet": "Es wurden noch keine Kontakte hinzugefügt.",
|
||||||
"tracks": "Tracks",
|
"there-are-no-donations-yet": "Es gibt noch keine Sponsorings",
|
||||||
"update-password": "Passwort ändern",
|
"there-are-no-donors-yet": "Es gibt noch keine Sponsor:innen",
|
||||||
"updated-contact": "Kontakt aktualisiert!",
|
"there-are-no-groups-yet": "Es gibt noch keine Gruppen",
|
||||||
"updated-donor": "Sponsor:in wurde aktualisiert",
|
"there-are-no-organizations-added-yet": "Es wurden noch keine Organisationen hinzugefügt.",
|
||||||
"updated-organization": "Organisation wurde aktualisiert",
|
"there-are-no-runners-added-yet": "Es wurden noch keine Läufer:innen hinzugefügt.",
|
||||||
"updated-scan": "Scan wurde aktualisiert",
|
"there-are-no-scans-yet": "Es gibt noch keine Scans",
|
||||||
"updateing-group": "Gruppe wird aktualisiert...",
|
"there-are-no-teams-added-yet": "Es wurden noch keine Teams hinzugefügt.",
|
||||||
"updating-card": "Karte wird aktualisiert",
|
"there-are-no-users-added-yet": "Es wurden noch keine Benutzer hinzugefügt.",
|
||||||
"updating-organization": "Organisation wird aktualisiert",
|
"this-card-is": "Diese Karte ist",
|
||||||
"updating-permissions": "Berechtigungen werden aktualisiert...",
|
"this-might-take-a-moment": "Das könnte einen kleinen Moment dauern",
|
||||||
"updating-runner": "Läufer:in wird aktualisiert.",
|
"this-scanstation-is": "Diese Station ist",
|
||||||
"updating-user": "Benutzer:in wird aktualisiert...",
|
"token": "Token",
|
||||||
"updating-your-profile": "Profil wird aktualisiert...",
|
"total-distance": "gelaufene Strecke",
|
||||||
"user-added": "Benutzer hinzugefügt",
|
"total-donation-amount": "Gesamtbetrag",
|
||||||
"user-groups": "Benutzergruppen",
|
"total-donations": "Spendensumme",
|
||||||
"user-is-being-added": "Benutzer wird hinzugefügt ...",
|
"total-paid-amount": "Gezahlter Gesamtbetrag",
|
||||||
"user-updated": "Benutzer:in wurde aktualisiert",
|
"total-scans": "gesamte Scans",
|
||||||
"username": "Benutzername",
|
"total_donation_amount_in_eur": "Gesamtbetrag in €",
|
||||||
"users": "Benutzer",
|
"track": "Track",
|
||||||
"valid": "Gültig",
|
"track-added": "Track hinzugefügt",
|
||||||
"valid-city-is-required": "Du musst eine Stadt angeben",
|
"track-data-is-being-loaded": "Trackdaten werden geladen",
|
||||||
"valid-email-is-required": "Es wird eine valide E-Mail Adresse benötigt",
|
"track-is-being-added": "Track wird hinzugefügt...",
|
||||||
"valid-international-phone-number-is-required": "Du musst eine Telefonnummer im internationalen Format angeben...",
|
"track-is-being-updated": "Track wird aktualisiert...",
|
||||||
"valid-zipcode-postal-code-is-required": "Du musst eine valide Postleitzahl angeben",
|
"track-length-in-m": "Tracklänge (in Metern)",
|
||||||
"verfuegbare": "Verfügbar",
|
"track-length-must-be-greater-than-0": "Die Länge muss größer als 0 (Meter) sein",
|
||||||
"welcome_wavinghand": "Willkommen 👋",
|
"track-name": "Trackname",
|
||||||
"yes-i-copied-the-token": "Ja, ich habe den Token kopiert",
|
"track-name-must-not-be-empty": "Der Name muss angegeben werden",
|
||||||
"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!",
|
"track-was-updated": "Track wurde aktualisiert",
|
||||||
"you-can-now-use-your-new-password-to-log-in-to-your-account": "Du kannst dich jetzt mit deinem neuen Passwort anmelden! 🎉",
|
"tracks": "Tracks",
|
||||||
"you-can-provide-a-runner-but-you-dont-have-to": "Du kannst eine Läufer:in angeben, musst aber nicht.",
|
"unpaid": "Offen",
|
||||||
"you-dont-have-any-scanstations-yet": "Es gibt noch keine Scannerstationen",
|
"update-card": "Karte aktualisieren",
|
||||||
"you-have-to-provide-an-organization": "Du musst eine Organisation angeben",
|
"update-password": "Passwort ändern",
|
||||||
"you-have-to-save-your-changes-to-generate-a-link": "Du musst deine Änderungen speichern, um einen Link zu generieren.",
|
"updated-contact": "Kontakt aktualisiert!",
|
||||||
"you-must-create-at-least-one-card-or-cancel": "Du musst mindestens eine Blankokarte erstellen (oder abbrechen).",
|
"updated-donor": "Sponsor:in wurde aktualisiert",
|
||||||
"zip-postal-code": "Postleitzahl"
|
"updated-organization": "Organisation wurde aktualisiert",
|
||||||
}
|
"updated-scan": "Scan wurde aktualisiert",
|
||||||
|
"updated-team": "Team wurde aktualisiert",
|
||||||
|
"updateing-group": "Gruppe wird aktualisiert...",
|
||||||
|
"updating-card": "Karte wird aktualisiert",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
+475
-427
@@ -1,428 +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",
|
||||||
"change-your-password-here": "Change your password here",
|
"card-deleted": "Card deleted",
|
||||||
"changing-your-password": "Changing your password",
|
"card-updated": "Card updated",
|
||||||
"city": "City",
|
"cards": "Cards",
|
||||||
"click-to-copy-the-link-into-your-clipboard": "Click to copy the link into your clipboard",
|
"certificates": "Certificates",
|
||||||
"click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard",
|
"change-your-password-here": "Change your password here",
|
||||||
"close": "Close",
|
"changing-your-password": "Changing your password",
|
||||||
"code": "Code",
|
"city": "City",
|
||||||
"configure-the-tracks-and-minimum-lap-times": "configure the tracks & minimum lap times",
|
"click-to-copy-the-link-into-your-clipboard": "Click to copy the link into your clipboard",
|
||||||
"confirm": "Confirm",
|
"click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard",
|
||||||
"confirm-delete": "Confirm Delete",
|
"close": "Close",
|
||||||
"confirm-delete-donor-with-all-donations": "Confirm, delete donor with all donations",
|
"code": "Code",
|
||||||
"confirm-delete-my-user-profile": "Confirm, delete my user profile",
|
"configure-the-tracks-and-minimum-lap-times": "configure the tracks & minimum lap times",
|
||||||
"confirm-delete-organization-and-associated-teams-runners": "Confirm, delete organization and associated teams+runners.",
|
"confirm": "Confirm",
|
||||||
"confirm-delete-team-and-associated-runners": "Confirm, delete team and associated runners.",
|
"confirm-delete": "Confirm Delete",
|
||||||
"confirm-deletion": "Confirm Deletion",
|
"confirm-delete-donor-with-all-donations": "Confirm, delete donor with all donations",
|
||||||
"confirm-the-new-password": "Confirm the new password",
|
"confirm-delete-my-user-profile": "Confirm, delete my user profile",
|
||||||
"contact": "Contact",
|
"confirm-delete-organization-and-associated-teams-runners": "Confirm, delete organization and associated teams+runners.",
|
||||||
"contact-deleted": "Contact deleted",
|
"confirm-delete-team-and-associated-runners": "Confirm, delete team and associated runners.",
|
||||||
"contact-information": "Contact Information",
|
"confirm-deletion": "Confirm Deletion",
|
||||||
"contact-is-being-updated": "Contact is being updated...",
|
"confirm-the-new-password": "Confirm the new password",
|
||||||
"contact-is-not-a-member-in-any-group": "Contact is not a member in any group",
|
"contact": "Contact",
|
||||||
"contacts": "Contacts",
|
"contact-added": "Contact added",
|
||||||
"contacts-are-being-loaded": "contacts are being loaded...",
|
"contact-deleted": "Contact deleted",
|
||||||
"copied-link-to-clipboard": "Copied link to clipboard",
|
"contact-information": "Contact Information",
|
||||||
"copied-token-to-clipboard": "Copied token to clipboard",
|
"contact-is-being-added": "Contact is being added...",
|
||||||
"count_organizations": "# Organizations",
|
"contact-is-being-updated": "Contact is being updated...",
|
||||||
"count_teams": "# Teams",
|
"contact-is-not-a-member-in-any-group": "Contact is not a member in any group",
|
||||||
"create": "Create",
|
"contacts": "Contacts",
|
||||||
"create-a-new": "Create a new",
|
"contacts-are-being-loaded": "contacts are being loaded...",
|
||||||
"create-a-new-card": "Create a new card",
|
"copied-link-to-clipboard": "Copied link to clipboard",
|
||||||
"create-a-new-contact": "Create a new contact",
|
"copied-token-to-clipboard": "Copied token to clipboard",
|
||||||
"create-a-new-distance-donation": "Create a new distance donation",
|
"count_organizations": "# Organizations",
|
||||||
"create-a-new-donor": "Create a new donor",
|
"count_teams": "# Teams",
|
||||||
"create-a-new-fixed-donation": "Create a new fixed donation",
|
"create": "Create",
|
||||||
"create-a-new-organization": "Create a new Organization",
|
"create-a-new": "Create a new",
|
||||||
"create-a-new-runner": "Create a new Runner",
|
"create-a-new-card": "Create a new card",
|
||||||
"create-a-new-scan-fixed-only": "Create a new scan (fixed only)",
|
"create-a-new-contact": "Create a new contact",
|
||||||
"create-a-new-scanstation": "Create a new station",
|
"create-a-new-distance-donation": "Create a new distance donation",
|
||||||
"create-a-new-team": "Create a new team",
|
"create-a-new-donor": "Create a new donor",
|
||||||
"create-a-new-track": "Create a new Track",
|
"create-a-new-fixed-donation": "Create a new fixed donation",
|
||||||
"create-a-new-user": "Create a new User",
|
"create-a-new-organization": "Create a new Organization",
|
||||||
"create-a-new-user-group": "Create a new user group",
|
"create-a-new-runner": "Create a new Runner",
|
||||||
"create-and-generate-pdf": "Create and generate PDF",
|
"create-a-new-scan-fixed-only": "Create a new scan (fixed only)",
|
||||||
"create-bulk-blanco-cards": "Create bulk blanco cards",
|
"create-a-new-scanstation": "Create a new station",
|
||||||
"create-bulk-cards": "Add blanco cards",
|
"create-a-new-team": "Create a new team",
|
||||||
"create-organization": "Create Organization",
|
"create-a-new-track": "Create a new Track",
|
||||||
"create-team": "Create Team",
|
"create-a-new-user": "Create a new User",
|
||||||
"create-track": "Create Track",
|
"create-a-new-user-group": "Create a new user group",
|
||||||
"create-user": "Create User",
|
"create-and-generate-pdf": "Create and generate PDF",
|
||||||
"create-without-pdf": "Create without PDF",
|
"create-bulk-blanco-cards": "Create bulk blanco cards",
|
||||||
"created-blanco-cards": "Created blanco cards",
|
"create-bulk-cards": "Add blanco cards",
|
||||||
"creating-blanco-cards": "Creating blanco cards",
|
"create-organization": "Create Organization",
|
||||||
"credits": "Credits",
|
"create-team": "Create Team",
|
||||||
"csv_import__class": "Class",
|
"create-track": "Create Track",
|
||||||
"csv_import__firstname": "Firstname",
|
"create-user": "Create User",
|
||||||
"csv_import__lastname": "Lastname",
|
"create-without-pdf": "Create without PDF",
|
||||||
"csv_import__middlename": "Middlename",
|
"created-blanco-cards": "Created blanco cards",
|
||||||
"csv_import__team": "Team",
|
"creating-blanco-cards": "Creating blanco cards",
|
||||||
"danger-zone": "Danger zone",
|
"credits": "Credits",
|
||||||
"dashboard-greeting": "Hello",
|
"csv_import__class": "Class",
|
||||||
"dashboard-title": "Dashboard",
|
"csv_import__firstname": "Firstname",
|
||||||
"datatable": {
|
"csv_import__lastname": "Lastname",
|
||||||
"search": "🔍 Search...",
|
"csv_import__middlename": "Middlename",
|
||||||
"sort_column_ascending": "Sort column ascending",
|
"csv_import__team": "Team",
|
||||||
"sort_column_descending": "Sort column descending",
|
"danger-zone": "Danger zone",
|
||||||
"previous": "Previous",
|
"dashboard-greeting": "Hello",
|
||||||
"next": "Next",
|
"dashboard-title": "Dashboard",
|
||||||
"page": "Page",
|
"datatable": {
|
||||||
"showing": "Showing",
|
"search": "🔍 Search...",
|
||||||
"records": "Records",
|
"sort_column_ascending": "Sort column ascending",
|
||||||
"of": "of",
|
"sort_column_descending": "Sort column descending",
|
||||||
"to": "to",
|
"previous": "Previous",
|
||||||
"loading": "Loading...",
|
"next": "Next",
|
||||||
"no_matching_records_found": "No matching records found",
|
"page": "Page",
|
||||||
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
|
"showing": "Showing",
|
||||||
},
|
"records": "Records",
|
||||||
"delete": "Delete",
|
"of": "of",
|
||||||
"delete-contact": "Delete Contact",
|
"to": "to",
|
||||||
"delete-donation": "Delete Donation",
|
"loading": "Loading...",
|
||||||
"delete-donor": "Delete donor",
|
"no_matching_records_found": "No matching records found",
|
||||||
"delete-group": "Delete Group",
|
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
|
||||||
"delete-organization": "Delete Organization",
|
},
|
||||||
"delete-profile": "Delete Profile",
|
"delete": "Delete",
|
||||||
"delete-runner": "Delete Runner",
|
"delete-contact": "Delete Contact",
|
||||||
"delete-scan": "Delete scan",
|
"delete-donation": "Delete Donation",
|
||||||
"delete-station": "Delete station",
|
"delete-donor": "Delete donor",
|
||||||
"delete-team": "Delete Team",
|
"delete-group": "Delete Group",
|
||||||
"delete-user": "Delete User",
|
"delete-organization": "Delete Organization",
|
||||||
"deleted-scan": "Deleted scan",
|
"delete-profile": "Delete Profile",
|
||||||
"dependency_name": "Name",
|
"delete-runner": "Delete Runner",
|
||||||
"description": "description",
|
"delete-scan": "Delete scan",
|
||||||
"description-optional": "Description (optional)",
|
"delete-station": "Delete station",
|
||||||
"deselect-all": "deselect all",
|
"delete-team": "Delete Team",
|
||||||
"details": "Details",
|
"delete-user": "Delete User",
|
||||||
"disabled": "disabled",
|
"deleted-scan": "Deleted scan",
|
||||||
"distance": "Distance",
|
"dependency_name": "Name",
|
||||||
"distance-donation": "distance donation",
|
"description": "description",
|
||||||
"distance-in-km": "Distance in km",
|
"description-optional": "Description (optional)",
|
||||||
"distance-track": "Distance (+Track)",
|
"deselect-all": "deselect all",
|
||||||
"do-you-really-want-to-delete-your-profile": "Do you really want to delete your profile?",
|
"details": "Details",
|
||||||
"do-you-want-to-delete-the-organization-delete_org-name": "Do you want to delete the organization {orgname}?",
|
"disabled": "disabled",
|
||||||
"do-you-want-to-delete-the-team-delete_team-name": "Do you want to delete the team {teamname}?",
|
"distance": "Distance",
|
||||||
"do-you-want-to-delete-this-donor-with-all-related-donations": "Do you want to delete this donor with all related donations",
|
"distance-donation": "distance donation",
|
||||||
"documentation": "Documentation",
|
"distance-in-km": "Distance in km",
|
||||||
"donation-amount": "Donation amount",
|
"distance-track": "Distance (+Track)",
|
||||||
"donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€",
|
"do-you-really-want-to-delete-your-profile": "Do you really want to delete your profile?",
|
||||||
"donations": "Donations",
|
"do-you-want-to-delete-the-organization-delete_org-name": "Do you want to delete the organization {orgname}?",
|
||||||
"donor": "Donor",
|
"do-you-want-to-delete-the-team-delete_team-name": "Do you want to delete the team {teamname}?",
|
||||||
"donor-added": "Donor added",
|
"do-you-want-to-delete-this-donor-with-all-related-donations": "Do you want to delete this donor with all related donations",
|
||||||
"donor-deleted": "donor deleted",
|
"documentation": "Documentation",
|
||||||
"donor-has-no-associated-donations": "Donor has no associated donations.",
|
"donation-amount": "Donation amount",
|
||||||
"donor-is-being-added": "Donor is being added...",
|
"donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€",
|
||||||
"donor-is-being-updated": "Donor is being updated",
|
"donation-deleted": "Donation deleted",
|
||||||
"donors": "Donors",
|
"donation-updated": "Donation updated",
|
||||||
"donors-are-being-loaded": "donors are being loaded",
|
"donation_added": "Donation_added",
|
||||||
"dont-have-your-email-connected": "Don't have your email connected?",
|
"donations": "Donations",
|
||||||
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
|
"donor": "Donor",
|
||||||
"e-mail-adress": "E-Mail Adress",
|
"donor-added": "Donor added",
|
||||||
"edit": "Edit",
|
"donor-deleted": "donor deleted",
|
||||||
"edit-a-card": "Edit a card",
|
"donor-has-no-associated-donations": "Donor has no associated donations.",
|
||||||
"edit-permissions": "edit permissions",
|
"donor-is-being-added": "Donor is being added...",
|
||||||
"email_address_or_username": "Email / username",
|
"donor-is-being-updated": "Donor is being updated",
|
||||||
"enabled": "enabled",
|
"donors": "Donors",
|
||||||
"enabled_large": "Enabled",
|
"donors-are-being-loaded": "donors are being loaded",
|
||||||
"english": "English",
|
"dont-have-your-email-connected": "Don't have your email connected?",
|
||||||
"error-during-import": "Error during import",
|
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
|
||||||
"error-whyile-copying-to-clipboard": "Error while copying to clipboard",
|
"e-mail-adress": "E-Mail Adress",
|
||||||
"error_on_login": "Error on login",
|
"edit": "Edit",
|
||||||
"erteilte": "Directly granted",
|
"edit-a-card": "Edit a card",
|
||||||
"everything-concerning-your-profile": "Everything concerning your profile",
|
"edit-permissions": "edit permissions",
|
||||||
"everything-is-more-fun-together": "everything is more fun together 🏃♂️🏃♀️🏃♂️",
|
"email_address_or_username": "Email / username",
|
||||||
"faq": "FAQ",
|
"enabled": "enabled",
|
||||||
"filter-by-organization-team": "Filter by Organization/ Team",
|
"enabled_large": "Enabled",
|
||||||
"first-name": "First name",
|
"english": "English",
|
||||||
"first-name-is-required": "First Name is required",
|
"enter-payment": "Enter payment",
|
||||||
"first-scan-of-the-day": "First scan of the day.",
|
"error-during-import": "Error during import",
|
||||||
"fixed-donation": "fixed donation",
|
"error-whyile-copying-to-clipboard": "Error while copying to clipboard",
|
||||||
"forgot_password": "Forgot your password?",
|
"error_on_login": "Error on login",
|
||||||
"geerbte": "inherited",
|
"erteilte": "Directly granted",
|
||||||
"general-stats": "General Stats",
|
"everything-concerning-your-profile": "Everything concerning your profile",
|
||||||
"general_promise_error": "😢 Error",
|
"everything-is-more-fun-together": "everything is more fun together 🏃♂️🏃♀️🏃♂️",
|
||||||
"generate-runnercards": "Generate Runnercards",
|
"faq": "FAQ",
|
||||||
"generate-sponsoring-contract": "generate sponsoring contract",
|
"filename_sponsoringquittungsliste": "DonorReceiptList",
|
||||||
"generate-sponsoring-contracts": "generate sponsoring contracts",
|
"filter-by-organization-team": "Filter by Organization/ Team",
|
||||||
"generating-pdf": "generating PDF...",
|
"first-name": "First name",
|
||||||
"generating-pdfs": "generating PDFs...",
|
"first-name-is-required": "First Name is required",
|
||||||
"generic-ui-logic-error": "Something went wrong in the UI logic",
|
"first-scan-of-the-day": "First scan of the day.",
|
||||||
"german": "German",
|
"fixed-donation": "fixed donation",
|
||||||
"go-to-login": "Go To Login",
|
"forgot_password": "Forgot your password?",
|
||||||
"goback": "Go Home",
|
"geerbte": "inherited",
|
||||||
"granted": "granted",
|
"general-stats": "General Stats",
|
||||||
"group": "Group",
|
"general_promise_error": "😢 Error",
|
||||||
"group-added": "Group added",
|
"generate-runner-certificate": "Generate runner certificate",
|
||||||
"group-is-being-added": "Group is being added...",
|
"generate-runner-certificates": "Generate runner certificates",
|
||||||
"group-name-is-required": "Group name is required",
|
"generate-runnercards": "Generate Runnercards",
|
||||||
"group-updated": "group updated",
|
"generate-sponsoring-contract": "generate sponsoring contract",
|
||||||
"groups": "Groups",
|
"generate-sponsoring-contracts": "generate sponsoring contracts",
|
||||||
"groups-are-being-loaded": "Groups are being loaded",
|
"generating-pdf": "generating PDF...",
|
||||||
"home": "Home",
|
"generating-pdfs": "generating PDFs...",
|
||||||
"icon-image-credits": "We also want to thank these projects for illustrations and icons:",
|
"generic-ui-logic-error": "Something went wrong in the UI logic",
|
||||||
"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.",
|
"german": "German",
|
||||||
"import-finished": "Import finished",
|
"go-to-login": "Go To Login",
|
||||||
"import-runners": "Import runners",
|
"goback": "Go Home",
|
||||||
"import__target-organization": "Target Organization",
|
"granted": "granted",
|
||||||
"imprint": "Imprint",
|
"group": "Group",
|
||||||
"imprint-loading": "Imprint loading...",
|
"group-added": "Group added",
|
||||||
"inactive": "Inactive",
|
"group-is-being-added": "Group is being added...",
|
||||||
"installed-version": "Installed version",
|
"group-name-is-required": "Group name is required",
|
||||||
"internal-error": "Internal Error",
|
"group-updated": "group updated",
|
||||||
"invalid": "Invalid",
|
"groups": "Groups",
|
||||||
"invalid-mail-reset": "the provided email is invalid",
|
"groups-are-being-loaded": "Groups are being loaded",
|
||||||
"just-enter-how-many-you-want-and-the-system-will-create-them": "Just enter how many you want and the system will create them",
|
"home": "Home",
|
||||||
"laeufer-hinzufuegen": "Add runner",
|
"icon-image-credits": "We also want to thank these projects for illustrations and icons:",
|
||||||
"laeufer-importieren": "Läufer importieren",
|
"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.",
|
||||||
"laptime": "Laptime",
|
"import-finished": "Import finished",
|
||||||
"last-name": "Last name",
|
"import-runners": "Import runners",
|
||||||
"last-name-is-required": "Last Name is required",
|
"import__target-organization": "Target Organization",
|
||||||
"lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.",
|
"imprint": "Imprint",
|
||||||
"license": "License",
|
"imprint-loading": "Imprint loading...",
|
||||||
"licenses-are-being-loaded": "Licenses are being loaded...",
|
"inactive": "Inactive",
|
||||||
"loading-cards": "Loading cards",
|
"installed-version": "Installed version",
|
||||||
"loading-contact-details": "Loading contact details...",
|
"internal-error": "Internal Error",
|
||||||
"loading-donation-details": "Loading donation details",
|
"invalid": "Invalid",
|
||||||
"loading-donor-details": "Loading donor details",
|
"invalid-mail-reset": "the provided email is invalid",
|
||||||
"loading-group-detail": "Loading group detail...",
|
"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-profile-data": "Loading profile data",
|
"laeufer-hinzufuegen": "Add runner",
|
||||||
"loading-runners": "loading runners...",
|
"laeufer-importieren": "Läufer importieren",
|
||||||
"loading-station-details": "Loading station details",
|
"laptime": "Laptime",
|
||||||
"log_in": "Log in",
|
"last-name": "Last name",
|
||||||
"log_in_to_your_account": "Log in to your account",
|
"last-name-is-required": "Last Name is required",
|
||||||
"login_is_checked": "Login is being checked...",
|
"lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.",
|
||||||
"logout": "Logout",
|
"license": "License",
|
||||||
"mail-validation-in-progress": "mail validation in progress...",
|
"licenses-are-being-loaded": "Licenses are being loaded...",
|
||||||
"manage-admin-users": "manage admin users",
|
"loading-cards": "Loading cards",
|
||||||
"middle-name": "Middle name",
|
"loading-contact-details": "Loading contact details...",
|
||||||
"minimum-lap-time-in-s": "minimum lap time in s",
|
"loading-donation-details": "Loading donation details",
|
||||||
"minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0",
|
"loading-donor-details": "Loading donor details",
|
||||||
"must-be-at-least-10-characters-long": "Must be at least 10 characters long!",
|
"loading-group-detail": "Loading group detail...",
|
||||||
"must-contain-a-lowercase-letter": "Must contain a lowercase letter!",
|
"loading-profile-data": "Loading profile data",
|
||||||
"must-contain-a-number": "Must contain a number!",
|
"loading-runners": "loading runners...",
|
||||||
"must-contain-a-uppercase-letter": "Must contain a uppercase letter!",
|
"loading-station-details": "Loading station details",
|
||||||
"name": "Name",
|
"log_in": "Log in",
|
||||||
"name-is-required": "Name is required",
|
"log_in_to_your_account": "Log in to your account",
|
||||||
"new-password": "New password",
|
"login_is_checked": "Login is being checked...",
|
||||||
"no-contact-found": "No contacts found",
|
"logout": "Logout",
|
||||||
"no-contact-selected": "No contact selected",
|
"mail-validation-in-progress": "mail validation in progress...",
|
||||||
"no-contact-specified": "no contact specified",
|
"manage-admin-users": "manage admin users",
|
||||||
"no-donors-found": "No donors found",
|
"middle-name": "Middle name",
|
||||||
"no-license-text-could-be-found": "No license text could be found 😢",
|
"minimum-lap-time-in-s": "minimum lap time in s",
|
||||||
"no-organization-or-team-found": "No organization or team found",
|
"minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0",
|
||||||
"no-organization-specified": "no organization specified",
|
"must-be-at-least-10-characters-long": "Must be at least 10 characters long!",
|
||||||
"no-organizations-found": "No organizations found",
|
"must-contain-a-lowercase-letter": "Must contain a lowercase letter!",
|
||||||
"no-runners-found": "No runners found",
|
"must-contain-a-number": "Must contain a number!",
|
||||||
"no-tracks-added-yet": "there are no tracks added yet.",
|
"must-contain-a-uppercase-letter": "Must contain a uppercase letter!",
|
||||||
"non-blanko": "Non/Blanko",
|
"name": "Name",
|
||||||
"organization": "Organization",
|
"name-is-required": "Name is required",
|
||||||
"organization-added": "Organization added",
|
"new-password": "New password",
|
||||||
"organization-deleted": "Organization deleted",
|
"no-contact-found": "No contacts found",
|
||||||
"organization-detail-is-being-loaded": "organization detail is being loaded...",
|
"no-contact-selected": "No contact selected",
|
||||||
"organization-is-being-added": "Organization is being added...",
|
"no-contact-specified": "no contact specified",
|
||||||
"organization-name-is-required": "Organization name is required",
|
"no-donors-found": "No donors found",
|
||||||
"organizations": "Organizations",
|
"no-license-text-could-be-found": "No license text could be found 😢",
|
||||||
"organizations-are-being-loaded": "organizations are being loaded...",
|
"no-organization-or-team-found": "No organization or team found",
|
||||||
"orgs": "Organizations",
|
"no-organization-specified": "no organization specified",
|
||||||
"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!",
|
"no-organizations-found": "No organizations found",
|
||||||
"password": "Password",
|
"no-runners-found": "No runners found",
|
||||||
"password-changed": "Password changed!",
|
"no-tracks-added-yet": "there are no tracks added yet.",
|
||||||
"password-is-required": "Password is required",
|
"non-blanko": "Non/Blanko",
|
||||||
"password-reset-failed": "Password reset failed!",
|
"open": "OPEN",
|
||||||
"password-reset-in-progress": "Password Reset in Progress...",
|
"organization": "Organization",
|
||||||
"password-reset-mail-sent": "Password reset mail was sent to \"{usersEmail}\".",
|
"organization-added": "Organization added",
|
||||||
"password-reset-successful": "Password Reset successful!",
|
"organization-deleted": "Organization deleted",
|
||||||
"passwords-dont-match": "Passwords don't match!",
|
"organization-detail-is-being-loaded": "organization detail is being loaded...",
|
||||||
"pdf-generation-failed": "PDF generation failed!",
|
"organization-is-being-added": "Organization is being added...",
|
||||||
"pdf-successfully-generated": "PDF successfully generated!",
|
"organization-name-is-required": "Organization name is required",
|
||||||
"pdfs-successfully-generated": "PDFs successfully generated!",
|
"organizations": "Organizations",
|
||||||
"per-kilometer": "per Kilometer",
|
"organizations-are-being-loaded": "organizations are being loaded...",
|
||||||
"permissions": "Permissions",
|
"orgs": "Organizations",
|
||||||
"permissions-updated": "Permissions updated!",
|
"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!",
|
||||||
"phone": "Phone",
|
"paid": "PAID",
|
||||||
"please-copy-the-token-and-store-it-somewhere-save": "Please copy the token and store it somewhere safe.",
|
"paid-amount": "Paid amount",
|
||||||
"please-provide-a-password": "Please provide a password...",
|
"password": "Password",
|
||||||
"please-provide-the-nessecary-information-to-add-a-new-donor": "Please provide the nessecary information to add a new donor",
|
"password-changed": "Password changed!",
|
||||||
"please-provide-the-nessecary-information-to-create-a-new-donation": "Please provide the nessecary information to create a new donation",
|
"password-is-required": "Password is required",
|
||||||
"please-provide-the-nessecary-information-to-create-a-new-scan": "Please provide the nessecary information to create a new scan.",
|
"password-reset-failed": "Password reset failed!",
|
||||||
"please-provide-the-required-csv-xlsx-file": "Please provide the required csv/ xlsx file",
|
"password-reset-in-progress": "Password Reset in Progress...",
|
||||||
"please-provide-the-required-information-for-creating-a-new-user-group": "Please provide the required information for creating a new user group.",
|
"password-reset-mail-sent": "Password reset mail was sent to \"{usersEmail}\".",
|
||||||
"please-provide-the-required-information-to-add-a-new-contact": "Please provide the required information to add a new contact.",
|
"password-reset-successful": "Password Reset successful!",
|
||||||
"please-provide-the-required-information-to-add-a-new-organization": "Please provide the required information to add a new organization.",
|
"passwords-dont-match": "Passwords don't match!",
|
||||||
"please-provide-the-required-information-to-add-a-new-runner": "Please provide the required information to add a new runner.",
|
"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-team": "Please provide the required information to add a new team.",
|
"pdf-generation-failed": "PDF generation failed!",
|
||||||
"please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.",
|
"pdf-successfully-generated": "PDF successfully generated!",
|
||||||
"please-provide-the-required-information-to-add-a-new-user": "Please provide the required information to add a new user.",
|
"pdfs-successfully-generated": "PDFs successfully generated!",
|
||||||
"please-provide-the-required-information-to-create-a-new-scanstation": "Please provide the required information to create a new scanstation",
|
"per-kilometer": "per Kilometer",
|
||||||
"please-request-a-new-reset-mail": "Please request a new reset mail...",
|
"permissions": "Permissions",
|
||||||
"privacy": "Privacy",
|
"permissions-updated": "Permissions updated!",
|
||||||
"privacy-loading": "Privacy loading...",
|
"phone": "Phone",
|
||||||
"profile": "Profile",
|
"please-copy-the-token-and-store-it-somewhere-save": "Please copy the token and store it somewhere safe.",
|
||||||
"profile-picture": "Profile Picture",
|
"please-provide-a-password": "Please provide a password...",
|
||||||
"profile-updated": "Profile updated!",
|
"please-provide-the-nessecary-information-to-add-a-new-donor": "Please provide the nessecary information to add a new donor",
|
||||||
"read-license": "Read License",
|
"please-provide-the-nessecary-information-to-create-a-new-donation": "Please provide the nessecary information to create a new donation",
|
||||||
"receipt-needed": "Receipt needed",
|
"please-provide-the-nessecary-information-to-create-a-new-scan": "Please provide the nessecary information to create a new scan.",
|
||||||
"repo_link": "Link",
|
"please-provide-the-required-csv-xlsx-file": "Please provide the required csv/ xlsx file",
|
||||||
"request-a-new-reset-mail": "Request a new reset mail",
|
"please-provide-the-required-information-for-creating-a-new-user-group": "Please provide the required information for creating a new user group.",
|
||||||
"reset-my-password": "Reset my password",
|
"please-provide-the-required-information-to-add-a-new-contact": "Please provide the required information to add a new contact.",
|
||||||
"reset-password": "Reset your password",
|
"please-provide-the-required-information-to-add-a-new-organization": "Please provide the required information to add a new organization.",
|
||||||
"runner": "Runner",
|
"please-provide-the-required-information-to-add-a-new-runner": "Please provide the required information to add a new runner.",
|
||||||
"runner-added": "Runner added",
|
"please-provide-the-required-information-to-add-a-new-team": "Please provide the required information to add a new team.",
|
||||||
"runner-import": "Runner Import",
|
"please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.",
|
||||||
"runner-is-being-added": "Runner is being added...",
|
"please-provide-the-required-information-to-add-a-new-user": "Please provide the required information to add a new user.",
|
||||||
"runner-updated": "Runner updated!",
|
"please-provide-the-required-information-to-create-a-new-scanstation": "Please provide the required information to create a new scanstation",
|
||||||
"runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"",
|
"please-request-a-new-reset-mail": "Please request a new reset mail...",
|
||||||
"runners": "Runners",
|
"please-wait-a-moment-your-login-is-still-being-processed": "Please wait a moment, your login is still being processed",
|
||||||
"runners-are-being-imported": "Runners are being imported...",
|
"privacy": "Privacy",
|
||||||
"runners-are-being-loaded": "runners are being loaded...",
|
"privacy-loading": "Privacy loading...",
|
||||||
"save": "Save",
|
"profile": "Profile",
|
||||||
"save-changes": "Save Changes",
|
"profile-deleted": "Profile deleted!",
|
||||||
"scan-added": "Scan added",
|
"profile-picture": "Profile Picture",
|
||||||
"scan-is-being-updated": "Scan is being updated",
|
"profile-updated": "Profile updated!",
|
||||||
"scan-with-fixed-distance": "Scan with fixed distance",
|
"read-license": "Read License",
|
||||||
"scans": "Scans",
|
"receipt-needed": "Receipt needed",
|
||||||
"scans-are-being-loaded": "Scans are being loaded",
|
"repo_link": "Link",
|
||||||
"scanstation": "Scanstation",
|
"request-a-new-reset-mail": "Request a new reset mail",
|
||||||
"scanstation-added": "Scanstation added",
|
"reset-my-password": "Reset my password",
|
||||||
"scanstation-is-being-added": "Adding scanstation...",
|
"reset-password": "Reset your password",
|
||||||
"scanstations": "Scanstations",
|
"runner": "Runner",
|
||||||
"scanstations-are-being-loaded": "Loading scanstations...",
|
"runner-added": "Runner added",
|
||||||
"search-for-an-organization-by-name-or-id": "Search for an organization (by name or id)",
|
"runner-import": "Runner Import",
|
||||||
"search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or id)",
|
"runner-is-being-added": "Runner is being added...",
|
||||||
"search-for-donor-name-or-id": "Search for donor (by name or id)",
|
"runner-updated": "Runner updated!",
|
||||||
"search-for-permission": "Search for permission",
|
"runnercards": "Runnercards",
|
||||||
"search-for-runner-by-name-or-id": "Search for runner (by name or id)",
|
"runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"",
|
||||||
"select-all": "select all",
|
"runners": "Runners",
|
||||||
"select-language": "Select language",
|
"runners-are-being-imported": "Runners are being imported...",
|
||||||
"selfservice-registration": "Selfservice registration",
|
"runners-are-being-loaded": "runners are being loaded...",
|
||||||
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
"save": "Save",
|
||||||
"set-the-user-active-inactive": "set the user active/ inactive",
|
"save-changes": "Save Changes",
|
||||||
"settings": "Settings",
|
"scan-added": "Scan added",
|
||||||
"settings-for-your-profile": "Settings for your profile",
|
"scan-is-being-updated": "Scan is being updated",
|
||||||
"something-about-the-group": "Something about the group...",
|
"scan-with-fixed-distance": "Scan with fixed distance",
|
||||||
"stats-are-being-loaded": "stats are being loaded...",
|
"scans": "Scans",
|
||||||
"status": "Status",
|
"scans-are-being-loaded": "Scans are being loaded",
|
||||||
"stuff-that-could-harm-your-profile": "Stuff that could harm your profile",
|
"scanstation": "Scanstation",
|
||||||
"successful-password-reset": "Successful password reset!",
|
"scanstation-added": "Scanstation added",
|
||||||
"team": "Team",
|
"scanstation-is-being-added": "Adding scanstation...",
|
||||||
"team-detail-is-being-loaded": "team detail is being loaded...",
|
"scanstations": "Scanstations",
|
||||||
"team-name": "Team name",
|
"scanstations-are-being-loaded": "Loading scanstations...",
|
||||||
"team-name-is-required": "team name is required",
|
"search-for-an-organization-by-name-or-id": "Search for an organization (by name or id)",
|
||||||
"teams": "Teams",
|
"search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or id)",
|
||||||
"teams-are-being-loaded": "teams are being loaded...",
|
"search-for-donor-name-or-id": "Search for donor (by name or id)",
|
||||||
"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...",
|
"search-for-permission": "Search for permission",
|
||||||
"the-scans-distance-must-be-greater-than-0m": "The scan's distance must be greater than 0m",
|
"search-for-runner-by-name-or-id": "Search for runner (by name or id)",
|
||||||
"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!",
|
"select-all": "select all",
|
||||||
"there-are-no-cards-yet": "There are no cards yet.",
|
"select-language": "Select language",
|
||||||
"there-are-no-contacts-added-yet": "There are no contacts added yet.",
|
"selfservice-registration": "Selfservice registration",
|
||||||
"there-are-no-donations-yet": "There are no donations yet",
|
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
||||||
"there-are-no-donors-yet": "There are no donors yet",
|
"set-the-user-active-inactive": "set the user active/ inactive",
|
||||||
"there-are-no-groups-yet": "There are no groups yet",
|
"settings": "Settings",
|
||||||
"there-are-no-organizations-added-yet": "There are no organizations added yet.",
|
"settings-for-your-profile": "Settings for your profile",
|
||||||
"there-are-no-runners-added-yet": "There are no runners added yet.",
|
"something-about-the-group": "Something about the group...",
|
||||||
"there-are-no-scans-yet": "There are no scans yet",
|
"sponsoring-quittungs-liste_herunterladen": "Download donor receipt list",
|
||||||
"there-are-no-teams-added-yet": "There are no teams added yet.",
|
"sponsorings": "Sponsorings",
|
||||||
"there-are-no-users-added-yet": "There are no users added yet.",
|
"stats-are-being-loaded": "stats are being loaded...",
|
||||||
"this-card-is": "This card is",
|
"status": "Status",
|
||||||
"this-might-take-a-moment": "This might take a moment 👀",
|
"stuff-that-could-harm-your-profile": "Stuff that could harm your profile",
|
||||||
"this-scanstation-is": "This scanstation is",
|
"successful-password-reset": "Successful password reset!",
|
||||||
"token": "Token",
|
"team": "Team",
|
||||||
"total-distance": "total distance",
|
"team-added": "Team added",
|
||||||
"total-donation-amount": "total donation amount",
|
"team-deleted": "Team deleted",
|
||||||
"total-donations": "total donations",
|
"team-detail-is-being-loaded": "team detail is being loaded...",
|
||||||
"total-scans": "total scans",
|
"team-is-being-added": "Team is being added...",
|
||||||
"track": "Track",
|
"team-name": "Team name",
|
||||||
"track-added": "Track added",
|
"team-name-is-required": "team name is required",
|
||||||
"track-data-is-being-loaded": "Track data is being loaded",
|
"teams": "Teams",
|
||||||
"track-is-being-added": "Track is being added...",
|
"teams-are-being-loaded": "teams are being loaded...",
|
||||||
"track-length-in-m": "Track Length in m",
|
"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-length-must-be-greater-than-0": "Track length must be greater than 0",
|
"the-scans-distance-must-be-greater-than-0m": "The scan's distance must be greater than 0m",
|
||||||
"track-name": "Track name",
|
"the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again": "The scanstation api token will only get displayed once - you won't be able to change or view it again!",
|
||||||
"track-name-must-not-be-empty": "Track name must not be empty",
|
"there-are-no-cards-yet": "There are no cards yet.",
|
||||||
"tracks": "Tracks",
|
"there-are-no-contacts-added-yet": "There are no contacts added yet.",
|
||||||
"update-card": "Update Card",
|
"there-are-no-donations-yet": "There are no donations yet",
|
||||||
"update-password": "Update password",
|
"there-are-no-donors-yet": "There are no donors yet",
|
||||||
"updated-contact": "Updated contact!",
|
"there-are-no-groups-yet": "There are no groups yet",
|
||||||
"updated-donor": "updated donor",
|
"there-are-no-organizations-added-yet": "There are no organizations added yet.",
|
||||||
"updated-organization": "updated organization",
|
"there-are-no-runners-added-yet": "There are no runners added yet.",
|
||||||
"updated-scan": "updated scan",
|
"there-are-no-scans-yet": "There are no scans yet",
|
||||||
"updateing-group": "updateing group...",
|
"there-are-no-teams-added-yet": "There are no teams added yet.",
|
||||||
"updating-card": "Updating card",
|
"there-are-no-users-added-yet": "There are no users added yet.",
|
||||||
"updating-organization": "updating organization",
|
"this-card-is": "This card is",
|
||||||
"updating-permissions": "updating permissions...",
|
"this-might-take-a-moment": "This might take a moment 👀",
|
||||||
"updating-runner": "Updating runner...",
|
"this-scanstation-is": "This scanstation is",
|
||||||
"updating-user": "updating user...",
|
"token": "Token",
|
||||||
"updating-your-profile": "Updating your profile...",
|
"total-distance": "total distance",
|
||||||
"user-added": "User added",
|
"total-donation-amount": "total donation amount",
|
||||||
"user-groups": "User Groups",
|
"total-donations": "total donations",
|
||||||
"user-is-being-added": "User is being added...",
|
"total-paid-amount": "Total paid amount",
|
||||||
"user-updated": "User updated",
|
"total-scans": "total scans",
|
||||||
"username": "Username",
|
"total_donation_amount_in_eur": "Total donation amount in €",
|
||||||
"users": "Users",
|
"track": "Track",
|
||||||
"valid": "Valid",
|
"track-added": "Track added",
|
||||||
"valid-city-is-required": "Valid city is required",
|
"track-data-is-being-loaded": "Track data is being loaded",
|
||||||
"valid-email-is-required": "valid email is required",
|
"track-is-being-added": "Track is being added...",
|
||||||
"valid-international-phone-number-is-required": "valid international phone number is required...",
|
"track-is-being-updated": "Track is being updated...",
|
||||||
"valid-zipcode-postal-code-is-required": "Valid zipcode/ postal code is required",
|
"track-length-in-m": "Track Length in m",
|
||||||
"verfuegbare": "availdable",
|
"track-length-must-be-greater-than-0": "Track length must be greater than 0",
|
||||||
"welcome_wavinghand": "Welcome 👋",
|
"track-name": "Track name",
|
||||||
"yes-i-copied-the-token": "Yes, I copied the token",
|
"track-name-must-not-be-empty": "Track name must not be empty",
|
||||||
"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!",
|
"track-was-updated": "Track was updated!",
|
||||||
"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! 🎉",
|
"tracks": "Tracks",
|
||||||
"you-can-provide-a-runner-but-you-dont-have-to": "You can provide a runner, but you don't have to.",
|
"unpaid": "Unpaid",
|
||||||
"you-dont-have-any-scanstations-yet": "You don't have any scanstations yet",
|
"update-card": "Update Card",
|
||||||
"you-have-to-provide-an-organization": "You have to provide an organization",
|
"update-password": "Update password",
|
||||||
"you-have-to-save-your-changes-to-generate-a-link": "You have to save your changes to generate a link.",
|
"updated-contact": "Updated contact!",
|
||||||
"you-must-create-at-least-one-card-or-cancel": "You must create at least one card (or cancel).",
|
"updated-donor": "updated donor",
|
||||||
"zip-postal-code": "ZIP/ postal code"
|
"updated-organization": "updated organization",
|
||||||
}
|
"updated-scan": "updated scan",
|
||||||
|
"updated-team": "Updated team",
|
||||||
|
"updateing-group": "updateing group...",
|
||||||
|
"updating-card": "Updating card",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import './style.css';
|
||||||
|
import "toastify-js/src/toastify.css";
|
||||||
|
import "gridjs/dist/theme/mermaid.css";
|
||||||
|
import App from './App.svelte';
|
||||||
|
|
||||||
|
const app = new App({
|
||||||
|
target: document.body
|
||||||
|
});
|
||||||
|
export default app;
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
export const register = () => {
|
|
||||||
if ('serviceWorker' in navigator) {
|
|
||||||
window.addEventListener('load', () => {
|
|
||||||
navigator.serviceWorker.register('/sw.js').then(
|
|
||||||
(registration) => {
|
|
||||||
// console.log(`sw successful with scope: ${registration.scope}`);
|
|
||||||
},
|
|
||||||
(err) => {
|
|
||||||
// console.log(`sw failed: ${err}`);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
+10
-9
@@ -1,14 +1,15 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
purge: {
|
mode: 'jit',
|
||||||
content: [ './src/**/*.svelte' ]
|
purge: [ './src/**/*.svelte' ],
|
||||||
},
|
|
||||||
// darkMode: 'media',
|
|
||||||
variants: {},
|
|
||||||
plugins: [],
|
|
||||||
theme: {
|
theme: {
|
||||||
container: {
|
extend: {
|
||||||
center: true,
|
colors: {
|
||||||
padding: '1.5rem'
|
reepolee: {
|
||||||
|
500: '#b40000',
|
||||||
|
600: '#9c0000',
|
||||||
|
700: '#750000'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
const fs = require('fs');
|
|
||||||
let content_svelteconfig = fs.readFileSync('./s-config.template.js', { encoding: 'utf8' });
|
|
||||||
let content_html = fs.readFileSync('./index.template.html', { encoding: 'utf8' });
|
|
||||||
if (process.env.NODE_ENV_ODIT == 'development_fast') {
|
|
||||||
content_html = content_html.replace(
|
|
||||||
'__TAILWIND_INSERT__',
|
|
||||||
'<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tailwindcss@2.0.2/dist/tailwind.min.css">'
|
|
||||||
);
|
|
||||||
content_svelteconfig = content_svelteconfig.replace('__insert__', '{postcss:{}}');
|
|
||||||
} else {
|
|
||||||
content_html = content_html.replace('__TAILWIND_INSERT__', '');
|
|
||||||
content_svelteconfig = content_svelteconfig.replace(
|
|
||||||
'__insert__',
|
|
||||||
"{postcss:{plugins:[require('tailwindcss'),require('autoprefixer')]}}"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
fs.writeFileSync('./public/index.html', content_html);
|
|
||||||
fs.writeFileSync('./svelte.config.js', content_svelteconfig);
|
|
||||||
console.info('dev setup script done');
|
|
||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const package = JSON.parse(fs.readFileSync(`./package.json`, { encoding: 'utf-8' }));
|
const package = JSON.parse(fs.readFileSync(`./package.json`, { encoding: 'utf-8' }));
|
||||||
const original = fs.readFileSync(`./index.template.html`, { encoding: 'utf-8' });
|
const original = fs.readFileSync(`./index.html`, { encoding: 'utf-8' });
|
||||||
let out = original.replace(/RELEASE_INFO-(\S)+-RELEASE_INFO/gi, 'RELEASE_INFO-' + package.version + '-RELEASE_INFO');
|
let out = original.replace(/RELEASE_INFO-(\S)+-RELEASE_INFO/gi, 'RELEASE_INFO-' + package.version + '-RELEASE_INFO');
|
||||||
fs.writeFileSync(`./index.template.html`, out);
|
fs.writeFileSync(`./index.html`, out);
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
import svelte from '@sveltejs/vite-plugin-svelte';
|
||||||
|
import { minify } from 'html-minifier';
|
||||||
|
import { defineConfig } from 'vite';
|
||||||
|
//
|
||||||
|
const indexReplace = () => {
|
||||||
|
return {
|
||||||
|
name: 'html-transform',
|
||||||
|
transformIndexHtml(html) {
|
||||||
|
return minify(html, {
|
||||||
|
collapseWhitespace: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default defineConfig(({ command, mode }) => {
|
||||||
|
const isProduction = mode === 'production';
|
||||||
|
return {
|
||||||
|
// base: './',
|
||||||
|
build: {
|
||||||
|
polyfillDynamicImport: false,
|
||||||
|
cssCodeSplit: false,
|
||||||
|
minify: isProduction
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
svelte({
|
||||||
|
//@ts-ignore
|
||||||
|
hot: !isProduction,
|
||||||
|
emitCss: true,
|
||||||
|
extensions: [ '.md', '.svx', '.svelte' ],
|
||||||
|
preprocess: [
|
||||||
|
//
|
||||||
|
]
|
||||||
|
}),
|
||||||
|
indexReplace()
|
||||||
|
]
|
||||||
|
};
|
||||||
|
});
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
globDirectory: 'public',
|
|
||||||
globPatterns: [ '**/*.{js,ico,png,svg,html,webmanifest,txt,json}' ],
|
|
||||||
globIgnores: [ 'env.js', 'env.sample.js' ],
|
|
||||||
swDest: 'public/sw.js',
|
|
||||||
cleanupOutdatedCaches: true,
|
|
||||||
mode: 'production',
|
|
||||||
sourcemap: false
|
|
||||||
};
|
|
||||||
Reference in new issue
Block a user