Compare commits
5 Commits
dev
...
feature/sp
Author | SHA1 | Date | |
---|---|---|---|
c3226c37c9 | |||
210140fd67 | |||
35e58d233e | |||
a09bf31e22 | |||
7c31fba83a |
@ -14,7 +14,7 @@ jobs:
|
|||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 19
|
node-version: 19
|
||||||
- run: npm i -g pnpm@10.8 && pnpm i
|
- run: npm i -g pnpm@10.7 && pnpm i
|
||||||
- run: pnpm licenses:export
|
- run: pnpm licenses:export
|
||||||
- name: Login to registry
|
- name: Login to registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
|
306
CHANGELOG.md
306
CHANGELOG.md
@ -2,315 +2,9 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
#### [1.14.2](https://git.odit.services/lfk/frontend/compare/1.14.1...1.14.2)
|
|
||||||
|
|
||||||
- feat(GenerateRunnerCertificates): support skipping runners without scans [`5a7bc23`](https://git.odit.services/lfk/frontend/commit/5a7bc239d2f93ced9ebdc5b113fe27d0d8d3899c)
|
|
||||||
|
|
||||||
#### [1.14.1](https://git.odit.services/lfk/frontend/compare/1.14.0...1.14.1)
|
|
||||||
|
|
||||||
> 26 May 2025
|
|
||||||
|
|
||||||
- fix: ensure numeric values are parsed as integers in DocumentServer methods [`1b088b8`](https://git.odit.services/lfk/frontend/commit/1b088b87bf6e67796c2509d9c21f21833cb4df0f)
|
|
||||||
- chore(release): 1.14.1 [`661a698`](https://git.odit.services/lfk/frontend/commit/661a698fbaeb2432bec758ed632a520676ae86b2)
|
|
||||||
|
|
||||||
#### [1.14.0](https://git.odit.services/lfk/frontend/compare/1.13.5...1.14.0)
|
|
||||||
|
|
||||||
> 20 May 2025
|
|
||||||
|
|
||||||
- wip [`564a971`](https://git.odit.services/lfk/frontend/commit/564a971c63403af2e2eb550db814519576d62023)
|
|
||||||
- wip [`50b5e4e`](https://git.odit.services/lfk/frontend/commit/50b5e4e455ce705fc5ef7f3d069d88c9ff48a6af)
|
|
||||||
- wip [`2c91f46`](https://git.odit.services/lfk/frontend/commit/2c91f463758c8452561fbcc5dad8412edba8915d)
|
|
||||||
- wip [`1386b80`](https://git.odit.services/lfk/frontend/commit/1386b80d0c8569cf127f8235b3dd249c2775594a)
|
|
||||||
- wip [`6ef6dc0`](https://git.odit.services/lfk/frontend/commit/6ef6dc007837c237273a29ca489ef0cdb92f7c6c)
|
|
||||||
- wip [`3709881`](https://git.odit.services/lfk/frontend/commit/370988117683ab1fdc149a30f920cc6a66575c7a)
|
|
||||||
- chore(release): 1.14.0 [`d5fecd3`](https://git.odit.services/lfk/frontend/commit/d5fecd3f31916b80c305d76f37c4600f1d242eba)
|
|
||||||
- wip [`77413c7`](https://git.odit.services/lfk/frontend/commit/77413c7e5350a1d8643d2baf135b531235f78e64)
|
|
||||||
- wip [`0cb1193`](https://git.odit.services/lfk/frontend/commit/0cb1193269912b047abfacb6012463093c2adcfa)
|
|
||||||
- wip [`9ef3435`](https://git.odit.services/lfk/frontend/commit/9ef34359d8ac32674c28825b91b6aa2877e63552)
|
|
||||||
- wip [`a00af08`](https://git.odit.services/lfk/frontend/commit/a00af08b3f7c8278cfc54af6f593a9dcf4509ab4)
|
|
||||||
- wip [`286bd61`](https://git.odit.services/lfk/frontend/commit/286bd614976dcf8bcb14cffd092f23ef65393917)
|
|
||||||
- wip [`b89d4f2`](https://git.odit.services/lfk/frontend/commit/b89d4f248c5575548d77336832c64dc6e395efc3)
|
|
||||||
- inputElementID param [`4d79589`](https://git.odit.services/lfk/frontend/commit/4d79589903bb0726f6bcb2c0e5089a9e20f7db17)
|
|
||||||
- wip [`53f5fa3`](https://git.odit.services/lfk/frontend/commit/53f5fa3988e81215e17e41b7dd92e9ddf897610a)
|
|
||||||
- wip [`444b1f5`](https://git.odit.services/lfk/frontend/commit/444b1f537016b303a57fcaaac4468a749fe4f33c)
|
|
||||||
- disable autocomplete [`72e5425`](https://git.odit.services/lfk/frontend/commit/72e5425c0847102b0ed3f88abe17dc22ccea0a30)
|
|
||||||
|
|
||||||
#### [1.13.5](https://git.odit.services/lfk/frontend/compare/1.13.4...1.13.5)
|
|
||||||
|
|
||||||
> 20 May 2025
|
|
||||||
|
|
||||||
- add missing cursor-pointer [`6500839`](https://git.odit.services/lfk/frontend/commit/650083965a35cf3b05b6b67389ff8035dc5fa3fa)
|
|
||||||
- refactor(DonationsOverview): drop checkboxes - they dont do anything [`06d22c9`](https://git.odit.services/lfk/frontend/commit/06d22c929f94587d9bdbcb4abfc0a770cf94a771)
|
|
||||||
- chore(release): 1.13.5 [`e2a1c9a`](https://git.odit.services/lfk/frontend/commit/e2a1c9a508c6061e55438afefcd641e3d9423aaa)
|
|
||||||
|
|
||||||
#### [1.13.4](https://git.odit.services/lfk/frontend/compare/1.13.3...1.13.4)
|
|
||||||
|
|
||||||
> 20 May 2025
|
|
||||||
|
|
||||||
- feat(donationcreate): improved focus handling [`a827279`](https://git.odit.services/lfk/frontend/commit/a82727916345c7e713d4225c4771ef3f23d1392c)
|
|
||||||
- chore(release): 1.13.4 [`bbf659e`](https://git.odit.services/lfk/frontend/commit/bbf659e52d249732fadb659fdbd24a89d2e8ec42)
|
|
||||||
- chore(deps): remove unused [`3842d8b`](https://git.odit.services/lfk/frontend/commit/3842d8b1048ce12f0f70bf3d0530590470f0d200)
|
|
||||||
- fix(donationcreate): clearing [`9298a0d`](https://git.odit.services/lfk/frontend/commit/9298a0dc922ee5ed5b7c9017c865ad4b68fca3c8)
|
|
||||||
- feat(donationcreate): autofocus runner input on page load [`b9e2e65`](https://git.odit.services/lfk/frontend/commit/b9e2e653310c686bc06b9f27c38b49e9c6a3eaef)
|
|
||||||
- fix(DonationCreate): remove duplicate spaces from getRunnerLabel [`30a26ef`](https://git.odit.services/lfk/frontend/commit/30a26ef3ed55d072cd9bf2aea1b200fadc2a05f1)
|
|
||||||
- fix(donationcreate): improved resetAll [`7d9314f`](https://git.odit.services/lfk/frontend/commit/7d9314f05c58c1b50901f3797c0b461c4c79e5d2)
|
|
||||||
- fix(DeleteDonationModal): cannot overflow [`ca066aa`](https://git.odit.services/lfk/frontend/commit/ca066aa7a7a8d7c46e0f59370b06636faf5736ca)
|
|
||||||
- feat(donationcreate): full width [`b0063cd`](https://git.odit.services/lfk/frontend/commit/b0063cdead5f71c334c36e5587a58e957825dbcd)
|
|
||||||
- feat(donationcreate): add runner id to select [`27e7bbb`](https://git.odit.services/lfk/frontend/commit/27e7bbb9d142fbea659e89fb2335cc6c567d14ce)
|
|
||||||
|
|
||||||
#### [1.13.3](https://git.odit.services/lfk/frontend/compare/1.13.2...1.13.3)
|
|
||||||
|
|
||||||
> 19 May 2025
|
|
||||||
|
|
||||||
- chore(release): 1.13.3 [`2139b19`](https://git.odit.services/lfk/frontend/commit/2139b197ba672275e2a0b5ffbcf7fa43f80874e6)
|
|
||||||
- Refactor code structure for improved readability and maintainability [`e3c6d5a`](https://git.odit.services/lfk/frontend/commit/e3c6d5a5c0eaac2c91432b0be37d6fa11e57f644)
|
|
||||||
- refactor(donation): Refactor donor selection and add new donor creation functionality [`8c3f009`](https://git.odit.services/lfk/frontend/commit/8c3f0092d2735b1c85976f4e6955780b1035f68a)
|
|
||||||
- fix(donation): Ensure all selections are cleared on reset [`4e1a944`](https://git.odit.services/lfk/frontend/commit/4e1a944a2d7d0d0666fb8d2181a9941d0f11957f)
|
|
||||||
|
|
||||||
#### [1.13.2](https://git.odit.services/lfk/frontend/compare/1.13.1...1.13.2)
|
|
||||||
|
|
||||||
> 16 May 2025
|
|
||||||
|
|
||||||
- chore(release): 1.13.2 [`6fad04c`](https://git.odit.services/lfk/frontend/commit/6fad04c86249613dacfe2bc75362cb32d109573d)
|
|
||||||
- feat(dashboard): Add permission checks for scan and donation creation links [`838dcbf`](https://git.odit.services/lfk/frontend/commit/838dcbfd7e0c09e8cf61a04952475934ad1e3b86)
|
|
||||||
|
|
||||||
#### [1.13.1](https://git.odit.services/lfk/frontend/compare/1.13.0...1.13.1)
|
|
||||||
|
|
||||||
> 16 May 2025
|
|
||||||
|
|
||||||
- chore(release): 1.13.1 [`f5df252`](https://git.odit.services/lfk/frontend/commit/f5df252857f20f8426b8ca566b9bb3ec50331880)
|
|
||||||
- feat(tools): Remove unnecessary validation display in donation creation [`285fc91`](https://git.odit.services/lfk/frontend/commit/285fc91c66d03aaa861da549cb739c3698beb892)
|
|
||||||
|
|
||||||
#### [1.13.0](https://git.odit.services/lfk/frontend/compare/1.12.8...1.13.0)
|
|
||||||
|
|
||||||
> 16 May 2025
|
|
||||||
|
|
||||||
- feat(tools): Basic mobile scanner [`500886e`](https://git.odit.services/lfk/frontend/commit/500886e4106f4b53fbc40fb0fa15653f574c8328)
|
|
||||||
- chore(release): 1.13.0 [`d95b6cf`](https://git.odit.services/lfk/frontend/commit/d95b6cf5894dd0b487353f36c9f3a436066fd4ef)
|
|
||||||
- feat(tools): Added tool for fast sponsoring creation [`51ba1c8`](https://git.odit.services/lfk/frontend/commit/51ba1c852cad6243e935409da1eacecc5dcfa5fa)
|
|
||||||
- feat(dev): Enable devserver with https-support to circumvent ios https requirements for camera access [`25c38ea`](https://git.odit.services/lfk/frontend/commit/25c38ea3812a529a90294ff8834bdb65c487f8c4)
|
|
||||||
- feat(tools): Remove requirement for ten-diget codes [`80ca7aa`](https://git.odit.services/lfk/frontend/commit/80ca7aa08bdd44591e2d3efaa8e59dd4db5c864e)
|
|
||||||
- feat(dashboard): Added scanclient tool to dashboard [`06cfd60`](https://git.odit.services/lfk/frontend/commit/06cfd603cae79e0237bbece43203083f198d03a1)
|
|
||||||
|
|
||||||
#### [1.12.8](https://git.odit.services/lfk/frontend/compare/1.12.7...1.12.8)
|
|
||||||
|
|
||||||
> 1 May 2025
|
|
||||||
|
|
||||||
- chore(release): 1.12.8 [`51d9b35`](https://git.odit.services/lfk/frontend/commit/51d9b35dc41fea0d0245fd136556f9fada3559da)
|
|
||||||
- feat(dasboard): Added section headers to main nav [`3a8533a`](https://git.odit.services/lfk/frontend/commit/3a8533a7baef02f7bc9780ce37be1a350bd92270)
|
|
||||||
- fic(locales): Updated dashboard translations [`5ac6fe3`](https://git.odit.services/lfk/frontend/commit/5ac6fe30b5b9e34043c734d51d5da137fdf7ac38)
|
|
||||||
- feat(runners): Created_via filters can now be set via query params [`14501d3`](https://git.odit.services/lfk/frontend/commit/14501d3828dd0d48ba0baeeddf936ba275f7b9b7)
|
|
||||||
- refactor(tools): Move tools to tools route [`16dc789`](https://git.odit.services/lfk/frontend/commit/16dc789db5d9ea41774c77622a579cc0d9bd95f2)
|
|
||||||
- refactor(tools): Move tools into shared directory instead of the non-descript "general" [`e4f9b1a`](https://git.odit.services/lfk/frontend/commit/e4f9b1a60551d7955def4d068d534cf17b1ea640)
|
|
||||||
|
|
||||||
#### [1.12.7](https://git.odit.services/lfk/frontend/compare/1.12.6...1.12.7)
|
|
||||||
|
|
||||||
> 1 May 2025
|
|
||||||
|
|
||||||
- chore(release): 1.12.7 [`c78bdfa`](https://git.odit.services/lfk/frontend/commit/c78bdfa5e24ada4909455064dd6b05cf34fc6df3)
|
|
||||||
- fix(deps): fresh lockfile [`b2ed2af`](https://git.odit.services/lfk/frontend/commit/b2ed2afd8a45a1a01ac6118b27941e3b4b3b611f)
|
|
||||||
- refactor(store): update refresh interval from 2min to 60min [`00d1988`](https://git.odit.services/lfk/frontend/commit/00d198895e15174b70a8d229974b4baa7d0ed8fc)
|
|
||||||
|
|
||||||
#### [1.12.6](https://git.odit.services/lfk/frontend/compare/1.12.5...1.12.6)
|
|
||||||
|
|
||||||
> 1 May 2025
|
|
||||||
|
|
||||||
- feat(pdfs): Experimental generation of large runner card files [`93422b9`](https://git.odit.services/lfk/frontend/commit/93422b97799c5e45c89acadd34f33b1a11b04617)
|
|
||||||
- chore(release): 1.12.6 [`b5c079d`](https://git.odit.services/lfk/frontend/commit/b5c079da9a0545d146e9f3029a543e04c907add3)
|
|
||||||
|
|
||||||
#### [1.12.5](https://git.odit.services/lfk/frontend/compare/1.12.4...1.12.5)
|
|
||||||
|
|
||||||
> 1 May 2025
|
|
||||||
|
|
||||||
- chore(release): 1.12.5 [`6dcfd9a`](https://git.odit.services/lfk/frontend/commit/6dcfd9a4fedd1e44894c9803482576bc650fb4db)
|
|
||||||
- fix(locales): Fixed translation [`2139524`](https://git.odit.services/lfk/frontend/commit/21395241de4de8f3a6b8404758d09c01d8a6f95f)
|
|
||||||
- feat(runners): Show total donations in runner detail [`f27c716`](https://git.odit.services/lfk/frontend/commit/f27c716296e228ecccbf500a21130f1bc47ea52d)
|
|
||||||
- chore(deps): Bump @odit/lfk-client-js to 1.2.7 [`6d19199`](https://git.odit.services/lfk/frontend/commit/6d1919974aacd74a265cf9ce0c9ed501028f0aa3)
|
|
||||||
- fix: Update release script to include --only-version flag [`8d2cb13`](https://git.odit.services/lfk/frontend/commit/8d2cb13195856f47022d414f3243e9a21457832b)
|
|
||||||
|
|
||||||
#### [1.12.4](https://git.odit.services/lfk/frontend/compare/1.12.3...1.12.4)
|
|
||||||
|
|
||||||
> 28 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.12.4 [`e61e8b0`](https://git.odit.services/lfk/frontend/commit/e61e8b063af75539b7db93c5ca42965417019f29)
|
|
||||||
- fix: Disable ios auto zooming on inputs [`073c78d`](https://git.odit.services/lfk/frontend/commit/073c78d98afd1c2f08b190aeda942a634e9bb888)
|
|
||||||
|
|
||||||
#### [1.12.3](https://git.odit.services/lfk/frontend/compare/1.12.2...1.12.3)
|
|
||||||
|
|
||||||
> 28 April 2025
|
|
||||||
|
|
||||||
- feat: Fast card replacement view [`7f802d5`](https://git.odit.services/lfk/frontend/commit/7f802d57f81d913634f28e2def29c183b0fdd098)
|
|
||||||
- chore(release): 1.12.3 [`85e4faf`](https://git.odit.services/lfk/frontend/commit/85e4faf898b4844bb2fcaf87e332c1471ef14b57)
|
|
||||||
|
|
||||||
#### [1.12.2](https://git.odit.services/lfk/frontend/compare/1.12.1...1.12.2)
|
|
||||||
|
|
||||||
> 28 April 2025
|
|
||||||
|
|
||||||
- feat(cardassignment): Now with hand scanner support [`9e8c236`](https://git.odit.services/lfk/frontend/commit/9e8c236281f6686318c27dcb1bd02dfbc2b30ee8)
|
|
||||||
- chore(release): 1.12.2 [`868dc3f`](https://git.odit.services/lfk/frontend/commit/868dc3f7e23f42f6bf1f752272ad21673be9c1c4)
|
|
||||||
|
|
||||||
#### [1.12.1](https://git.odit.services/lfk/frontend/compare/1.12.0...1.12.1)
|
|
||||||
|
|
||||||
> 28 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.12.1 [`827fb31`](https://git.odit.services/lfk/frontend/commit/827fb317bc946268e4a1d60b15f3805b67b240f6)
|
|
||||||
- fix(donations): Don't show enter payment for anon donations [`32f72df`](https://git.odit.services/lfk/frontend/commit/32f72df10583a08efb26e0983c0c5c829ab03e19)
|
|
||||||
- chore(deps): Fresh lock [`1ec8e21`](https://git.odit.services/lfk/frontend/commit/1ec8e2186bdcd69c2acbc785feef4927973bc986)
|
|
||||||
- fix(donations): Support anon donations in deletion modal [`27187b4`](https://git.odit.services/lfk/frontend/commit/27187b428da1e757f85392d77d49670f51a19829)
|
|
||||||
- fix(donations): Don't show details for anon donations [`ecd418c`](https://git.odit.services/lfk/frontend/commit/ecd418c5db0910d64cdf5336d72a10ebff38e065)
|
|
||||||
- refactor(i18n): Update translations [`77a4328`](https://git.odit.services/lfk/frontend/commit/77a432817ef644ff1be8a5ebcd284b7d67f742bd)
|
|
||||||
- fix(donations): Remove paid from anon donations [`31a4ff9`](https://git.odit.services/lfk/frontend/commit/31a4ff9d909742df3ed3d6cecae57870e287afcc)
|
|
||||||
- fix(donations): Move amount to extra line [`edd5da8`](https://git.odit.services/lfk/frontend/commit/edd5da89a7e741d48078125f68b6dd6d3d88a7a1)
|
|
||||||
- refactor(i18n): Shortened translation [`657fb04`](https://git.odit.services/lfk/frontend/commit/657fb04f1b5b439ef5fac834740ba00548b758de)
|
|
||||||
- feat(donation): Use new endpoint for creating anon donations [`e28f543`](https://git.odit.services/lfk/frontend/commit/e28f543d89efff80a84131df59bfb26a5ea92d14)
|
|
||||||
- fix(donations): Translate modal title [`dc1e6b7`](https://git.odit.services/lfk/frontend/commit/dc1e6b7a67c4761a007ffe3b71fd851fb569fb7c)
|
|
||||||
- chore(deps): Bump @odit/lfk-client-js [`cb315d9`](https://git.odit.services/lfk/frontend/commit/cb315d94fd2331bd49aa6d54b9ca0bfbf11f00d9)
|
|
||||||
- feat(shared): Hide link while keeping width [`724e844`](https://git.odit.services/lfk/frontend/commit/724e84441e8b71b7d89a8c3804467edebfd58365)
|
|
||||||
|
|
||||||
#### [1.12.0](https://git.odit.services/lfk/frontend/compare/1.11.5...1.12.0)
|
|
||||||
|
|
||||||
> 28 April 2025
|
|
||||||
|
|
||||||
- feat: anonymous donations [`9c03e35`](https://git.odit.services/lfk/frontend/commit/9c03e359a4e8f43452475b02bcabcb354987ab75)
|
|
||||||
- refactor: use modern tailwindcss features [`1505080`](https://git.odit.services/lfk/frontend/commit/1505080afdd8b272b76584e2777df732001ce004)
|
|
||||||
- chore(release): 1.12.0 [`5dcb4cb`](https://git.odit.services/lfk/frontend/commit/5dcb4cb508b204c5634804811a9f37db78e764ce)
|
|
||||||
|
|
||||||
#### [1.11.5](https://git.odit.services/lfk/frontend/compare/1.11.4...1.11.5)
|
|
||||||
|
|
||||||
> 25 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.11.5 [`8cb6093`](https://git.odit.services/lfk/frontend/commit/8cb6093f0b3474c0952a8a51a47683262fc31f8f)
|
|
||||||
- fix(cards): Update table for edit events [`27396e1`](https://git.odit.services/lfk/frontend/commit/27396e17f2cd8be72c9c8100afe6ec75ac66dceb)
|
|
||||||
|
|
||||||
#### [1.11.4](https://git.odit.services/lfk/frontend/compare/1.11.3...1.11.4)
|
|
||||||
|
|
||||||
> 25 April 2025
|
|
||||||
|
|
||||||
- feat(CardAssign): styled buttons [`f9993c6`](https://git.odit.services/lfk/frontend/commit/f9993c60f565d7270b3a269e934b42b945c24b99)
|
|
||||||
- chore(release): 1.11.4 [`fefd5c8`](https://git.odit.services/lfk/frontend/commit/fefd5c8237b91ac7fd7ecf467a6feb1100f84811)
|
|
||||||
- feat(CardAssignment): support EAN13 [`8e314f8`](https://git.odit.services/lfk/frontend/commit/8e314f8676e5c189c09a33c9a382a8b984af5e30)
|
|
||||||
|
|
||||||
#### [1.11.3](https://git.odit.services/lfk/frontend/compare/1.11.2...1.11.3)
|
|
||||||
|
|
||||||
> 25 April 2025
|
|
||||||
|
|
||||||
- chore(deps): Updated lock [`bce6d48`](https://git.odit.services/lfk/frontend/commit/bce6d484a9b1d7c40d4575a64ad528da2cc8fb3c)
|
|
||||||
- chore(release): 1.11.3 [`98a3b07`](https://git.odit.services/lfk/frontend/commit/98a3b072370f029f82f79a75b8f809bc1b41d82f)
|
|
||||||
- fix(cards): Z-Index for bulk card modal [`efad6fd`](https://git.odit.services/lfk/frontend/commit/efad6fdf2eae12c904575727b61fc61ed8a27d14)
|
|
||||||
|
|
||||||
#### [1.11.2](https://git.odit.services/lfk/frontend/compare/1.11.1...1.11.2)
|
|
||||||
|
|
||||||
> 23 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.11.2 [`2dea19d`](https://git.odit.services/lfk/frontend/commit/2dea19df8990b34a56a345fef05487684ecec8c4)
|
|
||||||
- fix(cardassignment): handle card not found [`6c98646`](https://git.odit.services/lfk/frontend/commit/6c986467d39344a32e598b834a115932ab8c9a1f)
|
|
||||||
|
|
||||||
#### [1.11.1](https://git.odit.services/lfk/frontend/compare/1.11.0...1.11.1)
|
|
||||||
|
|
||||||
> 22 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.11.1 [`3cedbeb`](https://git.odit.services/lfk/frontend/commit/3cedbebe40b7699e39edc133e4bcbc16f4e7eb56)
|
|
||||||
- ci: fix build [`dc986e4`](https://git.odit.services/lfk/frontend/commit/dc986e4fe5d462909e34b8bbf9a3c10accb2a00b)
|
|
||||||
|
|
||||||
#### [1.11.0](https://git.odit.services/lfk/frontend/compare/1.10.6...1.11.0)
|
|
||||||
|
|
||||||
> 22 April 2025
|
|
||||||
|
|
||||||
- chore: move to tailwind v4 [`81a8ce0`](https://git.odit.services/lfk/frontend/commit/81a8ce002cd5a470f5ac4f064360c09bcf815ac8)
|
|
||||||
- chore(deps): bump [`244be47`](https://git.odit.services/lfk/frontend/commit/244be471f07a6ab77768fb599cc2381a319e4e22)
|
|
||||||
- chore: move privacy & imprint to website links [`3288ffb`](https://git.odit.services/lfk/frontend/commit/3288ffb3cc52bcfbb2b94c373932e9d614fba80f)
|
|
||||||
- fix: modal position & z index [`a12c4f8`](https://git.odit.services/lfk/frontend/commit/a12c4f87d2db2271a6b123c3a009bd8d2f7663a4)
|
|
||||||
- chore: tailwind class cleanup [`80ab4e0`](https://git.odit.services/lfk/frontend/commit/80ab4e037e44edf1f076d4a365ef36c614e7cb0a)
|
|
||||||
- fix(cardassignment): debounce w/ immediate start [`1d6ed99`](https://git.odit.services/lfk/frontend/commit/1d6ed990736c6156b67f0715ee1f86aeb2be0390)
|
|
||||||
- fix(RunnerDetail): move to standard html select for groups [`e1bf435`](https://git.odit.services/lfk/frontend/commit/e1bf435080a3845a4a29f9b8bce7aba3e9220cf9)
|
|
||||||
- chore(release): 1.11.0 [`cae6be6`](https://git.odit.services/lfk/frontend/commit/cae6be6f867aece8997799e90f783a7b5f9b7602)
|
|
||||||
- feat(ImportRunnerModal): sort groups by name [`3124574`](https://git.odit.services/lfk/frontend/commit/312457494cb0da805df5ec2811604ea45a09963d)
|
|
||||||
- feat(cards): badge style for runner links [`1605b0f`](https://git.odit.services/lfk/frontend/commit/1605b0f7b2c12d2b247f40aefc03d2d053fea60d)
|
|
||||||
|
|
||||||
#### [1.10.6](https://git.odit.services/lfk/frontend/compare/1.10.5...1.10.6)
|
|
||||||
|
|
||||||
> 22 April 2025
|
|
||||||
|
|
||||||
- feat: improved mobile card assignment [`d841727`](https://git.odit.services/lfk/frontend/commit/d841727439e42c940d56001f08da4ae2399176a7)
|
|
||||||
- chore(release): 1.10.6 [`3fab344`](https://git.odit.services/lfk/frontend/commit/3fab3447799a5a28db741643189a2c4217b03714)
|
|
||||||
|
|
||||||
#### [1.10.5](https://git.odit.services/lfk/frontend/compare/1.10.4...1.10.5)
|
|
||||||
|
|
||||||
> 22 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.10.5 [`87df34b`](https://git.odit.services/lfk/frontend/commit/87df34bb56c04c1efd22ecbe0b857198358f93d5)
|
|
||||||
- feat(runners): add distance sorting [`9c3b742`](https://git.odit.services/lfk/frontend/commit/9c3b742a98e17837fbcabe308fb2774dc13b03b8)
|
|
||||||
|
|
||||||
#### [1.10.4](https://git.odit.services/lfk/frontend/compare/1.10.3...1.10.4)
|
|
||||||
|
|
||||||
> 22 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.10.4 [`68bf371`](https://git.odit.services/lfk/frontend/commit/68bf3717f9cf15a547c51e245452d4e013f7acad)
|
|
||||||
- fix(runners): Fix runner overview sort [`f88c6e0`](https://git.odit.services/lfk/frontend/commit/f88c6e0dbab620887e180de0d3eab03b8215a477)
|
|
||||||
|
|
||||||
#### [1.10.3](https://git.odit.services/lfk/frontend/compare/1.10.2...1.10.3)
|
|
||||||
|
|
||||||
> 17 April 2025
|
|
||||||
|
|
||||||
- feat(pdf): Send selfservicelink for generation [`01e77a9`](https://git.odit.services/lfk/frontend/commit/01e77a97f3f28700e0249d35afd9641b56d9c55d)
|
|
||||||
- chore(release): 1.10.3 [`12050cd`](https://git.odit.services/lfk/frontend/commit/12050cdda95b5f8eb5b414b81655d06faae3ef1e)
|
|
||||||
- chore(deps): Bump @odit/lfk-client-js [`10824b5`](https://git.odit.services/lfk/frontend/commit/10824b5d9b207e14a37fa23e90d54337d76e60a9)
|
|
||||||
|
|
||||||
#### [1.10.2](https://git.odit.services/lfk/frontend/compare/1.10.1...1.10.2)
|
|
||||||
|
|
||||||
> 11 April 2025
|
|
||||||
|
|
||||||
- refactor(runners): filter table for created_via [`785b9e0`](https://git.odit.services/lfk/frontend/commit/785b9e0b60a9961f99d0c519d6bb12dc735ac605)
|
|
||||||
- chore(release): 1.10.2 [`d9870e0`](https://git.odit.services/lfk/frontend/commit/d9870e03bc3175ee9b299174a19f257d6046a718)
|
|
||||||
|
|
||||||
#### [1.10.1](https://git.odit.services/lfk/frontend/compare/1.10.0...1.10.1)
|
|
||||||
|
|
||||||
> 9 April 2025
|
|
||||||
|
|
||||||
- feat: runner list filtered by created_via [`991716a`](https://git.odit.services/lfk/frontend/commit/991716a7f55d0414111ad264ad1e93de9e82971a)
|
|
||||||
- chore(release): 1.10.1 [`fce2bc6`](https://git.odit.services/lfk/frontend/commit/fce2bc645e040322f4d1b98a1ed1ab5df7227b6d)
|
|
||||||
|
|
||||||
#### [1.10.0](https://git.odit.services/lfk/frontend/compare/1.9.11...1.10.0)
|
|
||||||
|
|
||||||
> 9 April 2025
|
|
||||||
|
|
||||||
- feat: working CardAssignment [`ac4ef8f`](https://git.odit.services/lfk/frontend/commit/ac4ef8fb6ded5c5d5678a651420e356b3ef45399)
|
|
||||||
- chore(release): 1.10.0 [`aa720f2`](https://git.odit.services/lfk/frontend/commit/aa720f2460079e35eed9d87a2ac580a3305efbd5)
|
|
||||||
|
|
||||||
#### [1.9.11](https://git.odit.services/lfk/frontend/compare/1.9.10...1.9.11)
|
|
||||||
|
|
||||||
> 8 April 2025
|
|
||||||
|
|
||||||
- feat(dash): add runnersViaKiosk [`5291f8a`](https://git.odit.services/lfk/frontend/commit/5291f8a4d1721cd0c745191ebc85f221c34a23c8)
|
|
||||||
- chore(release): 1.9.11 [`eae0afd`](https://git.odit.services/lfk/frontend/commit/eae0afda23a54020e25821c0188d8cbec3139593)
|
|
||||||
|
|
||||||
#### [1.9.10](https://git.odit.services/lfk/frontend/compare/1.9.9...1.9.10)
|
|
||||||
|
|
||||||
> 8 April 2025
|
|
||||||
|
|
||||||
- feat: add experimental ui for mobile card assignment [`d7c9c27`](https://git.odit.services/lfk/frontend/commit/d7c9c27ec7a1fea1cbaf26914843d044bbae32fe)
|
|
||||||
- chore(release): 1.9.10 [`e2d7de1`](https://git.odit.services/lfk/frontend/commit/e2d7de1e9e1fd134f54876fa80f19f94fbea3672)
|
|
||||||
|
|
||||||
#### [1.9.9](https://git.odit.services/lfk/frontend/compare/1.9.8...1.9.9)
|
|
||||||
|
|
||||||
> 4 April 2025
|
|
||||||
|
|
||||||
- chore(release): 1.9.9 [`153b1b3`](https://git.odit.services/lfk/frontend/commit/153b1b3c2badee4826be614c3dbaafc10e1fbfea)
|
|
||||||
- fix(CopyScanStationTokenModal): code sizes [`ec63c7c`](https://git.odit.services/lfk/frontend/commit/ec63c7c1c51ccaf25bdd1eacffda66c820003a4c)
|
|
||||||
|
|
||||||
#### [1.9.8](https://git.odit.services/lfk/frontend/compare/1.9.7...1.9.8)
|
|
||||||
|
|
||||||
> 2 April 2025
|
|
||||||
|
|
||||||
- feat(GenerateSponsoringContracts): show download progress [`e261d5e`](https://git.odit.services/lfk/frontend/commit/e261d5e345f3175672bf86646ed838dd23400e50)
|
|
||||||
- chore(release): 1.9.8 [`05c2535`](https://git.odit.services/lfk/frontend/commit/05c253569877a45f3c4759262255ca70aa9ee4a3)
|
|
||||||
|
|
||||||
#### [1.9.7](https://git.odit.services/lfk/frontend/compare/1.9.6...1.9.7)
|
#### [1.9.7](https://git.odit.services/lfk/frontend/compare/1.9.6...1.9.7)
|
||||||
|
|
||||||
> 2 April 2025
|
|
||||||
|
|
||||||
- fix: ImportRunnerModal scrolling & team select [`766eeab`](https://git.odit.services/lfk/frontend/commit/766eeab49fb3ca5715c19dbf9bc53cb71124d3df)
|
- fix: ImportRunnerModal scrolling & team select [`766eeab`](https://git.odit.services/lfk/frontend/commit/766eeab49fb3ca5715c19dbf9bc53cb71124d3df)
|
||||||
- chore(release): 1.9.7 [`c00497d`](https://git.odit.services/lfk/frontend/commit/c00497d7760a935965cc83213f72f35999a3c168)
|
|
||||||
|
|
||||||
#### [1.9.6](https://git.odit.services/lfk/frontend/compare/1.9.5...1.9.6)
|
#### [1.9.6](https://git.odit.services/lfk/frontend/compare/1.9.5...1.9.6)
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@ FROM registry.odit.services/hub/library/node:23.10.0-alpine3.21 AS build
|
|||||||
ARG NPM_REGISTRY_URL=https://registry.npmjs.org
|
ARG NPM_REGISTRY_URL=https://registry.npmjs.org
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY package.json pnpm-lock.yaml vite.config.js index.html ./
|
COPY package.json pnpm-lock.yaml vite.config.js tailwind.config.cjs postcss.config.cjs index.html ./
|
||||||
RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@10.8
|
RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@10.7
|
||||||
RUN mkdir /pnpm && pnpm config set store-dir /pnpm && pnpm i
|
RUN mkdir /pnpm && pnpm config set store-dir /pnpm && pnpm i
|
||||||
|
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
|
@ -6,14 +6,14 @@
|
|||||||
<link rel="manifest" href="/manifest.webmanifest" />
|
<link rel="manifest" href="/manifest.webmanifest" />
|
||||||
<link rel="apple-touch-icon" href="/lfk-logo.png" />
|
<link rel="apple-touch-icon" href="/lfk-logo.png" />
|
||||||
<meta name="theme-color" content="#FFFFFF" />
|
<meta name="theme-color" content="#FFFFFF" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-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>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<span style="display: none; visibility: hidden" id="buildinfo"
|
<span style="display: none; visibility: hidden" id="buildinfo"
|
||||||
>RELEASE_INFO-1.14.2-RELEASE_INFO</span
|
>RELEASE_INFO-1.9.7-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>
|
||||||
|
25
package.json
25
package.json
@ -1,28 +1,28 @@
|
|||||||
{
|
{
|
||||||
"name": "@odit/lfk-frontend",
|
"name": "@odit/lfk-frontend",
|
||||||
"version": "1.14.2",
|
"version": "1.9.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"i18n-order": "node order.js",
|
"i18n-order": "node order.js",
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"format": "prettier --write --plugin-search-dir=. .",
|
"format": "prettier --write --plugin-search-dir=. .",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"release": "release-it --only-version",
|
"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",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@odit/license-exporter": "0.2.0",
|
"@odit/license-exporter": "0.2.0",
|
||||||
"@sveltejs/vite-plugin-svelte": "2.1.1",
|
"@sveltejs/vite-plugin-svelte": "2.1.1",
|
||||||
"@types/papaparse": "^5.3.15",
|
|
||||||
"@types/underscore": "^1.13.0",
|
|
||||||
"auto-changelog": "2.5.0",
|
"auto-changelog": "2.5.0",
|
||||||
|
"autoprefixer": "10.4.21",
|
||||||
|
"postcss": "8.5.3",
|
||||||
"prettier": "3.5.3",
|
"prettier": "3.5.3",
|
||||||
"prettier-plugin-svelte": "3.3.3",
|
"prettier-plugin-svelte": "3.3.3",
|
||||||
"release-it": "17.10.0",
|
"release-it": "17.10.0",
|
||||||
"svelte-select": "3.17.0",
|
"svelte-select": "3.17.0",
|
||||||
"vite": "6.3.2",
|
"tailwindcss": "3.4.15",
|
||||||
"vite-plugin-mkcert": "^1.17.8"
|
"vite": "4.3.3"
|
||||||
},
|
},
|
||||||
"release-it": {
|
"release-it": {
|
||||||
"git": {
|
"git": {
|
||||||
@ -42,22 +42,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@bwip-js/browser": "^4.6.0",
|
|
||||||
"@fontsource/athiti": "^5.2.5",
|
"@fontsource/athiti": "^5.2.5",
|
||||||
"@odit/lfk-client-js": "1.2.7",
|
"@odit/lfk-client-js": "1.2.0",
|
||||||
"@paralleldrive/cuid2": "2.2.2",
|
"@paralleldrive/cuid2": "2.2.2",
|
||||||
"@tailwindcss/vite": "^4.1.4",
|
|
||||||
"@tanstack/svelte-table": "8.9.1",
|
"@tanstack/svelte-table": "8.9.1",
|
||||||
|
"bwip-js": "3.4.0",
|
||||||
"check-password-strength": "2.0.10",
|
"check-password-strength": "2.0.10",
|
||||||
"html5-qrcode": "^2.3.8",
|
"csvtojson": "2.0.10",
|
||||||
"localforage": "1.10.0",
|
"localforage": "1.10.0",
|
||||||
"papaparse": "^5.5.2",
|
"marked": "4.3.0",
|
||||||
"svelte": "3.58.0",
|
"svelte": "3.58.0",
|
||||||
"svelte-french-toast": "1.2.0",
|
"svelte-french-toast": "1.2.0",
|
||||||
"svelte-i18n": "4.0.1",
|
"svelte-i18n": "3.6.0",
|
||||||
"tailwindcss": "^4.1.4",
|
|
||||||
"tinro": "0.6.12",
|
"tinro": "0.6.12",
|
||||||
"underscore": "^1.13.7",
|
|
||||||
"validator": "13.15.0",
|
"validator": "13.15.0",
|
||||||
"xlsx": "0.18.5"
|
"xlsx": "0.18.5"
|
||||||
},
|
},
|
||||||
|
2419
pnpm-lock.yaml
generated
2419
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
6
postcss.config.cjs
Normal file
6
postcss.config.cjs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
};
|
BIN
public/beep.mp3
BIN
public/beep.mp3
Binary file not shown.
BIN
public/error.mp3
BIN
public/error.mp3
Binary file not shown.
File diff suppressed because one or more lines are too long
1
public/privacy_en.md
Normal file
1
public/privacy_en.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
Nostrud tempor dolor aute ea excepteur aute mollit elit eiusmod exercitation. Magna laborum pariatur adipisicing pariatur cupidatat exercitation duis aliquip pariatur sint exercitation deserunt labore. Consectetur id laboris dolore nostrud do velit ipsum. Eu laboris velit do commodo ad ea sint ex cillum. Cillum ipsum qui eiusmod laborum mollit sunt dolore incididunt. Cillum sunt culpa veniam voluptate et qui ut magna anim occaecat ut mollit dolor. Duis irure proident eu incididunt dolore sunt nisi aute dolore amet eu fugiat laboris quis.
|
@ -41,7 +41,6 @@
|
|||||||
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 CardAssignment from "./components/tools/CardAssignment.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";
|
||||||
@ -54,6 +53,8 @@
|
|||||||
import UserPermissions from "./components/users/UserPermissions.svelte";
|
import UserPermissions from "./components/users/UserPermissions.svelte";
|
||||||
import GroupPermissions from "./components/groups/GroupPermissions.svelte";
|
import GroupPermissions from "./components/groups/GroupPermissions.svelte";
|
||||||
import RunnerDetail from "./components/runners/RunnerDetail.svelte";
|
import RunnerDetail from "./components/runners/RunnerDetail.svelte";
|
||||||
|
import Imprint from "./components/general/Imprint.svelte";
|
||||||
|
import Privacy from "./components/general/Privacy.svelte";
|
||||||
import ResetPassword from "./components/auth/ResetPassword.svelte";
|
import ResetPassword from "./components/auth/ResetPassword.svelte";
|
||||||
import Contacts from "./components/contacts/Contacts.svelte";
|
import Contacts from "./components/contacts/Contacts.svelte";
|
||||||
import ContactDetail from "./components/contacts/ContactDetail.svelte";
|
import ContactDetail from "./components/contacts/ContactDetail.svelte";
|
||||||
@ -70,9 +71,6 @@
|
|||||||
import Cards from "./components/cards/Cards.svelte";
|
import Cards from "./components/cards/Cards.svelte";
|
||||||
import StatsClients from "./components/statsclients/StatsClients.svelte";
|
import StatsClients from "./components/statsclients/StatsClients.svelte";
|
||||||
import StatsClientDetail from "./components/statsclients/StatsClientDetail.svelte";
|
import StatsClientDetail from "./components/statsclients/StatsClientDetail.svelte";
|
||||||
import CardReplacement from "./components/tools/CardReplacement.svelte";
|
|
||||||
import ScanClient from "./components/tools/ScanClient.svelte";
|
|
||||||
import DonationCreate from "./components/tools/DonationCreate.svelte";
|
|
||||||
store.init();
|
store.init();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -89,6 +87,14 @@
|
|||||||
<Route path="/about">
|
<Route path="/about">
|
||||||
<About />
|
<About />
|
||||||
</Route>
|
</Route>
|
||||||
|
{:else if $router.path === "/imprint"}
|
||||||
|
<Route path="/imprint">
|
||||||
|
<Imprint />
|
||||||
|
</Route>
|
||||||
|
{:else if $router.path === "/privacy"}
|
||||||
|
<Route path="/privacy">
|
||||||
|
<Privacy />
|
||||||
|
</Route>
|
||||||
{:else if $store.isLoggedIn}
|
{:else if $store.isLoggedIn}
|
||||||
<Dashboard>
|
<Dashboard>
|
||||||
<Transition>
|
<Transition>
|
||||||
@ -128,27 +134,13 @@
|
|||||||
<Route path="/:trackid" let:params />
|
<Route path="/:trackid" let:params />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="/runners/*">
|
<Route path="/runners/*">
|
||||||
<Route path="/" let:meta>
|
<Route path="/">
|
||||||
<Runners created_via={meta.query.created_via} />
|
<Runners />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="/:runnerid" let:params>
|
<Route path="/:runnerid" let:params>
|
||||||
<RunnerDetail {params} />
|
<RunnerDetail {params} />
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="/tools/*">
|
|
||||||
<Route path="/cardassignment/">
|
|
||||||
<CardAssignment />
|
|
||||||
</Route>
|
|
||||||
<Route path="/cardreplacement/">
|
|
||||||
<CardReplacement />
|
|
||||||
</Route>
|
|
||||||
<Route path="/scanclient/">
|
|
||||||
<ScanClient />
|
|
||||||
</Route>
|
|
||||||
<Route path="/donationcreate/">
|
|
||||||
<DonationCreate />
|
|
||||||
</Route>
|
|
||||||
</Route>
|
|
||||||
<Route path="/teams/*">
|
<Route path="/teams/*">
|
||||||
<Route path="/">
|
<Route path="/">
|
||||||
<Teams />
|
<Teams />
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
<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">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -111,7 +111,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<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-2xl sm:w-full relative z-10"
|
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-2xl sm:w-full"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -122,7 +122,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -115,7 +115,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -148,7 +148,7 @@
|
|||||||
>{$_("runner")}</label
|
>{$_("runner")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
filterRunners(label, filterText, option)}
|
filterRunners(label, filterText, option)}
|
||||||
items={runners}
|
items={runners}
|
||||||
@ -180,7 +180,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -98,7 +98,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -109,7 +109,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -139,7 +139,7 @@
|
|||||||
>{$_("runner")}</label
|
>{$_("runner")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
filterRunners(label, filterText, option)}
|
filterRunners(label, filterText, option)}
|
||||||
items={runners}
|
items={runners}
|
||||||
@ -162,7 +162,7 @@
|
|||||||
name="enabled"
|
name="enabled"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={editable.enabled}
|
checked={editable.enabled}
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
{$_("this-card-is")}
|
{$_("this-card-is")}
|
||||||
{#if editable.enabled}
|
{#if editable.enabled}
|
||||||
@ -189,7 +189,7 @@
|
|||||||
edit_modal_open = false;
|
edit_modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
{#if !runner}
|
{#if !runner}
|
||||||
{$_("non-blanko")}
|
{$_("non-blanko")}
|
||||||
{:else}
|
{:else}
|
||||||
<a class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full border border-current bg-blue-100 text-blue-800" href={`/runners/${runner.id}`}>
|
<a href={`/runners/${runner.id}`}>
|
||||||
{#if runner.middlename}
|
{#if runner.middlename}
|
||||||
{runner.firstname} {runner.middlename} {runner.lastname}
|
{runner.firstname} {runner.middlename} {runner.lastname}
|
||||||
{:else}
|
{:else}
|
||||||
|
@ -180,9 +180,11 @@
|
|||||||
bind:runner
|
bind:runner
|
||||||
bind:editable
|
bind:editable
|
||||||
bind:original_data
|
bind:original_data
|
||||||
on:dataUpdated={(editevent) => {
|
on:dataUpdated={(event) => {
|
||||||
console.log(editevent.detail.card)
|
current_cards[
|
||||||
current_cards = current_cards.filter((c) => c.id !== editevent.detail.card.id).concat([editevent.detail.card]).sort((a, b) => a.code - b.code);
|
current_cards.findIndex((c) => c.id === event.detail.card.id)
|
||||||
|
] = event.detail.card;
|
||||||
|
current_cards = current_cards;
|
||||||
options.update((options) => ({
|
options.update((options) => ({
|
||||||
...options,
|
...options,
|
||||||
data: current_cards,
|
data: current_cards,
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -65,7 +65,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -103,7 +103,7 @@
|
|||||||
<button
|
<button
|
||||||
on:click={submit}
|
on:click={submit}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("delete")}
|
{$_("delete")}
|
||||||
</button>
|
</button>
|
||||||
@ -112,7 +112,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -156,7 +156,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -167,7 +167,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -345,7 +345,7 @@
|
|||||||
id="comments"
|
id="comments"
|
||||||
name="comments"
|
name="comments"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-3 text-sm">
|
<div class="ml-3 text-sm">
|
||||||
@ -469,7 +469,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -300,7 +300,7 @@
|
|||||||
id="comments"
|
id="comments"
|
||||||
name="comments"
|
name="comments"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-3 text-sm">
|
<div class="ml-3 text-sm">
|
||||||
|
@ -190,7 +190,7 @@
|
|||||||
{:catch error}
|
{:catch error}
|
||||||
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
<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">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,534 +1,439 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import localForage from "localforage";
|
import localForage from "localforage";
|
||||||
import store from "../../store";
|
import store from "../../store";
|
||||||
import { router } from "tinro";
|
import { router } from "tinro";
|
||||||
import NoComponentLoaded from "../base/NoComponentLoaded.svelte";
|
import NoComponentLoaded from "../base/NoComponentLoaded.svelte";
|
||||||
import { AuthService } from "@odit/lfk-client-js";
|
import { AuthService } from "@odit/lfk-client-js";
|
||||||
import { Toaster } from "svelte-french-toast";
|
import { Toaster } from "svelte-french-toast";
|
||||||
$: navOpen = false;
|
$: navOpen = false;
|
||||||
function logout() {
|
function logout() {
|
||||||
localForage.clear();
|
localForage.clear();
|
||||||
location.replace("/");
|
location.replace("/");
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section class="min-h-screen bg-gray-50">
|
<section class="min-h-screen bg-gray-50">
|
||||||
<div
|
<div
|
||||||
class:collapsed_navigation={!navOpen}
|
class:collapsed_navigation={!navOpen}
|
||||||
style="z-index:11;"
|
style="z-index:11;"
|
||||||
class="select-none fixed top-0 left-0 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 h-full pb-10 overflow-x-hidden overflow-y-auto transition origin-left transform border-r w-60 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 font-bold">LfK!Admin</h3>
|
<h3 class="text-lg font-bold">LfK!Admin</h3>
|
||||||
</a>
|
</a>
|
||||||
<nav class="text-sm font-medium text-gray-600" aria-label="Main Navigation">
|
<nav class="text-sm font-medium text-gray-600" aria-label="Main Navigation">
|
||||||
<a
|
<a
|
||||||
class:activenav={$router.path === "/"}
|
class:activenav={$router.path === "/"}
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
href="/"
|
href="/"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 20 20"
|
viewBox="0 0 20 20"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z"
|
d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
<span>{$_("dashboard-title")}</span>
|
<span>{$_("dashboard-title")}</span>
|
||||||
</a>
|
</a>
|
||||||
<h2 class="px-4 py-2 text-xs font-semibold text-gray-600 uppercase">
|
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")}
|
||||||
{$_("quick-tools")}
|
<a
|
||||||
</h2>
|
class:activenav={$router.path.includes("/runners/")}
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET") && store.state.jwtinfo.userdetails.permissions.includes("CARD:GET")}
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
<a
|
href="/runners/"
|
||||||
class:activenav={$router.path.includes("/tools/cardassignment/")}
|
>
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
<svg
|
||||||
href="/tools/cardassignment/"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
viewBox="0 0 24 24"
|
||||||
<svg
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
fill="currentColor"
|
||||||
viewBox="0 0 24 24"
|
width="24"
|
||||||
fill="currentColor"
|
height="24"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
>
|
<path
|
||||||
<path
|
d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"
|
||||||
fill-rule="evenodd"
|
/></svg
|
||||||
d="M14.615 1.595a.75.75 0 0 1 .359.852L12.982 9.75h7.268a.75.75 0 0 1 .548 1.262l-10.5 11.25a.75.75 0 0 1-1.272-.71l1.992-7.302H3.75a.75.75 0 0 1-.548-1.262l10.5-11.25a.75.75 0 0 1 .913-.143Z"
|
>
|
||||||
clip-rule="evenodd"
|
<span>{$_("runners")}</span>
|
||||||
/>
|
</a>
|
||||||
</svg>
|
{/if}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes("TEAM:GET")}
|
||||||
<span>{$_("card_assignment_menu")}</span>
|
<a
|
||||||
</a>
|
class:activenav={$router.path.includes("/teams/")}
|
||||||
<a
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
class:activenav={$router.path.includes("/tools/cardreplacement/")}
|
href="/teams/"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
>
|
||||||
href="/tools/cardreplacement/"
|
<svg
|
||||||
>
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
<svg
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
width="24"
|
||||||
viewBox="0 0 24 24"
|
height="24"
|
||||||
fill="currentColor"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
viewBox="0 0 640 512"
|
||||||
>
|
><path
|
||||||
<path
|
fill="currentColor"
|
||||||
fill-rule="evenodd"
|
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"
|
||||||
d="M14.615 1.595a.75.75 0 0 1 .359.852L12.982 9.75h7.268a.75.75 0 0 1 .548 1.262l-10.5 11.25a.75.75 0 0 1-1.272-.71l1.992-7.302H3.75a.75.75 0 0 1-.548-1.262l10.5-11.25a.75.75 0 0 1 .913-.143Z"
|
/></svg
|
||||||
clip-rule="evenodd"
|
>
|
||||||
/>
|
<span>{$_("teams")}</span>
|
||||||
</svg>
|
</a>
|
||||||
|
{/if}
|
||||||
<span>{$_("card-replacement-menu")}</span>
|
{#if store.state.jwtinfo.userdetails.permissions.includes("ORGANIZATION:GET")}
|
||||||
</a>
|
<a
|
||||||
{/if}
|
class:activenav={$router.path.includes("/orgs/")}
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:CREATE")}
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
<a
|
href="/orgs/"
|
||||||
class:activenav={$router.path.includes("/tools/scanclient/")}
|
>
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
<svg
|
||||||
href="/tools/scanclient/"
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
>
|
fill="currentColor"
|
||||||
<svg
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
viewBox="0 0 24 24"
|
||||||
viewBox="0 0 24 24"
|
width="24"
|
||||||
fill="currentColor"
|
height="24"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
>
|
<path
|
||||||
<path
|
d="M17 19h2v-8h-6v8h2v-6h2v6zM3 19V4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v5h2v10h1v2H2v-2h1zm4-8v2h2v-2H7zm0 4v2h2v-2H7zm0-8v2h2V7H7z"
|
||||||
fill-rule="evenodd"
|
/></svg
|
||||||
d="M14.615 1.595a.75.75 0 0 1 .359.852L12.982 9.75h7.268a.75.75 0 0 1 .548 1.262l-10.5 11.25a.75.75 0 0 1-1.272-.71l1.992-7.302H3.75a.75.75 0 0 1-.548-1.262l10.5-11.25a.75.75 0 0 1 .913-.143Z"
|
>
|
||||||
clip-rule="evenodd"
|
<span>{$_("orgs")}</span>
|
||||||
/>
|
</a>
|
||||||
</svg>
|
{/if}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")}
|
||||||
<span>{$_("scanclient")}</span>
|
<a
|
||||||
</a>
|
class:activenav={$router.path.includes("/donors/")}
|
||||||
{/if}
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:CREATE")}
|
href="/donors/"
|
||||||
<a
|
>
|
||||||
class:activenav={$router.path.includes("/tools/donationcreate/")}
|
<svg
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
href="/tools/donationcreate/"
|
fill="currentColor"
|
||||||
>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<svg
|
viewBox="0 0 24 24"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
width="24"
|
||||||
viewBox="0 0 24 24"
|
height="24"
|
||||||
fill="currentColor"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
<path
|
||||||
>
|
d="M9.33 11.5h2.17A4.5 4.5 0 0 1 16 16H8.999L9 17h8v-1a5.578 5.578 0 0 0-.886-3H19a5 5 0 0 1 4.516 2.851C21.151 18.972 17.322 21 13 21c-2.761 0-5.1-.59-7-1.625L6 10.071A6.967 6.967 0 0 1 9.33 11.5zM5 19a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v9zM18 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm-7-3a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"
|
||||||
<path
|
/></svg
|
||||||
fill-rule="evenodd"
|
>
|
||||||
d="M14.615 1.595a.75.75 0 0 1 .359.852L12.982 9.75h7.268a.75.75 0 0 1 .548 1.262l-10.5 11.25a.75.75 0 0 1-1.272-.71l1.992-7.302H3.75a.75.75 0 0 1-.548-1.262l10.5-11.25a.75.75 0 0 1 .913-.143Z"
|
<span>{$_("donors")}</span>
|
||||||
clip-rule="evenodd"
|
</a>
|
||||||
/>
|
{/if}
|
||||||
</svg>
|
{#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:GET")}
|
||||||
|
<a
|
||||||
<span>{$_("donation-quick-add")}</span>
|
class:activenav={$router.path.includes("/donations/")}
|
||||||
</a>
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
{/if}
|
href="/donations/"
|
||||||
<h2 class="px-4 py-2 text-xs font-semibold text-gray-600 uppercase">
|
>
|
||||||
{$_("management")}
|
<svg
|
||||||
</h2>
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")}
|
fill="currentColor"
|
||||||
<a
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class:activenav={$router.path.includes("/runners/")}
|
viewBox="0 0 24 24"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
width="24"
|
||||||
href="/runners/"
|
height="24"
|
||||||
>
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
<svg
|
<path
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z"
|
||||||
viewBox="0 0 24 24"
|
/></svg
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
>
|
||||||
fill="currentColor"
|
<span>{$_("donations")}</span>
|
||||||
width="24"
|
</a>
|
||||||
height="24"
|
{/if}
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
{#if store.state.jwtinfo.userdetails.permissions.includes("TRACK:GET")}
|
||||||
<path
|
<a
|
||||||
d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"
|
class:activenav={$router.path === "/tracks/"}
|
||||||
/></svg
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
>
|
href="/tracks/"
|
||||||
<span>{$_("runners")}</span>
|
>
|
||||||
</a>
|
<svg
|
||||||
{/if}
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("TEAM:GET")}
|
fill="currentColor"
|
||||||
<a
|
width="24"
|
||||||
class:activenav={$router.path.includes("/teams/")}
|
height="24"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
href="/teams/"
|
viewBox="0 0 640 512"
|
||||||
>
|
><path
|
||||||
<svg
|
fill="currentColor"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
d="M635.7 167.2L556.1 31.7c-8.8-15-28.3-20.1-43.5-11.5l-69 39.1L503.3 161c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L416 75l-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L333.2 122 278 153.3 337.8 255c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-59.7-101.7-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-27.9-47.5-55.2 31.3 59.7 101.7c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L84.9 262.9l-69 39.1C.7 310.7-4.6 329.8 4.2 344.8l79.6 135.6c8.8 15 28.3 20.1 43.5 11.5L624.1 210c15.2-8.6 20.4-27.8 11.6-42.8z"
|
||||||
fill="currentColor"
|
/></svg
|
||||||
width="24"
|
>
|
||||||
height="24"
|
<span>{$_("tracks")}</span>
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
</a>
|
||||||
viewBox="0 0 640 512"
|
{/if}
|
||||||
><path
|
{#if store.state.jwtinfo.userdetails.permissions.includes("CARD:GET")}
|
||||||
fill="currentColor"
|
<a
|
||||||
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"
|
class:activenav={$router.path === "/cards/"}
|
||||||
/></svg
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
>
|
href="/cards/"
|
||||||
<span>{$_("teams")}</span>
|
>
|
||||||
</a>
|
<svg
|
||||||
{/if}
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("ORGANIZATION:GET")}
|
fill="currentColor"
|
||||||
<a
|
width="24"
|
||||||
class:activenav={$router.path.includes("/orgs/")}
|
height="24"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
href="/orgs/"
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<svg
|
<path fill="none" d="M0 0h24v24H0z" />
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
<path
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
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"
|
||||||
viewBox="0 0 24 24"
|
/></svg
|
||||||
width="24"
|
>
|
||||||
height="24"
|
<span>{$_("cards")}</span>
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
</a>
|
||||||
<path
|
{/if}
|
||||||
d="M17 19h2v-8h-6v8h2v-6h2v6zM3 19V4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v5h2v10h1v2H2v-2h1zm4-8v2h2v-2H7zm0 4v2h2v-2H7zm0-8v2h2V7H7z"
|
{#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")}
|
||||||
/></svg
|
<a
|
||||||
>
|
class:activenav={$router.path.includes("/scans/")}
|
||||||
<span>{$_("orgs")}</span>
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
</a>
|
href="/scans/"
|
||||||
{/if}
|
>
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")}
|
<svg
|
||||||
<a
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
class:activenav={$router.path.includes("/donors/")}
|
fill="currentColor"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
width="24"
|
||||||
href="/donors/"
|
height="24"
|
||||||
>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<svg
|
viewBox="0 0 24 24"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
fill="currentColor"
|
<path
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
fill="currentColor"
|
||||||
viewBox="0 0 24 24"
|
d="M2 4h2v16H2V4zm4 0h1v16H6V4zm2 0h2v16H8V4zm3 0h2v16h-2V4zm3 0h2v16h-2V4zm3 0h1v16h-1V4zm2 0h3v16h-3V4z"
|
||||||
width="24"
|
/></svg
|
||||||
height="24"
|
>
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
<span>Scans</span>
|
||||||
<path
|
</a>
|
||||||
d="M9.33 11.5h2.17A4.5 4.5 0 0 1 16 16H8.999L9 17h8v-1a5.578 5.578 0 0 0-.886-3H19a5 5 0 0 1 4.516 2.851C21.151 18.972 17.322 21 13 21c-2.761 0-5.1-.59-7-1.625L6 10.071A6.967 6.967 0 0 1 9.33 11.5zM5 19a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v9zM18 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6zm-7-3a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"
|
{/if}
|
||||||
/></svg
|
{#if store.state.jwtinfo.userdetails.permissions.includes("CONTACT:GET")}
|
||||||
>
|
<a
|
||||||
<span>{$_("donors")}</span>
|
class:activenav={$router.path.includes("/contacts/")}
|
||||||
</a>
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
{/if}
|
href="/contacts/"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:GET")}
|
>
|
||||||
<a
|
<svg
|
||||||
class:activenav={$router.path.includes("/donations/")}
|
fill="currentColor"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
href="/donations/"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
viewBox="0 0 24 24"
|
||||||
<svg
|
width="24"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
height="24"
|
||||||
fill="currentColor"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
<path
|
||||||
viewBox="0 0 24 24"
|
d="M2 22a8 8 0 1 1 16 0H2zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm10 4h4v2h-4v-2zm-3-5h7v2h-7v-2zm2-5h5v2h-5V7z"
|
||||||
width="24"
|
/></svg
|
||||||
height="24"
|
>
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
<span>{$_("contacts")}</span>
|
||||||
<path
|
</a>
|
||||||
d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z"
|
{/if}
|
||||||
/></svg
|
{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:GET")}
|
||||||
>
|
<a
|
||||||
<span>{$_("donations")}</span>
|
class:activenav={$router.path.includes("/scanstations/")}
|
||||||
</a>
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
{/if}
|
href="/scanstations/"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("TRACK:GET")}
|
>
|
||||||
<a
|
<svg
|
||||||
class:activenav={$router.path === "/tracks/"}
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
fill="currentColor"
|
||||||
href="/tracks/"
|
width="24"
|
||||||
>
|
height="24"
|
||||||
<svg
|
viewBox="0 0 24 24"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
fill="currentColor"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
width="24"
|
<path
|
||||||
height="24"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
d="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z"
|
||||||
viewBox="0 0 640 512"
|
/></svg
|
||||||
><path
|
>
|
||||||
fill="currentColor"
|
<span>{$_("scanstations")}</span>
|
||||||
d="M635.7 167.2L556.1 31.7c-8.8-15-28.3-20.1-43.5-11.5l-69 39.1L503.3 161c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L416 75l-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L333.2 122 278 153.3 337.8 255c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-59.7-101.7-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-27.9-47.5-55.2 31.3 59.7 101.7c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L84.9 262.9l-69 39.1C.7 310.7-4.6 329.8 4.2 344.8l79.6 135.6c8.8 15 28.3 20.1 43.5 11.5L624.1 210c15.2-8.6 20.4-27.8 11.6-42.8z"
|
</a>
|
||||||
/></svg
|
{/if}
|
||||||
>
|
{#if store.state.jwtinfo.userdetails.permissions.includes("STATSCLIENT:GET")}
|
||||||
<span>{$_("tracks")}</span>
|
<a
|
||||||
</a>
|
class:activenav={$router.path.includes("/statsclients/")}
|
||||||
{/if}
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("CARD:GET")}
|
href="/statsclients/"
|
||||||
<a
|
>
|
||||||
class:activenav={$router.path === "/cards/"}
|
<svg
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
href="/cards/"
|
fill="currentColor"
|
||||||
>
|
width="24"
|
||||||
<svg
|
height="24"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
viewBox="0 0 24 24"
|
||||||
fill="currentColor"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
width="24"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
height="24"
|
<path
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
fill="currentColor"
|
||||||
viewBox="0 0 24 24"
|
d="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z"
|
||||||
>
|
/></svg
|
||||||
<path fill="none" d="M0 0h24v24H0z" />
|
>
|
||||||
<path
|
<span>{$_("statsclients")}</span>
|
||||||
fill="currentColor"
|
</a>
|
||||||
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"
|
{/if}
|
||||||
/></svg
|
{#if store.state.jwtinfo.userdetails.permissions.includes("USER:GET")}
|
||||||
>
|
<a
|
||||||
<span>{$_("cards")}</span>
|
class:activenav={$router.path.includes("/users/")}
|
||||||
</a>
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
{/if}
|
href="/users/"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")}
|
>
|
||||||
<a
|
<svg
|
||||||
class:activenav={$router.path.includes("/scans/")}
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
width="24"
|
||||||
href="/scans/"
|
height="24"
|
||||||
>
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
<svg
|
fill="currentColor"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
viewBox="0 0 24 24"
|
||||||
fill="currentColor"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
width="24"
|
<path
|
||||||
height="24"
|
d="M12 14v8H4a8 8 0 018-8zm0-1a6 6 0 110-12 6 6 0 010 12zm2.6 5.81a3.51 3.51 0 010-1.62l-1-.57 1-1.74 1 .58a3.5 3.5 0 011.4-.82V13.5h2v1.15a3.5 3.5 0 011.4.8l1-.57 1 1.74-1 .57a3.51 3.51 0 010 1.62l1 .57-1 1.74-1-.58a3.5 3.5 0 01-1.4.82v1.14h-2v-1.15a3.5 3.5 0 01-1.4-.8l-1 .57-1-1.74 1-.57zM18 17a1 1 0 100 2 1 1 0 000-2z"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
/></svg
|
||||||
viewBox="0 0 24 24"
|
>
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
<span>{$_("users")}</span>
|
||||||
<path
|
</a>
|
||||||
fill="currentColor"
|
{/if}
|
||||||
d="M2 4h2v16H2V4zm4 0h1v16H6V4zm2 0h2v16H8V4zm3 0h2v16h-2V4zm3 0h2v16h-2V4zm3 0h1v16h-1V4zm2 0h3v16h-3V4z"
|
{#if store.state.jwtinfo.userdetails.permissions.includes("USERGROUP:GET")}
|
||||||
/></svg
|
<a
|
||||||
>
|
class:activenav={$router.path.includes("/groups/")}
|
||||||
<span>Scans</span>
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
</a>
|
href="/groups/"
|
||||||
{/if}
|
>
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("CONTACT:GET")}
|
<svg
|
||||||
<a
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
class:activenav={$router.path.includes("/contacts/")}
|
fill="currentColor"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
width="24"
|
||||||
href="/contacts/"
|
height="24"
|
||||||
>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<svg
|
viewBox="0 0 640 512"
|
||||||
fill="currentColor"
|
><path
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"
|
||||||
viewBox="0 0 24 24"
|
/></svg
|
||||||
width="24"
|
>
|
||||||
height="24"
|
<span>{$_("user-groups")}</span>
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
</a>
|
||||||
<path
|
{/if}
|
||||||
d="M2 22a8 8 0 1 1 16 0H2zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm10 4h4v2h-4v-2zm-3-5h7v2h-7v-2zm2-5h5v2h-5V7z"
|
<a
|
||||||
/></svg
|
class:activenav={$router.path === "/settings/"}
|
||||||
>
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
<span>{$_("contacts")}</span>
|
href="/settings/"
|
||||||
</a>
|
>
|
||||||
{/if}
|
<svg
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:GET")}
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
<a
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class:activenav={$router.path.includes("/scanstations/")}
|
viewBox="0 0 20 20"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
fill="currentColor"
|
||||||
href="/scanstations/"
|
>
|
||||||
>
|
<path
|
||||||
<svg
|
fill-rule="evenodd"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z"
|
||||||
fill="currentColor"
|
clip-rule="evenodd"
|
||||||
width="24"
|
/>
|
||||||
height="24"
|
</svg>
|
||||||
viewBox="0 0 24 24"
|
<span>{$_("settings")}</span>
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
</a>
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
<a
|
||||||
<path
|
class:activenav={$router.path === "/about/"}
|
||||||
fill="currentColor"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
d="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z"
|
href="/about/"
|
||||||
/></svg
|
>
|
||||||
>
|
<svg
|
||||||
<span>{$_("scanstations")}</span>
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
</a>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
{/if}
|
fill="none"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("STATSCLIENT:GET")}
|
stroke="currentColor"
|
||||||
<a
|
stroke-width="2"
|
||||||
class:activenav={$router.path.includes("/statsclients/")}
|
stroke-linecap="round"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
stroke-linejoin="round"
|
||||||
href="/statsclients/"
|
viewBox="0 0 24 24"
|
||||||
>
|
><circle cx="12" cy="12" r="10" />
|
||||||
<svg
|
<path d="M12 16v-4M12 8h.01" /></svg
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
>
|
||||||
fill="currentColor"
|
<span>{$_("about")}</span>
|
||||||
width="24"
|
</a>
|
||||||
height="24"
|
<button
|
||||||
viewBox="0 0 24 24"
|
tabindex="0"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
on:click={() => {
|
||||||
<path
|
AuthService.authControllerLogout();
|
||||||
fill="currentColor"
|
logout();
|
||||||
d="M4 5v11h16V5H4zM2 4a1 1 0 011-1h18a1 1 0 011 1v14H2V4zM1 19h22v2H1v-2z"
|
}}
|
||||||
/></svg
|
>
|
||||||
>
|
<svg
|
||||||
<span>{$_("statsclients")}</span>
|
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
||||||
</a>
|
fill="currentColor"
|
||||||
{/if}
|
width="24"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("USER:GET")}
|
height="24"
|
||||||
<a
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class:activenav={$router.path.includes("/users/")}
|
viewBox="0 0 24 24"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
href="/users/"
|
<path
|
||||||
>
|
d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2a9.985 9.985 0 0 1 8 4h-2.71a8 8 0 1 0 .001 12h2.71A9.985 9.985 0 0 1 12 22zm7-6v-3h-8v-2h8V8l5 4-5 4z"
|
||||||
<svg
|
/></svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
>
|
||||||
width="24"
|
<span>{$_("logout")}</span>
|
||||||
height="24"
|
</button>
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
</nav>
|
||||||
fill="currentColor"
|
</div>
|
||||||
viewBox="0 0 24 24"
|
<div class="ml-0 transition md:ml-60">
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
<header
|
||||||
<path
|
class="flex items-center w-full px-4 bg-white border-b h-14 md:hidden"
|
||||||
d="M12 14v8H4a8 8 0 018-8zm0-1a6 6 0 110-12 6 6 0 010 12zm2.6 5.81a3.51 3.51 0 010-1.62l-1-.57 1-1.74 1 .58a3.5 3.5 0 011.4-.82V13.5h2v1.15a3.5 3.5 0 011.4.8l1-.57 1 1.74-1 .57a3.51 3.51 0 010 1.62l1 .57-1 1.74-1-.58a3.5 3.5 0 01-1.4.82v1.14h-2v-1.15a3.5 3.5 0 01-1.4-.8l-1 .57-1-1.74 1-.57zM18 17a1 1 0 100 2 1 1 0 000-2z"
|
>
|
||||||
/></svg
|
<button
|
||||||
>
|
on:click={() => {
|
||||||
<span>{$_("users")}</span>
|
navOpen = true;
|
||||||
</a>
|
}}
|
||||||
{/if}
|
class="block btn btn-light md:hidden"
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("USERGROUP:GET")}
|
>
|
||||||
<a
|
<span class="sr-only">Menu</span><svg
|
||||||
class:activenav={$router.path.includes("/groups/")}
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
fill="none"
|
||||||
href="/groups/"
|
viewBox="0 0 24 24"
|
||||||
>
|
stroke-width="1.5"
|
||||||
<svg
|
stroke="currentColor"
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
class="size-6"
|
||||||
fill="currentColor"
|
>
|
||||||
width="24"
|
<path
|
||||||
height="24"
|
stroke-linecap="round"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
stroke-linejoin="round"
|
||||||
viewBox="0 0 640 512"
|
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"
|
||||||
><path
|
/>
|
||||||
fill="currentColor"
|
</svg>
|
||||||
d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"
|
</button>
|
||||||
/></svg
|
<span class="inline-block">
|
||||||
>
|
<img src="/lfk-logo.png" alt="Logo" class="h-8 inline-block" />
|
||||||
<span>{$_("user-groups")}</span>
|
<span class="text-lg font-bold">LfK!Admin</span>
|
||||||
</a>
|
</span>
|
||||||
{/if}
|
</header>
|
||||||
<h2 class="px-4 py-2 text-xs font-semibold text-gray-600 uppercase">
|
<Toaster position="top-right" />
|
||||||
{$_("system")}
|
<slot>
|
||||||
</h2>
|
<NoComponentLoaded />
|
||||||
<a
|
</slot>
|
||||||
class:activenav={$router.path === "/settings/"}
|
</div>
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
{#if navOpen === true}
|
||||||
href="/settings/"
|
<button
|
||||||
>
|
on:click={() => {
|
||||||
<svg
|
navOpen = false;
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
}}
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
class:hidden={!navOpen}
|
||||||
viewBox="0 0 20 20"
|
class="fixed inset-0 z-10 w-screen h-screen bg-black bg-opacity-25 md:hidden"
|
||||||
fill="currentColor"
|
/>
|
||||||
>
|
{/if}
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
<span>{$_("settings")}</span>
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
class:activenav={$router.path === "/about/"}
|
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
|
||||||
href="/about/"
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
stroke-width="2"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
><circle cx="12" cy="12" r="10" />
|
|
||||||
<path d="M12 16v-4M12 8h.01" /></svg
|
|
||||||
>
|
|
||||||
<span>{$_("about")}</span>
|
|
||||||
</a>
|
|
||||||
<button
|
|
||||||
tabindex="0"
|
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
|
|
||||||
on:click={() => {
|
|
||||||
AuthService.authControllerLogout();
|
|
||||||
logout();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
|
|
||||||
fill="currentColor"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
|
||||||
<path
|
|
||||||
d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2a9.985 9.985 0 0 1 8 4h-2.71a8 8 0 1 0 .001 12h2.71A9.985 9.985 0 0 1 12 22zm7-6v-3h-8v-2h8V8l5 4-5 4z"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<span>{$_("logout")}</span>
|
|
||||||
</button>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
<div class="ml-0 transition md:ml-60">
|
|
||||||
<header
|
|
||||||
class="flex items-center w-full px-4 bg-white border-b h-14 md:hidden"
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
navOpen = true;
|
|
||||||
}}
|
|
||||||
class="block btn btn-light md:hidden"
|
|
||||||
>
|
|
||||||
<span class="sr-only">Menu</span><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
class="size-6"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<span class="inline-block">
|
|
||||||
<img src="/lfk-logo.png" alt="Logo" class="h-8 inline-block" />
|
|
||||||
<span class="text-lg font-bold">LfK!Admin</span>
|
|
||||||
</span>
|
|
||||||
</header>
|
|
||||||
<Toaster position="top-right" />
|
|
||||||
<slot>
|
|
||||||
<NoComponentLoaded />
|
|
||||||
</slot>
|
|
||||||
</div>
|
|
||||||
{#if navOpen === true}
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
navOpen = false;
|
|
||||||
}}
|
|
||||||
class:hidden={!navOpen}
|
|
||||||
class="fixed inset-0 z-10 w-screen h-screen bg-black bg-opacity-25 md:hidden"
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.collapsed_navigation {
|
.collapsed_navigation {
|
||||||
transform: translateX(-100%);
|
transform: translateX(-100%);
|
||||||
}
|
}
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
.collapsed_navigation {
|
.collapsed_navigation {
|
||||||
transform: translateX(0px);
|
transform: translateX(0px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -220,24 +220,7 @@
|
|||||||
<StatCard
|
<StatCard
|
||||||
title={$_("runner_via_selfservice")}
|
title={$_("runner_via_selfservice")}
|
||||||
value={stats.runnersViaSelfservice}
|
value={stats.runnersViaSelfservice}
|
||||||
href="/runners/?created_via=selfservice"
|
href="/runners/"
|
||||||
>
|
|
||||||
<svg
|
|
||||||
height="24"
|
|
||||||
width="24"
|
|
||||||
fill="currentColor"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
><path d="M0 0h24v24H0z" fill="none" />
|
|
||||||
<path
|
|
||||||
d="M13.49 5.48c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-3.6 13.9l1-4.4 2.1 2v6h2v-7.5l-2.1-2 .6-3c1.3 1.5 3.3 2.5 5.5 2.5v-2c-1.9 0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5.1-.8.1l-5.2 2.2v4.7h2v-3.4l1.8-.7-1.6 8.1-4.9-1-.4 2 7 1.4z"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
</StatCard>
|
|
||||||
<StatCard
|
|
||||||
title={$_('runners_via_kiosk')}
|
|
||||||
value={stats.runnersViaKiosk}
|
|
||||||
href="/runners/?created_via=kiosk"
|
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
height="24"
|
height="24"
|
||||||
@ -255,7 +238,7 @@
|
|||||||
{:catch error}
|
{:catch error}
|
||||||
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
<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">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,380 +1,340 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { clickOutside } from "../base/outsideclick";
|
import { clickOutside } from "../base/outsideclick";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
DonationService,
|
DonationService,
|
||||||
DonorService,
|
DonorService,
|
||||||
RunnerService,
|
RunnerService,
|
||||||
} from "@odit/lfk-client-js";
|
} from "@odit/lfk-client-js";
|
||||||
import Select from "svelte-select";
|
import Select from "svelte-select";
|
||||||
import { createEventDispatcher, onMount } from "svelte";
|
import { createEventDispatcher, onMount } from "svelte";
|
||||||
import toast from "svelte-french-toast";
|
import toast from "svelte-french-toast";
|
||||||
export let modal_open;
|
export let modal_open;
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
const getDonorLabel = (option) =>
|
const getDonorLabel = (option) =>
|
||||||
option.firstname + " " + (option.middlename || "") + " " + option.lastname;
|
option.firstname + " " + (option.middlename || "") + " " + option.lastname;
|
||||||
const filterDonors = (label, filterText, option) =>
|
const filterDonors = (label, filterText, option) =>
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
option.value.id.toString().startsWith(filterText.toLowerCase());
|
option.value.id.toString().startsWith(filterText.toLowerCase());
|
||||||
$: donor = 0;
|
$: donor = 0;
|
||||||
$: runner = 0;
|
$: runner = 0;
|
||||||
$: donors = [];
|
$: donors = [];
|
||||||
$: runners = [];
|
$: runners = [];
|
||||||
$: type = "distance";
|
$: is_fixed = false;
|
||||||
$: is_paid = false;
|
$: is_paid = false;
|
||||||
$: amount_input = 0;
|
$: amount_input = 0;
|
||||||
$: processed_last_submit = true;
|
$: processed_last_submit = true;
|
||||||
$: is_amount_valid = amount_input > 0;
|
$: is_amount_valid = amount_input > 0;
|
||||||
$: createbtnenabled = is_amount_valid;
|
$: createbtnenabled = is_amount_valid;
|
||||||
(() => {
|
(() => {
|
||||||
document.onkeydown = (e) => {
|
document.onkeydown = (e) => {
|
||||||
e = e || window.event;
|
e = e || window.event;
|
||||||
if (e.key === "Escape") {
|
if (e.key === "Escape") {
|
||||||
modal_open = false;
|
modal_open = false;
|
||||||
}
|
}
|
||||||
if (e.keyCode === 13) {
|
if (e.keyCode === 13) {
|
||||||
if (createbtnenabled === true) {
|
if (createbtnenabled === true) {
|
||||||
createbtnenabled = false;
|
createbtnenabled = false;
|
||||||
submit();
|
submit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
function submit() {
|
function submit() {
|
||||||
if (processed_last_submit === true) {
|
if (processed_last_submit === true) {
|
||||||
let amount_cent = Math.floor(amount_input * 100);
|
let amount_cent = Math.floor(amount_input * 100);
|
||||||
processed_last_submit = false;
|
processed_last_submit = false;
|
||||||
toast.loading($_("adding-donation"));
|
toast.loading($_("adding-donation"));
|
||||||
if (type === "fixed") {
|
if (is_fixed) {
|
||||||
let postdata = {
|
let postdata = {
|
||||||
donor,
|
donor,
|
||||||
amount: amount_cent,
|
amount: amount_cent,
|
||||||
paidAmount: 0,
|
paidAmount: 0,
|
||||||
};
|
};
|
||||||
if (is_paid) {
|
if (is_paid) {
|
||||||
postdata.paidAmount = amount_cent;
|
postdata.paidAmount = amount_cent;
|
||||||
}
|
}
|
||||||
DonationService.donationControllerPostFixed(postdata)
|
DonationService.donationControllerPostFixed(postdata)
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
donor = donors[0].id || 0;
|
donor = donors[0].id || 0;
|
||||||
runner = runners[0].id || 0;
|
runner = runners[0].id || 0;
|
||||||
amount_input = 0;
|
amount_input = 0;
|
||||||
modal_open = false;
|
modal_open = false;
|
||||||
//
|
//
|
||||||
toast.dismiss();
|
toast.dismiss();
|
||||||
toast.success($_("donation_added"));
|
toast.success($_("donation_added"));
|
||||||
dispatch("created", { donations: [result] });
|
dispatch("created", { donations: [result] });
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
//
|
//
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
processed_last_submit = true;
|
processed_last_submit = true;
|
||||||
});
|
});
|
||||||
} else if (type === "anonymous") {
|
} else {
|
||||||
let postdata = {
|
let postdata = {
|
||||||
amount: amount_cent,
|
donor,
|
||||||
};
|
runner,
|
||||||
DonationService.donationControllerPostAnonymous(postdata)
|
amountPerDistance: amount_cent,
|
||||||
.then((result) => {
|
};
|
||||||
amount_input = 0;
|
DonationService.donationControllerPostDistance(postdata)
|
||||||
modal_open = false;
|
.then((result) => {
|
||||||
//
|
donor = donors[0].id || 0;
|
||||||
toast.dismiss();
|
runner = runners[0].id || 0;
|
||||||
toast.success($_("donation_added"));
|
amount_input = 0;
|
||||||
dispatch("created", { donations: [result] });
|
modal_open = false;
|
||||||
})
|
//
|
||||||
.catch((err) => {
|
toast.dismiss();
|
||||||
//
|
toast.success($_("donation_added"));
|
||||||
})
|
dispatch("created", { donations: [result] });
|
||||||
.finally(() => {
|
})
|
||||||
processed_last_submit = true;
|
.catch((err) => {
|
||||||
});
|
//
|
||||||
} else if (type === "distance") {
|
})
|
||||||
let postdata = {
|
.finally(() => {
|
||||||
donor,
|
processed_last_submit = true;
|
||||||
runner,
|
});
|
||||||
amountPerDistance: amount_cent,
|
}
|
||||||
};
|
}
|
||||||
DonationService.donationControllerPostDistance(postdata)
|
}
|
||||||
.then((result) => {
|
|
||||||
donor = donors[0].id || 0;
|
|
||||||
runner = runners[0].id || 0;
|
|
||||||
amount_input = 0;
|
|
||||||
modal_open = false;
|
|
||||||
//
|
|
||||||
toast.dismiss();
|
|
||||||
toast.success($_("donation_added"));
|
|
||||||
dispatch("created", { donations: [result] });
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
//
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
processed_last_submit = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
donors = (await DonorService.donorControllerGetAll()).map((r) => {
|
donors = (await DonorService.donorControllerGetAll()).map(
|
||||||
return { label: getDonorLabel(r), value: r };
|
(r) => {
|
||||||
});
|
return { label: getDonorLabel(r), value: r };
|
||||||
runners = (await RunnerService.runnerControllerGetAll()).map((r) => {
|
}
|
||||||
return { label: getDonorLabel(r), value: r };
|
);
|
||||||
});
|
runners = (await RunnerService.runnerControllerGetAll()).map(
|
||||||
});
|
(r) => {
|
||||||
|
return { label: getDonorLabel(r), value: r };
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if modal_open}
|
{#if modal_open}
|
||||||
<div
|
<div
|
||||||
class="fixed z-10 inset-0 overflow-y-hidden"
|
class="fixed z-10 inset-0 overflow-y-hidden"
|
||||||
use:clickOutside
|
use:clickOutside
|
||||||
on:click_outside={() => {
|
on:click_outside={() => {
|
||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="flex items-end justify-center h-screen text-center sm:block p-0 lg:p-4"
|
class="flex items-end justify-center h-screen text-center sm:block p-0 lg:p-4"
|
||||||
>
|
>
|
||||||
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
|
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
|
||||||
<div
|
<div
|
||||||
class="absolute inset-0 bg-neutral-500 opacity-75"
|
class="absolute inset-0 bg-gray-500 opacity-75"
|
||||||
data-id="modal_backdrop"
|
data-id="modal_backdrop"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<span
|
<span
|
||||||
class="hidden sm:inline-block sm:align-middle sm:h-screen"
|
class="hidden sm:inline-block sm:align-middle sm:h-screen"
|
||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
>
|
>
|
||||||
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl">
|
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl">
|
||||||
<div class="">
|
<div class="">
|
||||||
<div
|
<div
|
||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
><path fill="none" d="M0 0h24v24H0z" />
|
><path fill="none" d="M0 0h24v24H0z" />
|
||||||
<path
|
<path
|
||||||
d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z"
|
d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z"
|
||||||
/></svg
|
/></svg
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<h3 class="text-xl leading-6 font-medium text-neutral-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
{$_("add-donation")}
|
{#if is_fixed}
|
||||||
|
{$_("create-a-new-fixed-donation")}
|
||||||
|
{:else}{$_("create-a-new-distance-donation")}{/if}
|
||||||
</h3>
|
</h3>
|
||||||
<nav
|
<label class="content-center align-middle object-center">
|
||||||
class="relative z-0 flex border border-neutral-200 rounded-xl overflow-hidden mb-2"
|
<span class="text-base" class:text-gray-300={is_fixed}
|
||||||
>
|
>{$_("distance-donation")}</span
|
||||||
<button
|
>
|
||||||
on:click={() => {
|
<input
|
||||||
type = "distance";
|
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="button"
|
bind:checked={is_fixed}
|
||||||
id="bar-with-underline-item-1"
|
/>
|
||||||
class:donation_active_tab={type === "distance"}
|
<span class="ml-2 text-base" class:text-gray-300={!is_fixed}
|
||||||
class:donation_inactive_tab={type !== "distance"}
|
>{$_("fixed-donation")}</span
|
||||||
aria-selected={type === "distance"}
|
>
|
||||||
role="tab"
|
</label>
|
||||||
>
|
<div class="mb-6">
|
||||||
{$_("spende_pro_km")}
|
<p class="text-sm text-gray-500">
|
||||||
</button>
|
{$_(
|
||||||
<button
|
"please-provide-the-nessecary-information-to-create-a-new-donation"
|
||||||
on:click={() => {
|
)}
|
||||||
type = "fixed";
|
</p>
|
||||||
}}
|
</div>
|
||||||
type="button"
|
<div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
|
||||||
id="bar-with-underline-item-2"
|
<div class="col-span-6">
|
||||||
class:donation_active_tab={type === "fixed"}
|
<label
|
||||||
class:donation_inactive_tab={type !== "fixed"}
|
for="donor"
|
||||||
aria-selected={type === "fixed"}
|
class="block text-sm font-medium text-gray-700"
|
||||||
role="tab"
|
>{$_("donor")}</label
|
||||||
>
|
>
|
||||||
{$_("festbetrag")}
|
<Select
|
||||||
</button>
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
<button
|
itemFilter={(label, filterText, option) =>
|
||||||
on:click={() => {
|
filterDonors(label, filterText, option)}
|
||||||
type = "anonymous";
|
items={donors}
|
||||||
}}
|
showChevron={true}
|
||||||
type="button"
|
placeholder={$_("search-for-donor-name-or-id")}
|
||||||
id="bar-with-underline-item-3"
|
noOptionsMessage={$_("no-donors-found")}
|
||||||
class:donation_active_tab={type === "anonymous"}
|
on:select={(selectedValue) =>
|
||||||
class:donation_inactive_tab={type !== "anonymous"}
|
(donor = selectedValue.detail.value.id)}
|
||||||
aria-selected={type === "anonymous"}
|
on:clear={() => (donors = null)}
|
||||||
role="tab"
|
/>
|
||||||
>
|
</div>
|
||||||
{$_("anonyme_spende")}
|
{#if !is_fixed}
|
||||||
</button>
|
<div class="col-span-6">
|
||||||
</nav>
|
<label
|
||||||
|
for="donor"
|
||||||
<div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
|
class="block text-sm font-medium text-gray-700"
|
||||||
{#if type === "anonymous"}
|
>{$_("runner")}</label
|
||||||
<div class="col-span-6">
|
>
|
||||||
<label
|
<Select
|
||||||
for="donation_amount_eur"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
class="block text-sm font-medium text-neutral-900"
|
itemFilter={(label, filterText, option) =>
|
||||||
>
|
filterDonors(label, filterText, option)}
|
||||||
{$_("donation-amount")}</label
|
items={runners}
|
||||||
>
|
showChevron={true}
|
||||||
<div class="mt-1 flex rounded-md shadow-sm">
|
placeholder={$_("search-for-runner-by-name-or-id")}
|
||||||
<input
|
noOptionsMessage={$_("no-runners-found")}
|
||||||
autocomplete="off"
|
on:select={(selectedValue) =>
|
||||||
class:border-red-500={!is_amount_valid}
|
(runner = selectedValue.detail.value.id)}
|
||||||
class:focus:border-red-500={!is_amount_valid}
|
on:clear={() => (runner = null)}
|
||||||
class:focus:ring-red-500={!is_amount_valid}
|
/>
|
||||||
bind:value={amount_input}
|
</div>
|
||||||
type="number"
|
{/if}
|
||||||
step="0.01"
|
<div class="col-span-6">
|
||||||
name="donation_amount_eur"
|
<label
|
||||||
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
for="donation_amount_eur"
|
||||||
placeholder="2.00"
|
class="block text-sm font-medium text-gray-700"
|
||||||
/>
|
>
|
||||||
<span
|
{#if !is_fixed}
|
||||||
class="inline-flex items-center px-3 rounded-r-md border border-neutral-300 bg-neutral-50 text-neutral-500 text-sm"
|
{$_("amount-per-kilometer")}
|
||||||
>€</span
|
{:else}{$_("donation-amount")}{/if}</label
|
||||||
>
|
>
|
||||||
</div>
|
<div class="mt-1 flex rounded-md shadow-sm">
|
||||||
{#if !is_amount_valid}
|
<input
|
||||||
<span
|
autocomplete="off"
|
||||||
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
|
class:border-red-500={!is_amount_valid}
|
||||||
>
|
class:focus:border-red-500={!is_amount_valid}
|
||||||
{$_("donation-amount-must-be-greater-that-0-00eur")}
|
class:focus:ring-red-500={!is_amount_valid}
|
||||||
</span>
|
bind:value={amount_input}
|
||||||
{/if}
|
type="number"
|
||||||
</div>
|
step="0.01"
|
||||||
{:else}
|
name="donation_amount_eur"
|
||||||
<div class="col-span-6">
|
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 p-2"
|
||||||
<label
|
placeholder="2.00"
|
||||||
for="donor"
|
/>
|
||||||
class="block text-sm font-medium text-neutral-900"
|
<span
|
||||||
>{$_("donor")}</label
|
class="inline-flex items-center px-3 rounded-r-md border border-gray-300 bg-gray-50 text-gray-500 text-sm"
|
||||||
>
|
>€</span
|
||||||
<Select
|
>
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 rounded-md p-2"
|
</div>
|
||||||
itemFilter={(label, filterText, option) =>
|
{#if !is_amount_valid}
|
||||||
filterDonors(label, filterText, option)}
|
<span
|
||||||
items={donors}
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
|
||||||
showChevron={true}
|
>
|
||||||
placeholder={$_("search-for-donor-name-or-id")}
|
{$_("donation-amount-must-be-greater-that-0-00eur")}
|
||||||
noOptionsMessage={$_("no-donors-found")}
|
</span>
|
||||||
on:select={(selectedValue) =>
|
{/if}
|
||||||
(donor = selectedValue.detail.value.id)}
|
</div>
|
||||||
on:clear={() => (donors = null)}
|
{#if is_fixed}
|
||||||
/>
|
<div class="col-span-6">
|
||||||
</div>
|
<label
|
||||||
{#if type === "distance"}
|
for="paid"
|
||||||
<div class="col-span-6">
|
class="block text-sm font-medium text-gray-700"
|
||||||
<label
|
>{$_("already-paid")}</label
|
||||||
for="donor"
|
>
|
||||||
class="block text-sm font-medium text-neutral-900"
|
<p class="text-gray-500">
|
||||||
>{$_("runner")}</label
|
<input
|
||||||
>
|
id="paid"
|
||||||
<Select
|
bind:checked={is_paid}
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 rounded-md p-2"
|
name="paid"
|
||||||
itemFilter={(label, filterText, option) =>
|
type="checkbox"
|
||||||
filterDonors(label, filterText, option)}
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
items={runners}
|
/>
|
||||||
showChevron={true}
|
<span class="align-text-bottom">
|
||||||
placeholder={$_("search-for-runner-by-name-or-id")}
|
{#if is_paid}
|
||||||
noOptionsMessage={$_("no-runners-found")}
|
{$_("paid")}
|
||||||
on:select={(selectedValue) =>
|
{:else}
|
||||||
(runner = selectedValue.detail.value.id)}
|
{$_("open")}
|
||||||
on:clear={() => (runner = null)}
|
{/if}
|
||||||
/>
|
</span>
|
||||||
</div>
|
</p>
|
||||||
{/if}
|
</div>
|
||||||
<div class="col-span-6">
|
{/if}
|
||||||
<label
|
</div>
|
||||||
for="donation_amount_eur"
|
</div>
|
||||||
class="block text-sm font-medium text-neutral-900"
|
</div>
|
||||||
>
|
</div>
|
||||||
{#if type === "fixed"}
|
<div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
|
||||||
{$_("donation-amount")}
|
<button
|
||||||
{:else}{$_("amount-per-kilometer")}{/if}</label
|
disabled={!createbtnenabled}
|
||||||
>
|
class:opacity-50={!createbtnenabled}
|
||||||
<div class="mt-1 flex rounded-md shadow-sm">
|
on:click={submit}
|
||||||
<input
|
type="button"
|
||||||
autocomplete="off"
|
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"
|
||||||
class:border-red-500={!is_amount_valid}
|
>
|
||||||
class:focus:border-red-500={!is_amount_valid}
|
{$_("create")}
|
||||||
class:focus:ring-red-500={!is_amount_valid}
|
</button>
|
||||||
bind:value={amount_input}
|
<button
|
||||||
type="number"
|
on:click={() => {
|
||||||
step="0.01"
|
modal_open = false;
|
||||||
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 border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
type="button"
|
||||||
placeholder="2.00"
|
class="w-full 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 hidden lg:block"
|
||||||
/>
|
>
|
||||||
<span
|
{$_("cancel")}
|
||||||
class="inline-flex items-center px-3 rounded-r-md border border-neutral-300 bg-neutral-50 text-neutral-500 text-sm"
|
</button>
|
||||||
>€</span
|
</div>
|
||||||
>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#if !is_amount_valid}
|
</div>
|
||||||
<span
|
|
||||||
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1"
|
|
||||||
>
|
|
||||||
{$_("donation-amount-must-be-greater-that-0-00eur")}
|
|
||||||
</span>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
{#if type === "fixed"}
|
|
||||||
<div class="flex">
|
|
||||||
<input
|
|
||||||
bind:checked={is_paid}
|
|
||||||
type="checkbox"
|
|
||||||
class="shrink-0 mt-0.5 border-neutral-200 rounded-sm text-blue-600 focus:ring-blue-500 checked:border-blue-500 disabled:opacity-50 disabled:pointer-events-none"
|
|
||||||
id="hs-default-checkbox"
|
|
||||||
/>
|
|
||||||
<label
|
|
||||||
for="hs-default-checkbox"
|
|
||||||
class="text-base text-neutral-900 ms-2 font-medium"
|
|
||||||
>{$_("already-paid")}</label
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="bg-neutral-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10"
|
|
||||||
>
|
|
||||||
<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"
|
|
||||||
>
|
|
||||||
{$_("create")}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
modal_open = false;
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="w-full justify-center rounded-md border border-neutral-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-neutral-900 hover:bg-neutral-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 hidden lg:block"
|
|
||||||
>
|
|
||||||
{$_("cancel")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.toggle:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
width: 1.25rem;
|
||||||
|
height: 1.25rem;
|
||||||
|
border-radius: 50%;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
transform: scale(1.1);
|
||||||
|
box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.2);
|
||||||
|
background-color: white;
|
||||||
|
transition: 0.2s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle:checked {
|
||||||
|
/* @apply: bg-indigo-400; */
|
||||||
|
background-color: #7f9cf5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle:checked:before {
|
||||||
|
left: 1.25rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@ -96,7 +96,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -107,7 +107,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -194,7 +194,7 @@
|
|||||||
payment_modal_open = false;
|
payment_modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
firstname: "",
|
firstname: "",
|
||||||
lastname: "",
|
lastname: "",
|
||||||
},
|
},
|
||||||
amount: 0,
|
|
||||||
};
|
};
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
@ -58,7 +57,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -69,7 +68,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -81,18 +80,14 @@
|
|||||||
/></svg
|
/></svg
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-3 sm:text-left max-h-[75vh]">
|
<div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
|
||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
{$_("please-confirm-the-deletion-of-donation")}
|
{$_("please-confirm-the-deletion-of-donation")}
|
||||||
</h3>
|
</h3>
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<span class="inline-block"
|
<span class="inline-block"
|
||||||
>{#if delete_donation.donor}<b>{$_("donor")}</b>: {delete_donation.donor.firstname}
|
><b>{$_("donor")}</b>: {delete_donation.donor.firstname}
|
||||||
{delete_donation.donor.lastname}{:else}{$_("anonymer_sponsor")}{/if}
|
{delete_donation.donor.lastname}</span
|
||||||
<br>
|
|
||||||
<b>{$_("amount")}</b>: {`${(delete_donation.amount / 100)
|
|
||||||
.toFixed(2)
|
|
||||||
.toLocaleString("de-DE", { valute: "EUR" })}€`}</span
|
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -102,7 +97,7 @@
|
|||||||
<button
|
<button
|
||||||
on:click={submit}
|
on:click={submit}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("delete")}
|
{$_("delete")}
|
||||||
</button>
|
</button>
|
||||||
@ -111,7 +106,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -236,7 +236,7 @@
|
|||||||
>{$_("donor")}</label
|
>{$_("donor")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
filterDonors(label, filterText, option)}
|
filterDonors(label, filterText, option)}
|
||||||
items={current_donors}
|
items={current_donors}
|
||||||
@ -259,7 +259,7 @@
|
|||||||
>{$_("runner")}</label
|
>{$_("runner")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
filterDonors(label, filterText, option)}
|
filterDonors(label, filterText, option)}
|
||||||
items={current_runners}
|
items={current_runners}
|
||||||
|
@ -1,21 +1,18 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
export let donor;
|
export let donor;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if !donor || donor.firstname == 0}
|
{#if !donor || donor.firstname == 0}
|
||||||
<span
|
{$_("donor-has-no-associated-donations")}
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800 border border-current"
|
|
||||||
>{$_('anonymer_sponsor')}</span
|
|
||||||
>
|
|
||||||
{:else}
|
{:else}
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<a
|
<a
|
||||||
href="../donors/{donor.id}"
|
href="../donors/{donor.id}"
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800 border border-current"
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800 border border-current"
|
||||||
>{donor.firstname}
|
>{donor.firstname}
|
||||||
{#if donor.middlename}{donor.middlename}{/if}
|
{#if donor.middlename}{donor.middlename}{/if}
|
||||||
{donor.lastname}</a
|
{donor.lastname}</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -1,28 +1,21 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import TableActions from "../shared/TableActions.svelte";
|
import TableActions from "../shared/TableActions.svelte";
|
||||||
|
|
||||||
export let detailsLink;
|
export let detailsLink;
|
||||||
export let detailsAction;
|
export let detailsAction;
|
||||||
export let deleteEnabled;
|
export let deleteEnabled;
|
||||||
export let deleteAction;
|
export let deleteAction;
|
||||||
export let paymentAction;
|
export let paymentAction;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if paymentAction}
|
<button
|
||||||
<button
|
on:click={paymentAction}
|
||||||
on:click={paymentAction}
|
class="text-[#025a21] hover:text-green-900 mr-4">{$_("enter-payment")}</button
|
||||||
class="text-[#025a21] cursor-pointer hover:text-green-900 mr-4"
|
>
|
||||||
>{$_("enter-payment")}</button
|
|
||||||
>
|
|
||||||
{:else}
|
|
||||||
<span class="inline-block opacity-0 cursor-default mr-4" style=""
|
|
||||||
>{$_("enter-payment")}</span
|
|
||||||
>
|
|
||||||
{/if}
|
|
||||||
<TableActions
|
<TableActions
|
||||||
bind:detailsAction
|
bind:detailsAction
|
||||||
bind:detailsLink
|
bind:detailsLink
|
||||||
bind:deleteAction
|
bind:deleteAction
|
||||||
bind:deleteEnabled
|
bind:deleteEnabled
|
||||||
/>
|
/>
|
||||||
|
@ -112,25 +112,18 @@
|
|||||||
accessorKey: "actions",
|
accessorKey: "actions",
|
||||||
header: () => $_("action"),
|
header: () => $_("action"),
|
||||||
cell: (info) => {
|
cell: (info) => {
|
||||||
let detailsLink
|
|
||||||
let paymentAction
|
|
||||||
if (info.row.original.donor != undefined){
|
|
||||||
detailsLink = `./${info.row.original.id}`
|
|
||||||
paymentAction = () => {
|
|
||||||
active_edits = current_donations.filter(
|
|
||||||
(r) => r.id == info.row.original.id
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return renderComponent(DonationTableAction, {
|
return renderComponent(DonationTableAction, {
|
||||||
detailsLink: detailsLink,
|
detailsLink: `./${info.row.original.id}`,
|
||||||
deleteAction: () => {
|
deleteAction: () => {
|
||||||
active_deletes = current_donations.filter(
|
active_deletes = current_donations.filter(
|
||||||
(r) => r.id == info.row.original.id
|
(r) => r.id == info.row.original.id
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
paymentAction: paymentAction,
|
paymentAction: () => {
|
||||||
|
active_edits = current_donations.filter(
|
||||||
|
(r) => r.id == info.row.original.id
|
||||||
|
);
|
||||||
|
},
|
||||||
deleteEnabled:
|
deleteEnabled:
|
||||||
store.state.jwtinfo.userdetails.permissions.includes(
|
store.state.jwtinfo.userdetails.permissions.includes(
|
||||||
"DONATION:DELETE"
|
"DONATION:DELETE"
|
||||||
@ -247,6 +240,14 @@
|
|||||||
<thead class="border-b border-gray-400">
|
<thead class="border-b border-gray-400">
|
||||||
{#each $table.getHeaderGroups() as headerGroup}
|
{#each $table.getHeaderGroups() as headerGroup}
|
||||||
<tr class="select-none">
|
<tr class="select-none">
|
||||||
|
<th class="inset-y-0 left-0 px-4 py-2 text-left w-px">
|
||||||
|
<InputElement
|
||||||
|
type="checkbox"
|
||||||
|
checked={$table.getIsAllRowsSelected()}
|
||||||
|
indeterminate={$table.getIsSomeRowsSelected()}
|
||||||
|
on:change={() => $table.toggleAllRowsSelected()}
|
||||||
|
/>
|
||||||
|
</th>
|
||||||
{#each headerGroup.headers as header}
|
{#each headerGroup.headers as header}
|
||||||
<TableHeader {header} />
|
<TableHeader {header} />
|
||||||
{/each}
|
{/each}
|
||||||
@ -256,6 +257,13 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{#each $table.getRowModel().rows as row}
|
{#each $table.getRowModel().rows as row}
|
||||||
<tr class="odd:bg-white even:bg-gray-100">
|
<tr class="odd:bg-white even:bg-gray-100">
|
||||||
|
<td class="inset-y-0 left-0 px-4 py-2 text-center w-px">
|
||||||
|
<InputElement
|
||||||
|
type="checkbox"
|
||||||
|
checked={row.getIsSelected()}
|
||||||
|
on:change={() => row.toggleSelected()}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
{#each row.getVisibleCells() as cell}
|
{#each row.getVisibleCells() as cell}
|
||||||
<td>
|
<td>
|
||||||
<svelte:component
|
<svelte:component
|
||||||
|
@ -144,7 +144,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -155,7 +155,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -309,7 +309,7 @@
|
|||||||
id="comments"
|
id="comments"
|
||||||
name="comments"
|
name="comments"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-3 text-sm">
|
<div class="ml-3 text-sm">
|
||||||
@ -433,7 +433,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -45,7 +45,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -72,14 +72,14 @@
|
|||||||
<button
|
<button
|
||||||
on:click={deleteDonor}
|
on:click={deleteDonor}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("confirm-delete-donor-with-all-donations")}
|
{$_("confirm-delete-donor-with-all-donations")}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={cancelDelete}
|
on:click={cancelDelete}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel-keep-donor")}
|
{$_("cancel-keep-donor")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -314,7 +314,7 @@
|
|||||||
id="comments"
|
id="comments"
|
||||||
name="comments"
|
name="comments"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-3">
|
<div class="ml-3">
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -56,7 +56,7 @@
|
|||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
width="24"
|
width="24"
|
||||||
@ -158,7 +158,7 @@
|
|||||||
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
||||||
>
|
>
|
||||||
<span class="inline-block align-middle mr-8">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,55 +1,51 @@
|
|||||||
<script>
|
<script>
|
||||||
import { onMount } from "svelte";
|
import { onMount } from "svelte";
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
$: releaseinfo = "";
|
$: releaseinfo = "";
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
releaseinfo = document
|
releaseinfo = document
|
||||||
.getElementById("buildinfo")
|
.getElementById("buildinfo")
|
||||||
.textContent.replace("RELEASE_INFO-", "")
|
.textContent.replace("RELEASE_INFO-", "")
|
||||||
.replace("-RELEASE_INFO", "");
|
.replace("-RELEASE_INFO", "");
|
||||||
});
|
});
|
||||||
const year = new Date().getFullYear();
|
const year = new Date().getFullYear();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<footer class="p-5 w-full">
|
<footer class="p-5 w-full">
|
||||||
<p class="text-sm text-gray-500 mt-4">
|
<p class="text-sm text-gray-500 mt-4">
|
||||||
Lauf für Kaya! Läufersystem - Copyright ©
|
Lauf für Kaya! Läufersystem - Copyright ©
|
||||||
{year}
|
{year}
|
||||||
+ proudly powered by
|
+ proudly powered by
|
||||||
<a
|
<a
|
||||||
class="underline"
|
class="underline"
|
||||||
href="https://odit.services"
|
href="https://odit.services"
|
||||||
rel="noopener,noreferrer"
|
rel="noopener,noreferrer"
|
||||||
target="_blank">ODIT.Services</a
|
target="_blank">ODIT.Services</a
|
||||||
>
|
>
|
||||||
</p>
|
</p>
|
||||||
<p class="text-sm text-gray-500 mt-4">
|
<p class="text-sm text-gray-500 mt-4">
|
||||||
<a
|
<a
|
||||||
class="underline"
|
class="underline"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener, noreferrer"
|
rel="noopener, noreferrer"
|
||||||
href="https://git.odit.services/lfk/frontend/">LfK!Frontend</a
|
href="https://git.odit.services/lfk/frontend/">LfK!Frontend</a
|
||||||
>@<a
|
>@<a
|
||||||
class="underline"
|
class="underline"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener, noreferrer"
|
rel="noopener, noreferrer"
|
||||||
href="https://git.odit.services/lfk/frontend/src/tag/{releaseinfo}"
|
href="https://git.odit.services/lfk/frontend/src/tag/{releaseinfo}"
|
||||||
>{releaseinfo}</a
|
>{releaseinfo}</a
|
||||||
>
|
>
|
||||||
-
|
-
|
||||||
<a
|
<a
|
||||||
rel="noopener, noreferrer"
|
rel="noopener, noreferrer"
|
||||||
class="underline"
|
class="underline"
|
||||||
href="https://docs.lauf-fuer-kaya.de"
|
href="https://docs.lauf-fuer-kaya.de"
|
||||||
target="_blank">{$_("documentation")}</a
|
target="_blank">{$_("documentation")}</a
|
||||||
>
|
>
|
||||||
-
|
-
|
||||||
<a class="underline" href="https://lauf-fuer-kaya.de/datenschutz/"
|
<a class="underline" href="/privacy">{$_("privacy")}</a>
|
||||||
>{$_("privacy")}</a
|
-
|
||||||
>
|
<a class="underline" href="/imprint">{$_("imprint")}</a>
|
||||||
-
|
</p>
|
||||||
<a class="underline" href="https://lauf-fuer-kaya.de/impressum/"
|
|
||||||
>{$_("imprint")}</a
|
|
||||||
>
|
|
||||||
</p>
|
|
||||||
</footer>
|
</footer>
|
||||||
|
52
src/components/general/Imprint.svelte
Normal file
52
src/components/general/Imprint.svelte
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<script>
|
||||||
|
import { _, getLocaleFromNavigator } from "svelte-i18n";
|
||||||
|
import { parse } from "marked";
|
||||||
|
import Footer from "./Footer.svelte";
|
||||||
|
// import * as css from "../base/simple.css";
|
||||||
|
let html = "";
|
||||||
|
async function load() {
|
||||||
|
let md = await fetch("/imprint_" + getLocaleFromNavigator() + ".md");
|
||||||
|
let text = (await md.text()).toString();
|
||||||
|
if (text.includes("<meta")) {
|
||||||
|
md.ok = false;
|
||||||
|
}
|
||||||
|
if (!md.ok) {
|
||||||
|
md = await fetch("/imprint_en.md");
|
||||||
|
text = await md.text();
|
||||||
|
}
|
||||||
|
html = parse(text);
|
||||||
|
}
|
||||||
|
const promise = load();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="pt-12 px-4 sm:px-6 lg:px-8 lg:pt-20 bg-gray-900 pb-12">
|
||||||
|
<div class="text-center mb-8">
|
||||||
|
<h1
|
||||||
|
class="mt-9 font-display text-4xl leading-none font-semibold text-white sm:text-5xl lg:text-6xl"
|
||||||
|
>
|
||||||
|
{$_("imprint")}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pt-0 pb-16 overflow-hidden lg:pt-12 lg:py-24">
|
||||||
|
<div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
|
||||||
|
{#await promise}
|
||||||
|
<p class="text-center w-full">{$_("imprint-loading")}</p>
|
||||||
|
{:then}
|
||||||
|
<div class="simplecontent">
|
||||||
|
{@html html}
|
||||||
|
</div>
|
||||||
|
{: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}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Footer />
|
52
src/components/general/Privacy.svelte
Normal file
52
src/components/general/Privacy.svelte
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<script>
|
||||||
|
import { _, getLocaleFromNavigator } from "svelte-i18n";
|
||||||
|
import { parse } from "marked";
|
||||||
|
import Footer from "./Footer.svelte";
|
||||||
|
// import * as css from "../base/simple.css?inline";
|
||||||
|
let html = "";
|
||||||
|
async function load() {
|
||||||
|
let md = await fetch("/privacy_" + getLocaleFromNavigator() + ".md");
|
||||||
|
let text = (await md.text()).toString();
|
||||||
|
if (text.includes("<meta")) {
|
||||||
|
md.ok = false;
|
||||||
|
}
|
||||||
|
if (!md.ok) {
|
||||||
|
md = await fetch("/privacy_en.md");
|
||||||
|
text = await md.text();
|
||||||
|
}
|
||||||
|
html = parse(text);
|
||||||
|
}
|
||||||
|
const promise = load();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="pt-12 px-4 sm:px-6 lg:px-8 lg:pt-20 bg-gray-900 pb-12">
|
||||||
|
<div class="text-center mb-8">
|
||||||
|
<h1
|
||||||
|
class="mt-9 font-display text-4xl leading-none font-semibold text-white sm:text-5xl lg:text-6xl"
|
||||||
|
>
|
||||||
|
{$_("privacy")}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pt-0 pb-16 overflow-hidden lg:pt-12 lg:py-24">
|
||||||
|
<div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
|
||||||
|
{#await promise}
|
||||||
|
<p class="text-center w-full">{$_("privacy-loading")}</p>
|
||||||
|
{:then}
|
||||||
|
<div class="simplecontent">
|
||||||
|
{@html html}
|
||||||
|
</div>
|
||||||
|
{: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}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Footer />
|
103
src/components/general/Sidebar.svelte
Normal file
103
src/components/general/Sidebar.svelte
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<script>
|
||||||
|
let open = false;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="md:flex flex-col md:flex-row h-screen w-full">
|
||||||
|
<div
|
||||||
|
class="flex flex-col w-full md:w-64 text-gray-700 bg-white dark-mode:text-gray-200 dark-mode:bg-gray-800 flex-shrink-0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="flex-shrink-0 px-8 py-4 flex flex-row items-center justify-between"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="/#/test"
|
||||||
|
class="text-lg font-semibold tracking-widest text-gray-900 uppercase rounded-lg dark-mode:text-white focus:outline-none focus:shadow-outline"
|
||||||
|
>Sidebar</a
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="rounded-lg md:hidden focus:outline-none focus:shadow-outline"
|
||||||
|
>
|
||||||
|
<svg fill="currentColor" viewBox="0 0 20 20" class="w-6 h-6">
|
||||||
|
{#if open}
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
{#if !open}
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<nav
|
||||||
|
:class:block={open}
|
||||||
|
:class:hidden={!open}
|
||||||
|
class="flex-grow md:block px-4 pb-4 md:pb-0 md:overflow-y-auto"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="block px-4 py-2 mt-2 text-sm font-semibold text-gray-900 bg-gray-200 rounded-lg dark-mode:bg-gray-700 dark-mode:hover:bg-gray-600 dark-mode:focus:bg-gray-600 dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:text-gray-200 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
href="#">Blog</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="block px-4 py-2 mt-2 text-sm font-semibold text-gray-900 bg-transparent rounded-lg dark-mode:bg-transparent dark-mode:hover:bg-gray-600 dark-mode:focus:bg-gray-600 dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:text-gray-200 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
href="#">Portfolio</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="block px-4 py-2 mt-2 text-sm font-semibold text-gray-900 bg-transparent rounded-lg dark-mode:bg-transparent dark-mode:hover:bg-gray-600 dark-mode:focus:bg-gray-600 dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:text-gray-200 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
href="#">About</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="block px-4 py-2 mt-2 text-sm font-semibold text-gray-900 bg-transparent rounded-lg dark-mode:bg-transparent dark-mode:hover:bg-gray-600 dark-mode:focus:bg-gray-600 dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:text-gray-200 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
href="#">Contact</a
|
||||||
|
>
|
||||||
|
<div class="relative">
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
open = !open;
|
||||||
|
}}
|
||||||
|
class="flex flex-row items-center w-full px-4 py-2 mt-2 text-sm font-semibold text-left bg-transparent rounded-lg dark-mode:bg-transparent dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:focus:bg-gray-600 dark-mode:hover:bg-gray-600 md:block hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
>
|
||||||
|
<span>Dropdown</span>
|
||||||
|
<svg
|
||||||
|
fill="currentColor"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
class="inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1"
|
||||||
|
><path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/></svg
|
||||||
|
>
|
||||||
|
</button>
|
||||||
|
<div
|
||||||
|
class:block={open}
|
||||||
|
class:hidden={!open}
|
||||||
|
class="absolute right-0 w-full mt-2 origin-top-right rounded-md shadow-lg"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="px-2 py-2 bg-white rounded-md shadow dark-mode:bg-gray-800"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark-mode:bg-transparent dark-mode:hover:bg-gray-600 dark-mode:focus:bg-gray-600 dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
href="#">Link #1</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark-mode:bg-transparent dark-mode:hover:bg-gray-600 dark-mode:focus:bg-gray-600 dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
href="#">Link #2</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark-mode:bg-transparent dark-mode:hover:bg-gray-600 dark-mode:focus:bg-gray-600 dark-mode:focus:text-white dark-mode:hover:text-white dark-mode:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||||
|
href="#">Link #3</a
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -79,7 +79,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -92,7 +92,7 @@
|
|||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 640 512"
|
viewBox="0 0 640 512"
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -174,7 +174,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -140,7 +140,7 @@
|
|||||||
{:catch error}
|
{:catch error}
|
||||||
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
<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">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -102,7 +102,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -113,7 +113,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -170,7 +170,7 @@
|
|||||||
id="comments"
|
id="comments"
|
||||||
name="comments"
|
name="comments"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-3 text-sm">
|
<div class="ml-3 text-sm">
|
||||||
@ -294,7 +294,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -56,7 +56,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -86,14 +86,14 @@
|
|||||||
<button
|
<button
|
||||||
on:click={deleteOrg}
|
on:click={deleteOrg}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("confirm-delete-organization-and-associated-teams-runners")}
|
{$_("confirm-delete-organization-and-associated-teams-runners")}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={cancelDelete}
|
on:click={cancelDelete}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel-keep-organization")}
|
{$_("cancel-keep-organization")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -224,7 +224,7 @@
|
|||||||
>{$_("contact")}</label
|
>{$_("contact")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
option.value.id.toString().startsWith(filterText.toLowerCase())}
|
option.value.id.toString().startsWith(filterText.toLowerCase())}
|
||||||
@ -246,7 +246,7 @@
|
|||||||
id="toggle_selfservice_feature"
|
id="toggle_selfservice_feature"
|
||||||
name="toggle_selfservice_feature"
|
name="toggle_selfservice_feature"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-3 text-sm">
|
<div class="ml-3 text-sm">
|
||||||
@ -303,7 +303,7 @@
|
|||||||
id="toggle_address_checkbox"
|
id="toggle_address_checkbox"
|
||||||
name="toggle_address_checkbox"
|
name="toggle_address_checkbox"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-3 text-sm">
|
<div class="ml-3 text-sm">
|
||||||
|
@ -159,7 +159,7 @@
|
|||||||
<input
|
<input
|
||||||
bind:checked={o.is_selected}
|
bind:checked={o.is_selected}
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
@ -230,7 +230,7 @@
|
|||||||
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
||||||
>
|
>
|
||||||
<span class="inline-block align-middle mr-8">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
class DocumentServer {
|
class DocumentServer {
|
||||||
baseUrl: string;
|
baseUrl: string;
|
||||||
apiKey: string;
|
apiKey: string;
|
||||||
@ -13,19 +12,19 @@ class DocumentServer {
|
|||||||
|
|
||||||
for (let i = 0; i < cards.length; i++) {
|
for (let i = 0; i < cards.length; i++) {
|
||||||
const card = {
|
const card = {
|
||||||
id: parseInt(cards[i].id),
|
id: cards[i].id,
|
||||||
enabled: cards[i].enabled,
|
enabled: cards[i].enabled,
|
||||||
code: cards[i].code,
|
code: cards[i].code,
|
||||||
runner: {
|
runner: {
|
||||||
id: parseInt(cards[i]?.runner?.id),
|
id: cards[i]?.runner?.id,
|
||||||
first_name: cards[i]?.runner?.firstname,
|
first_name: cards[i]?.runner?.firstname,
|
||||||
middle_name: cards[i]?.runner?.middlename,
|
middle_name: cards[i]?.runner?.middlename,
|
||||||
last_name: cards[i]?.runner?.lastname,
|
last_name: cards[i]?.runner?.lastname,
|
||||||
group: {
|
group: {
|
||||||
id: parseInt(cards[i]?.runner?.group?.id),
|
id: cards[i]?.runner?.group.id,
|
||||||
name: cards[i]?.runner?.group.name,
|
name: cards[i]?.runner?.group.name,
|
||||||
parent_group: {
|
parent_group: {
|
||||||
id: parseInt(cards[i]?.runner?.group?.parentGroup?.id),
|
id: cards[i]?.runner?.group?.parentGroup?.id,
|
||||||
name: cards[i]?.runner?.group?.parentGroup?.name,
|
name: cards[i]?.runner?.group?.parentGroup?.name,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -58,15 +57,15 @@ class DocumentServer {
|
|||||||
for (let i = 0; i < runners.length; i++) {
|
for (let i = 0; i < runners.length; i++) {
|
||||||
console.log(runners[i]);
|
console.log(runners[i]);
|
||||||
const card = {
|
const card = {
|
||||||
id: parseInt(runners[i].id),
|
id: runners[i].id,
|
||||||
first_name: runners[i].firstname,
|
first_name: runners[i].firstname,
|
||||||
middle_name: runners[i].middlename,
|
middle_name: runners[i].middlename,
|
||||||
last_name: runners[i].lastname,
|
last_name: runners[i].lastname,
|
||||||
group: {
|
group: {
|
||||||
id: parseInt(runners[i].group.id),
|
id: runners[i].group.id,
|
||||||
name: runners[i].group.name,
|
name: runners[i].group.name,
|
||||||
parent_group: {
|
parent_group: {
|
||||||
id: parseInt(runners[i]?.group?.parentGroup?.id),
|
id: runners[i]?.group?.parentGroup?.id,
|
||||||
name: runners[i]?.group?.parentGroup?.name,
|
name: runners[i]?.group?.parentGroup?.name,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -97,28 +96,27 @@ class DocumentServer {
|
|||||||
|
|
||||||
for (let i = 0; i < runners.length; i++) {
|
for (let i = 0; i < runners.length; i++) {
|
||||||
const certificate = {
|
const certificate = {
|
||||||
id: parseInt(runners[i].id),
|
id: runners[i].id,
|
||||||
first_name: runners[i].firstname,
|
first_name: runners[i].firstname,
|
||||||
middle_name: runners[i].middlename,
|
middle_name: runners[i].middlename,
|
||||||
last_name: runners[i].lastname,
|
last_name: runners[i].lastname,
|
||||||
self_service_link: runners[i].selfserviceLink,
|
|
||||||
group: {
|
group: {
|
||||||
id: parseInt(runners[i].group.id),
|
id: runners[i].group.id,
|
||||||
name: runners[i].group.name,
|
name: runners[i].group.name,
|
||||||
parent_group: {
|
parent_group: {
|
||||||
id: parseInt(runners[i]?.group?.parentGroup?.id),
|
id: runners[i]?.group?.parentGroup?.id,
|
||||||
name: runners[i]?.group?.parentGroup?.name,
|
name: runners[i]?.group?.parentGroup?.name,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
distance: parseInt(runners[i].distance),
|
distance: runners[i].distance,
|
||||||
distance_donations: runners[i].distanceDonations.map(
|
distance_donations: runners[i].distanceDonations.map(
|
||||||
(distanceDonation: any) => {
|
(distanceDonation: any) => {
|
||||||
return {
|
return {
|
||||||
id: distanceDonation.id,
|
id: distanceDonation.id,
|
||||||
amount: parseInt(distanceDonation.amount),
|
amount: distanceDonation.amount,
|
||||||
amount_per_distance: parseInt(distanceDonation.amountPerDistance),
|
amount_per_distance: distanceDonation.amountPerDistance,
|
||||||
donor: {
|
donor: {
|
||||||
id: parseInt(distanceDonation.donor.id),
|
id: distanceDonation.donor.id,
|
||||||
first_name: distanceDonation.donor.firstname,
|
first_name: distanceDonation.donor.firstname,
|
||||||
middle_name: distanceDonation.donor.middlename,
|
middle_name: distanceDonation.donor.middlename,
|
||||||
last_name: distanceDonation.donor.lastname,
|
last_name: distanceDonation.donor.lastname,
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -55,7 +55,7 @@
|
|||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
|
@ -1,256 +1,197 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import {
|
import {
|
||||||
RunnerCardService,
|
RunnerCardService,
|
||||||
RunnerOrganizationService,
|
RunnerOrganizationService,
|
||||||
RunnerTeamService,
|
RunnerTeamService,
|
||||||
} from "@odit/lfk-client-js";
|
} from "@odit/lfk-client-js";
|
||||||
import toast from "svelte-french-toast";
|
import toast from "svelte-french-toast";
|
||||||
import DocumentServer from "./DocumentServer.ts";
|
import DocumentServer from "./DocumentServer.ts";
|
||||||
|
|
||||||
import { init } from "@paralleldrive/cuid2";
|
import { init } from "@paralleldrive/cuid2";
|
||||||
const createId = init({ length: 10, fingerprint: "lfk-frontend" });
|
const createId = init({ length: 10, fingerprint: "lfk-frontend" });
|
||||||
const documentServer = new DocumentServer(
|
const documentServer = new DocumentServer(
|
||||||
config.baseurl_documentserver,
|
config.baseurl_documentserver,
|
||||||
config.documentserver_key
|
config.documentserver_key
|
||||||
);
|
);
|
||||||
|
|
||||||
export let cards_show = false;
|
export let cards_show = false;
|
||||||
export let generate_cards = [];
|
export let generate_cards = [];
|
||||||
export let generate_runners = [];
|
export let generate_runners = [];
|
||||||
export let generate_orgs = [];
|
export let generate_orgs = [];
|
||||||
export let generate_teams = [];
|
export let generate_teams = [];
|
||||||
|
|
||||||
function download(blob, fileName) {
|
function download(blob, fileName) {
|
||||||
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 = fileName;
|
a.download = fileName;
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
a.remove();
|
a.remove();
|
||||||
toast.dismiss();
|
toast.dismiss();
|
||||||
toast.success($_("pdf-successfully-generated"));
|
toast.success($_("pdf-successfully-generated"));
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateRunnerCards(locale, useCombined = false) {
|
function generateRunnerCards(locale) {
|
||||||
if (generate_orgs.length > 0) {
|
if (generate_orgs.length > 0) {
|
||||||
if(useCombined){
|
generateOrgCards(locale);
|
||||||
generateOrgCardsCombined(locale);
|
} else if (generate_teams.length > 0) {
|
||||||
|
generateTeamCards(locale);
|
||||||
|
} else if (generate_runners.length > 0) {
|
||||||
|
generateRunnersCards(locale);
|
||||||
} else {
|
} else {
|
||||||
generateOrgCards(locale)
|
generateCards(locale);
|
||||||
}
|
}
|
||||||
} else if (generate_teams.length > 0) {
|
}
|
||||||
generateTeamCards(locale);
|
|
||||||
} else if (generate_runners.length > 0) {
|
|
||||||
generateRunnersCards(locale);
|
|
||||||
} else {
|
|
||||||
generateCards(locale);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function generateCards(locale) {
|
function generateCards(locale) {
|
||||||
toast.loading($_("generating-pdf"));
|
toast.loading($_("generating-pdf"));
|
||||||
documentServer
|
documentServer
|
||||||
.generateCards(generate_cards, locale)
|
.generateCards(generate_cards, locale)
|
||||||
.then((blob) => {
|
.then((blob) => {
|
||||||
download(blob, `${$_("runnercards")}-${locale}-${createId()}.pdf`);
|
download(blob, `${$_("runnercards")}-${locale}-${createId()}.pdf`);
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function generateRunnersCards(locale) {
|
async function generateRunnersCards(locale) {
|
||||||
toast.loading($_("generating-pdf"));
|
toast.loading($_("generating-pdf"));
|
||||||
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
||||||
let cards = [];
|
let cards = [];
|
||||||
for (let runner of generate_runners) {
|
for (let runner of generate_runners) {
|
||||||
let card = current_cards.find((c) => c.runner?.id == runner.id);
|
let card = current_cards.find((c) => c.runner?.id == runner.id);
|
||||||
if (!card) {
|
if (!card) {
|
||||||
card = await RunnerCardService.runnerCardControllerPost({
|
card = await RunnerCardService.runnerCardControllerPost({
|
||||||
runner: runner.id,
|
runner: runner.id,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cards.push(card);
|
cards.push(card);
|
||||||
}
|
}
|
||||||
documentServer
|
documentServer
|
||||||
.generateCards(cards, locale)
|
.generateCards(cards, locale)
|
||||||
.then((blob) => {
|
.then((blob) => {
|
||||||
let fileName = `${$_("runnercards")}-${locale}-${createId()}.pdf`;
|
let fileName = `${$_("runnercards")}-${locale}-${createId()}.pdf`;
|
||||||
if (generate_runners.length == 1) {
|
if (generate_runners.length == 1) {
|
||||||
fileName = `${$_("runnercards")}_${generate_runners[0].firstname}_${
|
fileName = `${$_("runnercards")}_${generate_runners[0].firstname}_${
|
||||||
generate_runners[0].lastname
|
generate_runners[0].lastname
|
||||||
}-${locale}-${createId()}.pdf`;
|
}-${locale}-${createId()}.pdf`;
|
||||||
}
|
}
|
||||||
download(blob, fileName);
|
download(blob, fileName);
|
||||||
})
|
})
|
||||||
.catch((err) => {});
|
.catch((err) => {});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function generateTeamCards(locale) {
|
async function generateTeamCards(locale) {
|
||||||
toast.loading($_("generating-pdfs"));
|
toast.loading($_("generating-pdfs"));
|
||||||
let count = 0;
|
let count = 0;
|
||||||
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
||||||
for (const t of generate_teams) {
|
for (const t of generate_teams) {
|
||||||
const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
||||||
t.id
|
t.id
|
||||||
);
|
);
|
||||||
let 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);
|
||||||
if (!card) {
|
if (!card) {
|
||||||
card = await RunnerCardService.runnerCardControllerPost({
|
card = await RunnerCardService.runnerCardControllerPost({
|
||||||
runner: runner.id,
|
runner: runner.id,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cards.push(card);
|
cards.push(card);
|
||||||
}
|
}
|
||||||
documentServer
|
documentServer
|
||||||
.generateCards(cards, locale)
|
.generateCards(cards, locale)
|
||||||
.then((blob) => {
|
.then((blob) => {
|
||||||
download(
|
download(
|
||||||
blob,
|
blob,
|
||||||
`${$_("runnercards")}_${t.name}-${locale}-${createId()}.pdf`
|
`${$_("runnercards")}_${t.name}-${locale}-${createId()}.pdf`
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
.catch((err) => {});
|
.catch((err) => {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function generateOrgCards(locale) {
|
async function generateOrgCards(locale) {
|
||||||
toast.loading($_("generating-pdfs"));
|
toast.loading($_("generating-pdfs"));
|
||||||
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
||||||
let count = 0;
|
let count = 0;
|
||||||
let count_orgs = 0;
|
let count_orgs = 0;
|
||||||
for (const o of generate_orgs) {
|
for (const o of generate_orgs) {
|
||||||
count_orgs++;
|
count_orgs++;
|
||||||
let count = 0;
|
let count = 0;
|
||||||
let runners =
|
let runners =
|
||||||
await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
|
await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
|
||||||
o.id,
|
o.id,
|
||||||
true
|
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);
|
||||||
if (!card) {
|
if (!card) {
|
||||||
card = await RunnerCardService.runnerCardControllerPost({
|
card = await RunnerCardService.runnerCardControllerPost({
|
||||||
runner: runner.id,
|
runner: runner.id,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cards.push(card);
|
cards.push(card);
|
||||||
}
|
}
|
||||||
await documentServer
|
await documentServer
|
||||||
.generateCards(cards, locale)
|
.generateCards(cards, locale)
|
||||||
.then((blob) => {
|
.then((blob) => {
|
||||||
download(
|
download(
|
||||||
blob,
|
blob,
|
||||||
`${$_("runnercards")}_${o.name}_direct-${locale}-${createId()}.pdf`
|
`${$_("runnercards")}_${o.name}_direct-${locale}-${createId()}.pdf`
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
.catch((err) => {});
|
.catch((err) => {});
|
||||||
for (const t of o.teams) {
|
for (const t of o.teams) {
|
||||||
count++;
|
count++;
|
||||||
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
||||||
t.id
|
t.id
|
||||||
);
|
);
|
||||||
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);
|
||||||
if (!card) {
|
if (!card) {
|
||||||
card = await RunnerCardService.runnerCardControllerPost({
|
card = await RunnerCardService.runnerCardControllerPost({
|
||||||
runner: runner.id,
|
runner: runner.id,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
cards.push(card);
|
cards.push(card);
|
||||||
}
|
}
|
||||||
await documentServer
|
await documentServer
|
||||||
.generateCards(cards, locale)
|
.generateCards(cards, locale)
|
||||||
.then((blob) => {
|
.then((blob) => {
|
||||||
download(
|
download(
|
||||||
blob,
|
blob,
|
||||||
`${$_("runnercards")}_${o.name}_${
|
`${$_("runnercards")}_${o.name}_${
|
||||||
t.name
|
t.name
|
||||||
}-${locale}-${createId()}.pdf`
|
}-${locale}-${createId()}.pdf`
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
.catch((err) => {});
|
.catch((err) => {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async function generateOrgCardsCombined(locale) {
|
|
||||||
toast.loading($_("generating-pdfs"));
|
|
||||||
const current_cards = await RunnerCardService.runnerCardControllerGetAll();
|
|
||||||
let count = 0;
|
|
||||||
let count_orgs = 0;
|
|
||||||
for (const o of generate_orgs) {
|
|
||||||
count_orgs++;
|
|
||||||
let cards = [];
|
|
||||||
let count = 0;
|
|
||||||
let runners =
|
|
||||||
await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
|
|
||||||
o.id,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
for (const t of o.teams) {
|
|
||||||
count++;
|
|
||||||
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
|
||||||
t.id
|
|
||||||
);
|
|
||||||
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 documentServer
|
|
||||||
.generateCards(cards, locale)
|
|
||||||
.then((blob) => {
|
|
||||||
download(
|
|
||||||
blob,
|
|
||||||
`${$_("runnercards")}_${o.name}-${locale}-${createId()}.pdf`
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.catch((err) => {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if cards_show}
|
{#if cards_show}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
generateRunnerCards("de");
|
generateRunnerCards("de");
|
||||||
}}
|
}}
|
||||||
on:contextmenu|preventDefault={() => {
|
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
||||||
generateRunnerCards("de", true);
|
>
|
||||||
}}
|
{$_("generate-runnercards")}: DE
|
||||||
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
</button>
|
||||||
>
|
<button
|
||||||
{$_("generate-runnercards")}: DE
|
on:click={() => {
|
||||||
</button>
|
generateRunnerCards("en");
|
||||||
<button
|
}}
|
||||||
on:click={() => {
|
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
||||||
generateRunnerCards("en");
|
>
|
||||||
}}
|
{$_("generate-runnercards")}: EN
|
||||||
on:contextmenu|preventDefault={() => {
|
</button>
|
||||||
generateRunnerCards("en", true);
|
|
||||||
}}
|
|
||||||
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
|
||||||
>
|
|
||||||
{$_("generate-runnercards")}: EN
|
|
||||||
</button>
|
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -1,193 +1,164 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import {
|
import {
|
||||||
DonationService,
|
DonationService,
|
||||||
RunnerTeamService,
|
RunnerTeamService,
|
||||||
RunnerOrganizationService,
|
RunnerOrganizationService,
|
||||||
RunnerService
|
} from "@odit/lfk-client-js";
|
||||||
} from "@odit/lfk-client-js";
|
import { init } from "@paralleldrive/cuid2";
|
||||||
import { init } from "@paralleldrive/cuid2";
|
import toast from "svelte-french-toast";
|
||||||
import toast from "svelte-french-toast";
|
import DocumentServer from "./DocumentServer";
|
||||||
import DocumentServer from "./DocumentServer";
|
const createId = init({ length: 10, fingerprint: "lfk-frontend" });
|
||||||
const createId = init({ length: 10, fingerprint: "lfk-frontend" });
|
const documentServer = new DocumentServer(
|
||||||
const documentServer = new DocumentServer(
|
config.baseurl_documentserver,
|
||||||
config.baseurl_documentserver,
|
config.documentserver_key
|
||||||
config.documentserver_key
|
);
|
||||||
);
|
|
||||||
|
|
||||||
export let certificates_show = false;
|
export let certificates_show = false;
|
||||||
export let generate_runners = [];
|
export let generate_runners = [];
|
||||||
export let generate_orgs = [];
|
export let generate_orgs = [];
|
||||||
export let generate_teams = [];
|
export let generate_teams = [];
|
||||||
|
|
||||||
function generateCertificates(locale, include0runners = false) {
|
function generateCertificates(locale) {
|
||||||
if (generate_orgs.length > 0) {
|
if (generate_orgs.length > 0) {
|
||||||
generateOrgCertificates(locale, include0runners = false);
|
generateOrgCertificates(locale);
|
||||||
} else if (generate_teams.length > 0) {
|
} else if (generate_teams.length > 0) {
|
||||||
generateTeamCertificates(locale, include0runners = false);
|
generateTeamCertificates(locale);
|
||||||
} else {
|
} else {
|
||||||
generateRunnerCertificates(locale, include0runners = false);
|
generateRunnerCertificates(locale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function download(blob, fileName) {
|
function download(blob, fileName) {
|
||||||
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 = fileName;
|
a.download = fileName;
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
a.remove();
|
a.remove();
|
||||||
toast.dismiss();
|
toast.dismiss();
|
||||||
toast.success($_("pdf-successfully-generated"));
|
toast.success($_("pdf-successfully-generated"));
|
||||||
}
|
}
|
||||||
|
|
||||||
async function generateRunnerCertificates(locale, include0runners = false) {
|
async function generateRunnerCertificates(locale) {
|
||||||
toast.loading($_("generating-pdf"));
|
toast.loading($_("generating-pdf"));
|
||||||
const current_donations =
|
const current_donations =
|
||||||
(await DonationService.donationControllerGetAll()) || [];
|
(await DonationService.donationControllerGetAll()) || [];
|
||||||
let certificateRunners = [];
|
let certificateRunners = [];
|
||||||
for (let runner of generate_runners) {
|
for (let runner of generate_runners) {
|
||||||
const linkRunner = await RunnerService.runnerControllerGetOne(runner.id)
|
runner.distanceDonations =
|
||||||
linkRunner.distanceDonations =
|
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
||||||
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
certificateRunners.push(runner);
|
||||||
// check if linkRunner.distance is 0, if so, and include0runners is false, skip this runner
|
}
|
||||||
if (
|
documentServer
|
||||||
!include0runners &&
|
.generateCertificates(certificateRunners, locale)
|
||||||
(linkRunner.distance === 0 || linkRunner.distance === null)
|
.then((blob) => {
|
||||||
) {
|
let fileName = `${$_("certificates")}-${locale}.pdf`;
|
||||||
continue;
|
if (generate_runners.length == 1) {
|
||||||
} else {
|
fileName = `${$_("certificates")}_${
|
||||||
certificateRunners.push(linkRunner);
|
generate_runners[0].firstname
|
||||||
}
|
}_${generate_runners[0].lastname}-${locale}-${createId()}.pdf`;
|
||||||
}
|
}
|
||||||
documentServer
|
download(blob, fileName);
|
||||||
.generateCertificates(certificateRunners, locale)
|
})
|
||||||
.then((blob) => {
|
.catch((err) => {});
|
||||||
let fileName = `${$_("certificates")}-${locale}.pdf`;
|
}
|
||||||
if (generate_runners.length == 1) {
|
|
||||||
fileName = `${$_("certificates")}_${
|
|
||||||
generate_runners[0].firstname
|
|
||||||
}_${generate_runners[0].lastname}-${locale}-${createId()}.pdf`;
|
|
||||||
}
|
|
||||||
download(blob, fileName);
|
|
||||||
})
|
|
||||||
.catch((err) => {});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function generateTeamCertificates(locale, include0runners = false) {
|
async function generateTeamCertificates(locale) {
|
||||||
toast.loading($_("generating-pdfs"));
|
toast.loading($_("generating-pdfs"));
|
||||||
let count = 0;
|
let count = 0;
|
||||||
const current_donations =
|
const current_donations =
|
||||||
(await DonationService.donationControllerGetAll()) || [];
|
(await DonationService.donationControllerGetAll()) || [];
|
||||||
for (const t of generate_teams) {
|
for (const t of generate_teams) {
|
||||||
const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
||||||
t.id,
|
t.id
|
||||||
true
|
);
|
||||||
);
|
let certificateRunners = [];
|
||||||
let certificateRunners = [];
|
for (let runner of runners) {
|
||||||
for (let runner of runners) {
|
runner.distanceDonations =
|
||||||
runner.distanceDonations =
|
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
||||||
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
certificateRunners.push(runner);
|
||||||
// check if runner.distance is 0, if so, and include0runners is false, skip this runner
|
}
|
||||||
if (
|
documentServer
|
||||||
!include0runners &&
|
.generateCertificates(certificateRunners, locale)
|
||||||
(runner.distance === 0 || runner.distance === null)
|
.then((blob) => {
|
||||||
) {
|
count++;
|
||||||
continue;
|
download(
|
||||||
} else {
|
blob,
|
||||||
certificateRunners.push(runner);
|
`${$_("certificates")}_${t.name}-${locale}-${createId()}.pdf`
|
||||||
}
|
);
|
||||||
}
|
})
|
||||||
documentServer
|
.catch((err) => {});
|
||||||
.generateCertificates(certificateRunners, locale)
|
}
|
||||||
.then((blob) => {
|
}
|
||||||
count++;
|
|
||||||
download(
|
|
||||||
blob,
|
|
||||||
`${$_("certificates")}_${t.name}-${locale}-${createId()}.pdf`
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.catch((err) => {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function generateOrgCertificates(locale, include0runners = false) {
|
async function generateOrgCertificates(locale) {
|
||||||
toast.loading($_("generating-pdfs"));
|
toast.loading($_("generating-pdfs"));
|
||||||
const current_donations =
|
const current_donations =
|
||||||
(await DonationService.donationControllerGetAll()) || [];
|
(await DonationService.donationControllerGetAll()) || [];
|
||||||
let count = 0;
|
let count = 0;
|
||||||
let count_orgs = 0;
|
let count_orgs = 0;
|
||||||
for (const o of generate_orgs) {
|
for (const o of generate_orgs) {
|
||||||
count_orgs++;
|
count_orgs++;
|
||||||
let count = 0;
|
let count = 0;
|
||||||
let runners =
|
let runners =
|
||||||
await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
|
await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
|
||||||
o.id,
|
o.id,
|
||||||
true,
|
true
|
||||||
true
|
);
|
||||||
);
|
let certificateRunners = [];
|
||||||
let certificateRunners = [];
|
for (let runner of runners) {
|
||||||
for (let runner of runners) {
|
runner.distanceDonations =
|
||||||
runner.distanceDonations =
|
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
||||||
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
certificateRunners.push(runner);
|
||||||
// check if runner.distance is 0, if so, and include0runners is false, skip this runner
|
}
|
||||||
if (
|
await documentServer
|
||||||
!include0runners &&
|
.generateCertificates(certificateRunners, locale)
|
||||||
(runner.distance === 0 || runner.distance === null)
|
.then((blob) => {
|
||||||
) {
|
download(
|
||||||
continue;
|
blob,
|
||||||
} else {
|
`${$_("certificates")}_${o.name}-${locale}-${createId()}.pdf`
|
||||||
certificateRunners.push(runner);
|
);
|
||||||
}
|
})
|
||||||
}
|
.catch((err) => {});
|
||||||
await documentServer
|
for (const t of o.teams) {
|
||||||
.generateCertificates(certificateRunners, locale)
|
count++;
|
||||||
.then((blob) => {
|
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
||||||
download(
|
t.id
|
||||||
blob,
|
);
|
||||||
`${$_("certificates")}_${o.name}-${locale}-${createId()}.pdf`
|
let certificateRunners = [];
|
||||||
);
|
for (let runner of runners) {
|
||||||
})
|
runner.distanceDonations =
|
||||||
.catch((err) => {});
|
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
||||||
for (const t of o.teams) {
|
certificateRunners.push(runner);
|
||||||
count++;
|
}
|
||||||
let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
|
await documentServer
|
||||||
t.id,
|
.generateCertificates(certificateRunners, locale)
|
||||||
true
|
.then((blob) => {
|
||||||
);
|
download(
|
||||||
let certificateRunners = [];
|
blob,
|
||||||
for (let runner of runners) {
|
`${$_("certificates")}_${o.name}_${
|
||||||
runner.distanceDonations =
|
t.name
|
||||||
current_donations.filter((d) => d.runner?.id == runner.id) || [];
|
}-${locale}-${createId()}.pdf`
|
||||||
certificateRunners.push(runner);
|
);
|
||||||
}
|
if (
|
||||||
await documentServer
|
count === o.teams.length &&
|
||||||
.generateCertificates(certificateRunners, locale)
|
count_orgs === generate_orgs.length
|
||||||
.then((blob) => {
|
) {
|
||||||
download(
|
toast.dismiss();
|
||||||
blob,
|
toast.success($_("pdfs-successfully-generated"));
|
||||||
`${$_("certificates")}_${o.name}_${
|
}
|
||||||
t.name
|
})
|
||||||
}-${locale}-${createId()}.pdf`
|
.catch((err) => {});
|
||||||
);
|
}
|
||||||
if (
|
}
|
||||||
count === o.teams.length &&
|
}
|
||||||
count_orgs === generate_orgs.length
|
|
||||||
) {
|
|
||||||
toast.dismiss();
|
|
||||||
toast.success($_("pdfs-successfully-generated"));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((err) => {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if certificates_show}
|
{#if certificates_show}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
generateCertificates("de", true);
|
generateCertificates("de");
|
||||||
}}
|
}}
|
||||||
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
||||||
>
|
>
|
||||||
@ -195,26 +166,10 @@
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
generateCertificates("de", false);
|
generateCertificates("en");
|
||||||
}}
|
|
||||||
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
|
||||||
>
|
|
||||||
{$_("generate-runner-certificates")}: DE [{$_('exclude_0m_runners_certificate')}]
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
generateCertificates("en", true);
|
|
||||||
}}
|
}}
|
||||||
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
||||||
>
|
>
|
||||||
{$_("generate-runner-certificates")}: EN
|
{$_("generate-runner-certificates")}: EN
|
||||||
</button>
|
</button>
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
generateCertificates("en", false);
|
|
||||||
}}
|
|
||||||
class="w-full 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:w-auto sm:text-sm mb-1 lg:mb-0"
|
|
||||||
>
|
|
||||||
{$_("generate-runner-certificates")}: EN [{$_('exclude_0m_runners_certificate')}]
|
|
||||||
</button>
|
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -137,7 +137,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -150,7 +150,7 @@
|
|||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -248,7 +248,7 @@
|
|||||||
>{$_("team")}</label
|
>{$_("team")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
option.value.id
|
option.value.id
|
||||||
@ -338,7 +338,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -64,7 +64,7 @@
|
|||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -90,7 +90,7 @@
|
|||||||
<button
|
<button
|
||||||
on:click={submit}
|
on:click={submit}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("delete")}
|
{$_("delete")}
|
||||||
</button>
|
</button>
|
||||||
@ -99,7 +99,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import { parse } from "papaparse";
|
import csv from "csvtojson";
|
||||||
import { read as readXlsx, utils as xlsx_utils } from "xlsx";
|
import { read as readXlsx, utils as xlsx_utils } from "xlsx";
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { clickOutside } from "../base/outsideclick";
|
import { clickOutside } from "../base/outsideclick";
|
||||||
@ -10,6 +10,7 @@
|
|||||||
RunnerOrganizationService,
|
RunnerOrganizationService,
|
||||||
} from "@odit/lfk-client-js";
|
} from "@odit/lfk-client-js";
|
||||||
import { createEventDispatcher } from "svelte";
|
import { createEventDispatcher } from "svelte";
|
||||||
|
import Select from "svelte-select";
|
||||||
import toast from "svelte-french-toast";
|
import toast from "svelte-french-toast";
|
||||||
export let opened_from;
|
export let opened_from;
|
||||||
export let passed_org;
|
export let passed_org;
|
||||||
@ -45,7 +46,6 @@
|
|||||||
return { label: r.name, value: `ORG_${r.id}` };
|
return { label: r.name, value: `ORG_${r.id}` };
|
||||||
});
|
});
|
||||||
groups = groups.concat(orgs);
|
groups = groups.concat(orgs);
|
||||||
groups.sort((a, b) => a.label.localeCompare(b.label));
|
|
||||||
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
||||||
const teams = val.map((r) => {
|
const teams = val.map((r) => {
|
||||||
return {
|
return {
|
||||||
@ -54,7 +54,6 @@
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
groups = groups.concat(teams);
|
groups = groups.concat(teams);
|
||||||
groups.sort((a, b) => a.label.localeCompare(b.label));
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
let selected_org;
|
let selected_org;
|
||||||
@ -63,31 +62,29 @@
|
|||||||
let recent_processed = true;
|
let recent_processed = true;
|
||||||
$: json_output = [];
|
$: json_output = [];
|
||||||
$: {
|
$: {
|
||||||
if (json_output.length === 0) {
|
if (files) {
|
||||||
if (files) {
|
if (
|
||||||
if (
|
files[0].type ===
|
||||||
files[0].type ===
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
) {
|
||||||
) {
|
const reader = new FileReader();
|
||||||
const reader = new FileReader();
|
reader.addEventListener("load", async (e) => {
|
||||||
reader.addEventListener("loadend", (e) => {
|
const data = new Uint8Array(e.target.result);
|
||||||
const data = new Uint8Array(e.target.result);
|
const out = readXlsx(data, { type: "array" });
|
||||||
const out = readXlsx(data, { type: "array" });
|
json_output = xlsx_utils.sheet_to_json(
|
||||||
json_output = xlsx_utils.sheet_to_json(
|
out.Sheets[Object.keys(out.Sheets)[0]]
|
||||||
out.Sheets[Object.keys(out.Sheets)[0]]
|
);
|
||||||
);
|
});
|
||||||
});
|
reader.readAsArrayBuffer(files[0]);
|
||||||
reader.readAsArrayBuffer(files[0]);
|
} else {
|
||||||
} else {
|
const reader = new FileReader();
|
||||||
const reader = new FileReader();
|
reader.addEventListener("load", async (e) => {
|
||||||
reader.addEventListener("loadend", (e) => {
|
json_output = await csv({
|
||||||
json_output = parse(e.target.result, {
|
delimiter: [";", ","],
|
||||||
delimitersToGuess: [";", ","],
|
trim: true,
|
||||||
header: true,
|
}).fromString(e.target.result);
|
||||||
}).data;
|
});
|
||||||
});
|
reader.readAsText(files[0]);
|
||||||
reader.readAsText(files[0]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -210,7 +207,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -225,7 +222,7 @@
|
|||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -261,7 +258,7 @@
|
|||||||
cancelModal();
|
cancelModal();
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
@ -375,7 +372,7 @@
|
|||||||
cancelModal();
|
cancelModal();
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -52,17 +52,12 @@
|
|||||||
return { label: r.name, value: r };
|
return { label: r.name, value: r };
|
||||||
});
|
});
|
||||||
groups = groups.concat(orgs);
|
groups = groups.concat(orgs);
|
||||||
groups.sort((a, b) => a.label.localeCompare(b.label));
|
|
||||||
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
||||||
const teams = val.map((r) => {
|
const teams = val.map((r) => {
|
||||||
return { label: `${r.parentGroup.name} > ${r.name}`, value: r };
|
return { label: `${r.parentGroup.name} > ${r.name}`, value: r };
|
||||||
});
|
});
|
||||||
groups = groups.concat(teams);
|
groups = groups.concat(teams);
|
||||||
groups.sort((a, b) => a.label.localeCompare(b.label));
|
group = groups.find((g) => g.value.id == editable.group);
|
||||||
let tmp_group = groups.find((g) => g.value.id == editable.group);
|
|
||||||
if (tmp_group) {
|
|
||||||
group = tmp_group.value.id;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -105,7 +100,7 @@
|
|||||||
<nav class="w-full flex">
|
<nav class="w-full flex">
|
||||||
<ol class="list-none flex flex-row items-center justify-start">
|
<ol class="list-none flex flex-row items-center justify-start">
|
||||||
<li class="flex items-center">
|
<li class="flex items-center">
|
||||||
<a class="mr-2" href="/runners/"
|
<a class="mr-2" href="./"
|
||||||
><svg
|
><svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
width="24"
|
width="24"
|
||||||
@ -275,14 +270,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full mt-2">
|
<div class="text-sm w-full mt-2">
|
||||||
<span class="font-semibold text-gray-700">{$_("group")}</span>
|
<span class="font-semibold text-gray-700">{$_("group")}</span>
|
||||||
<select
|
<Select
|
||||||
class="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
bind:value={editable.group}
|
itemFilter={(label, filterText, option) =>
|
||||||
>
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
{#each groups as g}
|
option.id.value.toString().startsWith(filterText.toLowerCase())}
|
||||||
<option value={g.value.id}>{g.label}</option>
|
items={groups}
|
||||||
{/each}
|
showChevron={true}
|
||||||
</select>
|
placeholder={$_("search-for-an-organization-or-team-by-name-or-id")}
|
||||||
|
noOptionsMessage={$_("no-organization-or-team-found")}
|
||||||
|
bind:selectedValue={group}
|
||||||
|
on:select={(selectedValue) => {
|
||||||
|
editable.group = selectedValue.detail.value.id;
|
||||||
|
}}
|
||||||
|
on:clear={() => (editable.group = null)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full mt-2">
|
<div class="text-sm w-full mt-2">
|
||||||
<span class="font-semibold text-gray-700">{$_("distance")}</span>
|
<span class="font-semibold text-gray-700">{$_("distance")}</span>
|
||||||
@ -290,14 +292,7 @@
|
|||||||
<span class="text-gray-700">{original_data.distance / 1000} km</span>
|
<span class="text-gray-700">{original_data.distance / 1000} km</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full mt-2">
|
<div class="text-sm w-full mt-2">
|
||||||
<span class="font-semibold text-gray-700">{$_("total-donation-amount")}</span>
|
<span class="font-semibold text-gray-700">{$_('created_via')}</span>
|
||||||
<br />
|
|
||||||
<span class="text-gray-700">{(editable.donationAmount / 100)
|
|
||||||
.toFixed(2)
|
|
||||||
.toLocaleString("de-DE", { valute: "EUR" })}€</span>
|
|
||||||
</div>
|
|
||||||
<div class="text-sm w-full mt-2">
|
|
||||||
<span class="font-semibold text-gray-700">{$_("created_via")}</span>
|
|
||||||
<br />
|
<br />
|
||||||
<span class="text-gray-700">{original_data.created_via}</span>
|
<span class="text-gray-700">{original_data.created_via}</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,342 +1,318 @@
|
|||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
RunnerOrganizationService,
|
RunnerOrganizationService,
|
||||||
RunnerService,
|
RunnerService,
|
||||||
RunnerTeamService,
|
RunnerTeamService,
|
||||||
} from "@odit/lfk-client-js";
|
} from "@odit/lfk-client-js";
|
||||||
import {
|
import {
|
||||||
createSvelteTable,
|
createSvelteTable,
|
||||||
flexRender,
|
flexRender,
|
||||||
getCoreRowModel,
|
getCoreRowModel,
|
||||||
getFilteredRowModel,
|
getFilteredRowModel,
|
||||||
getPaginationRowModel,
|
getPaginationRowModel,
|
||||||
getSortedRowModel,
|
getSortedRowModel,
|
||||||
renderComponent,
|
renderComponent,
|
||||||
} from "@tanstack/svelte-table";
|
} from "@tanstack/svelte-table";
|
||||||
import { onMount } from "svelte";
|
import { onMount } from "svelte";
|
||||||
import { writable } from "svelte/store";
|
import { writable } from "svelte/store";
|
||||||
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
|
||||||
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
|
||||||
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
|
||||||
import InputElement from "../shared/InputElement.svelte";
|
import InputElement from "../shared/InputElement.svelte";
|
||||||
import TableActions from "../shared/TableActions.svelte";
|
import TableActions from "../shared/TableActions.svelte";
|
||||||
import { groupFilter } from "../shared/tablefilters";
|
import { groupFilter } from "../shared/tablefilters";
|
||||||
import DeleteRunnerModal from "./DeleteRunnerModal.svelte";
|
import DeleteRunnerModal from "./DeleteRunnerModal.svelte";
|
||||||
import TableBottom from "../shared/TableBottom.svelte";
|
import TableBottom from "../shared/TableBottom.svelte";
|
||||||
import TableHeader from "../shared/TableHeader.svelte";
|
import TableHeader from "../shared/TableHeader.svelte";
|
||||||
|
|
||||||
$: selectedRunners =
|
$: selectedRunners =
|
||||||
$table?.getSelectedRowModel().rows.map((row) => row.original) || [];
|
$table?.getSelectedRowModel().rows.map((row) => row.original) || [];
|
||||||
$: selected =
|
$: selected =
|
||||||
$table?.getSelectedRowModel().rows.map((row) => row.index) || [];
|
$table?.getSelectedRowModel().rows.map((row) => row.index) || [];
|
||||||
|
|
||||||
$: active_delete = undefined;
|
$: active_delete = undefined;
|
||||||
let dataLoaded = false;
|
let dataLoaded = false;
|
||||||
export let created_via = "all";
|
export let current_runners = [];
|
||||||
export let current_runners = [];
|
$: sponsoring_contracts_show = selected.length > 0;
|
||||||
$: sponsoring_contracts_show = selected.length > 0;
|
$: cards_show = selected.length > 0;
|
||||||
$: cards_show = selected.length > 0;
|
$: certificates_show = selected.length > 0;
|
||||||
$: certificates_show = selected.length > 0;
|
$: teams = [];
|
||||||
$: teams = [];
|
$: orgs = [];
|
||||||
$: orgs = [];
|
|
||||||
|
|
||||||
export const addRunners = (runners) => {
|
export const addRunners = (runners) => {
|
||||||
current_runners = current_runners.concat(...runners);
|
current_runners = current_runners.concat(...runners);
|
||||||
options.update((options) => ({
|
options.update((options) => ({
|
||||||
...options,
|
...options,
|
||||||
data: current_runners,
|
data: current_runners,
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
//Section table
|
//Section table
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
accessorKey: "id",
|
accessorKey: "id",
|
||||||
header: () => "id",
|
header: () => "id",
|
||||||
filterFn: `equalsString`,
|
filterFn: `equalsString`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "firstname",
|
accessorKey: "firstname",
|
||||||
header: () => $_("first-name"),
|
header: () => $_("first-name"),
|
||||||
filterFn: `includesString`,
|
filterFn: `includesString`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "middlename",
|
accessorKey: "middlename",
|
||||||
header: () => $_("middle-name"),
|
header: () => $_("middle-name"),
|
||||||
cell: (info) => {
|
cell: (info) => {
|
||||||
if (!info || !info.getValue()) {
|
if (!info || !info.getValue()) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return info.getValue();
|
return info.getValue();
|
||||||
},
|
},
|
||||||
filterFn: `includesString`,
|
filterFn: `includesString`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "lastname",
|
accessorKey: "lastname",
|
||||||
header: () => $_("last-name"),
|
header: () => $_("last-name"),
|
||||||
filterFn: `includesString`,
|
filterFn: `includesString`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "created_via",
|
accessorKey: "group",
|
||||||
header: () => "created_via",
|
header: () => $_("group"),
|
||||||
filterFn: `includesString`,
|
cell: (info) => {
|
||||||
},
|
const group = info.getValue();
|
||||||
{
|
if (group.responseType === "RUNNERORGANIZATION") {
|
||||||
accessorKey: "group",
|
return group.name;
|
||||||
header: () => $_("group"),
|
}
|
||||||
cell: (info) => {
|
return `${group.parentGroup.name} > ${group.name}`;
|
||||||
const group = info.getValue();
|
},
|
||||||
if (group.responseType === "RUNNERORGANIZATION") {
|
filterFn: `group`,
|
||||||
return group.name;
|
},
|
||||||
}
|
{
|
||||||
return `${group.parentGroup.name} > ${group.name}`;
|
accessorKey: "distance",
|
||||||
},
|
header: () => $_("distance"),
|
||||||
filterFn: `group`,
|
cell: (info) => {
|
||||||
sortingFn: (rowA, rowB, col) => {
|
if (info.getValue() < 1000) {
|
||||||
return rowA.original.group.name.localeCompare(rowB.original.group.name);
|
return `${info.getValue()} m`;
|
||||||
},
|
}
|
||||||
},
|
return `${(info.getValue() / 1000).toFixed(1)} km`;
|
||||||
{
|
},
|
||||||
accessorKey: "distance",
|
enableColumnFilter: false,
|
||||||
header: () => $_("distance"),
|
},
|
||||||
sortingFn: (rowA, rowB, col) => {
|
{
|
||||||
return rowA.original.distance > rowB.original.distance;
|
accessorKey: "actions",
|
||||||
},
|
header: () => $_("action"),
|
||||||
cell: (info) => {
|
cell: (info) => {
|
||||||
if (info.getValue() < 1000) {
|
return renderComponent(TableActions, {
|
||||||
return `${info.getValue()} m`;
|
detailsLink: `./${info.row.original.id}`,
|
||||||
}
|
deleteAction: () => {
|
||||||
return `${(info.getValue() / 1000).toFixed(1)} km`;
|
active_delete =
|
||||||
},
|
current_runners[
|
||||||
enableColumnFilter: false,
|
current_runners.findIndex((r) => r.id == info.row.original.id)
|
||||||
},
|
];
|
||||||
{
|
},
|
||||||
accessorKey: "actions",
|
deleteEnabled:
|
||||||
header: () => $_("action"),
|
store.state.jwtinfo.userdetails.permissions.includes(
|
||||||
cell: (info) => {
|
"RUNNER:DELETE"
|
||||||
return renderComponent(TableActions, {
|
),
|
||||||
detailsLink: `/runners/${info.row.original.id}`,
|
});
|
||||||
deleteAction: () => {
|
},
|
||||||
active_delete =
|
enableColumnFilter: false,
|
||||||
current_runners[
|
enableSorting: false,
|
||||||
current_runners.findIndex((r) => r.id == info.row.original.id)
|
},
|
||||||
];
|
];
|
||||||
},
|
const options = writable({
|
||||||
deleteEnabled:
|
data: [],
|
||||||
store.state.jwtinfo.userdetails.permissions.includes(
|
columns: columns,
|
||||||
"RUNNER:DELETE"
|
filterFns: {
|
||||||
),
|
group: groupFilter,
|
||||||
});
|
},
|
||||||
},
|
initialState: {
|
||||||
enableColumnFilter: false,
|
pagination: {
|
||||||
enableSorting: false,
|
pageSize: 50,
|
||||||
},
|
},
|
||||||
];
|
},
|
||||||
const options = writable({
|
enableRowSelection: true,
|
||||||
data: [],
|
getCoreRowModel: getCoreRowModel(),
|
||||||
columns: columns,
|
getFilteredRowModel: getFilteredRowModel(),
|
||||||
filterFns: {
|
getPaginationRowModel: getPaginationRowModel(),
|
||||||
group: groupFilter,
|
getSortedRowModel: getSortedRowModel(),
|
||||||
},
|
});
|
||||||
initialState: {
|
const table = createSvelteTable(options);
|
||||||
pagination: {
|
|
||||||
pageSize: 50,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
enableRowSelection: true,
|
|
||||||
getCoreRowModel: getCoreRowModel(),
|
|
||||||
getFilteredRowModel: getFilteredRowModel(),
|
|
||||||
getPaginationRowModel: getPaginationRowModel(),
|
|
||||||
getSortedRowModel: getSortedRowModel(),
|
|
||||||
});
|
|
||||||
const table = createSvelteTable(options);
|
|
||||||
|
|
||||||
async function deleteRunner(delete_runner_id) {
|
async function deleteRunner(delete_runner_id) {
|
||||||
await RunnerService.runnerControllerRemove(delete_runner_id, true);
|
await RunnerService.runnerControllerRemove(delete_runner_id, true);
|
||||||
current_runners = current_runners.filter((r) => r.id !== delete_runner_id);
|
current_runners = current_runners.filter((r) => r.id !== delete_runner_id);
|
||||||
options.update((options) => ({
|
options.update((options) => ({
|
||||||
...options,
|
...options,
|
||||||
data: current_runners,
|
data: current_runners,
|
||||||
}));
|
}));
|
||||||
toast.success($_("runner-deleted"));
|
toast.success($_("runner-deleted"));
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
||||||
teams = val;
|
teams = val;
|
||||||
});
|
});
|
||||||
RunnerOrganizationService.runnerOrganizationControllerGetAll().then(
|
RunnerOrganizationService.runnerOrganizationControllerGetAll().then(
|
||||||
(val) => {
|
(val) => {
|
||||||
orgs = val;
|
orgs = val;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
let page = 0;
|
let page = 0;
|
||||||
while (page >= 0) {
|
while (page >= 0) {
|
||||||
const runners = await RunnerService.runnerControllerGetAll(
|
const runners = await RunnerService.runnerControllerGetAll(page, 500);
|
||||||
page,
|
if (runners.length == 0) {
|
||||||
500,
|
page = -2;
|
||||||
);
|
}
|
||||||
if (runners.length == 0) {
|
|
||||||
page = -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_runners = current_runners.concat(...runners);
|
current_runners = current_runners.concat(...runners);
|
||||||
options.update((options) => ({
|
options.update((options) => ({
|
||||||
...options,
|
...options,
|
||||||
data: current_runners,
|
data: current_runners,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
dataLoaded = true;
|
dataLoaded = true;
|
||||||
page++;
|
page++;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import store from "../../store";
|
import store from "../../store";
|
||||||
import AddRunnerModal from "./AddRunnerModal.svelte";
|
import AddRunnerModal from "./AddRunnerModal.svelte";
|
||||||
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
||||||
import toast from "svelte-french-toast";
|
import toast from "svelte-french-toast";
|
||||||
$: current_runners = [];
|
$: current_runners = [];
|
||||||
export let modal_open = false;
|
export let modal_open = false;
|
||||||
export let import_modal_open = false;
|
export let import_modal_open = false;
|
||||||
|
|
||||||
if (created_via != "all") {
|
|
||||||
$table.setColumnFilters([
|
|
||||||
{
|
|
||||||
id: "created_via",
|
|
||||||
value: created_via,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section class="container p-5">
|
<section class="container p-5">
|
||||||
<h4 class="mb-1 text-3xl font-extrabold leading-tight">
|
<h4 class="mb-1 text-3xl font-extrabold leading-tight">
|
||||||
{$_("runners")}
|
{$_("runners")}
|
||||||
</h4>
|
</h4>
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:CREATE")}
|
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:CREATE")}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
modal_open = true;
|
modal_open = true;
|
||||||
}}
|
}}
|
||||||
type="button"
|
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:w-auto sm:text-sm mb-1 lg:mb-0"
|
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:w-auto sm:text-sm mb-1 lg:mb-0"
|
||||||
>
|
>
|
||||||
{$_("laeufer-hinzufuegen")}
|
{$_("laeufer-hinzufuegen")}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
import_modal_open = true;
|
import_modal_open = true;
|
||||||
}}
|
}}
|
||||||
type="button"
|
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:w-auto sm:text-sm mb-1 lg:mb-0"
|
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:w-auto sm:text-sm mb-1 lg:mb-0"
|
||||||
>
|
>
|
||||||
{$_("import-runners")}
|
{$_("import-runners")}
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
<DeleteRunnerModal
|
<DeleteRunnerModal
|
||||||
delete_runner={active_delete}
|
delete_runner={active_delete}
|
||||||
modal_open={active_delete != undefined}
|
modal_open={active_delete != undefined}
|
||||||
on:delete={(event) => {
|
on:delete={(event) => {
|
||||||
deleteRunner(event.detail.id);
|
deleteRunner(event.detail.id);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")}
|
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")}
|
||||||
{#if !dataLoaded}
|
{#if !dataLoaded}
|
||||||
<div
|
<div
|
||||||
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
|
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
|
||||||
role="alert"
|
role="alert"
|
||||||
>
|
>
|
||||||
<p class="font-bold">{$_("runners-are-being-loaded")}</p>
|
<p class="font-bold">{$_("runners-are-being-loaded")}</p>
|
||||||
<p class="text-sm">{$_("this-might-take-a-moment")}</p>
|
<p class="text-sm">{$_("this-might-take-a-moment")}</p>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
<GenerateSponsoringContracts
|
<GenerateSponsoringContracts
|
||||||
bind:sponsoring_contracts_show
|
bind:sponsoring_contracts_show
|
||||||
bind:generate_runners={selectedRunners}
|
bind:generate_runners={selectedRunners}
|
||||||
/>
|
/>
|
||||||
<GenerateRunnerCards
|
<GenerateRunnerCards
|
||||||
bind:cards_show
|
bind:cards_show
|
||||||
bind:generate_runners={selectedRunners}
|
bind:generate_runners={selectedRunners}
|
||||||
/>
|
/>
|
||||||
<GenerateRunnerCertificates
|
<GenerateRunnerCertificates
|
||||||
bind:certificates_show
|
bind:certificates_show
|
||||||
bind:generate_runners={selectedRunners}
|
bind:generate_runners={selectedRunners}
|
||||||
/>
|
/>
|
||||||
<div class="overflow-x-auto">
|
<div class="overflow-x-auto">
|
||||||
<table class="w-full">
|
<table class="w-full">
|
||||||
<thead class="border-b border-gray-400">
|
<thead class="border-b border-gray-400">
|
||||||
{#each $table.getHeaderGroups() as headerGroup}
|
{#each $table.getHeaderGroups() as headerGroup}
|
||||||
<tr class="select-none">
|
<tr class="select-none">
|
||||||
<th class="inset-y-0 left-0 px-4 py-2 text-left w-px">
|
<th class="inset-y-0 left-0 px-4 py-2 text-left w-px">
|
||||||
<InputElement
|
<InputElement
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={$table.getIsAllRowsSelected()}
|
checked={$table.getIsAllRowsSelected()}
|
||||||
indeterminate={$table.getIsSomeRowsSelected()}
|
indeterminate={$table.getIsSomeRowsSelected()}
|
||||||
on:change={() => $table.toggleAllRowsSelected()}
|
on:change={() => $table.toggleAllRowsSelected()}
|
||||||
/>
|
/>
|
||||||
</th>
|
</th>
|
||||||
{#each headerGroup.headers as header}
|
{#each headerGroup.headers as header}
|
||||||
<TableHeader {header} />
|
<TableHeader {header} />
|
||||||
{/each}
|
{/each}
|
||||||
</tr>
|
</tr>
|
||||||
{/each}
|
{/each}
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{#each $table.getRowModel().rows as row}
|
{#each $table.getRowModel().rows as row}
|
||||||
<tr class="odd:bg-white even:bg-gray-100">
|
<tr class="odd:bg-white even:bg-gray-100">
|
||||||
<td class="inset-y-0 left-0 px-4 py-2 text-center w-px">
|
<td class="inset-y-0 left-0 px-4 py-2 text-center w-px">
|
||||||
<InputElement
|
<InputElement
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={row.getIsSelected()}
|
checked={row.getIsSelected()}
|
||||||
on:change={() => row.toggleSelected()}
|
on:change={() => row.toggleSelected()}
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
{#each row.getVisibleCells() as cell}
|
{#each row.getVisibleCells() as cell}
|
||||||
<td>
|
<td>
|
||||||
<svelte:component
|
<svelte:component
|
||||||
this={flexRender(
|
this={flexRender(
|
||||||
cell.column.columnDef.cell,
|
cell.column.columnDef.cell,
|
||||||
cell.getContext()
|
cell.getContext()
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
{/each}
|
{/each}
|
||||||
</tr>
|
</tr>
|
||||||
{/each}
|
{/each}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="h-2" />
|
<div class="h-2" />
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
<TableBottom {table} {selected} />
|
<TableBottom {table} {selected} />
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:CREATE")}
|
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:CREATE")}
|
||||||
<AddRunnerModal
|
<AddRunnerModal
|
||||||
bind:modal_open
|
bind:modal_open
|
||||||
on:created={(event) => {
|
on:created={(event) => {
|
||||||
addRunners(event.detail.runners);
|
addRunners(event.detail.runners);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<ImportRunnerModal
|
<ImportRunnerModal
|
||||||
on:cancelDelete={(event) => {
|
on:cancelDelete={(event) => {
|
||||||
import_modal_open = false;
|
import_modal_open = false;
|
||||||
}}
|
}}
|
||||||
passed_team={{}}
|
passed_team={{}}
|
||||||
passed_orgs={[]}
|
passed_orgs={[]}
|
||||||
passed_org={{}}
|
passed_org={{}}
|
||||||
opened_from="RunnerOverview"
|
opened_from="RunnerOverview"
|
||||||
bind:import_modal_open
|
bind:import_modal_open
|
||||||
on:created={(event) => {
|
on:created={(event) => {
|
||||||
addRunners(event.detail.runners);
|
addRunners(event.detail.runners);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
table tbody tr td:nth-child(2) {
|
table tbody tr td:nth-child(2) {
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -88,7 +88,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -99,7 +99,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -131,7 +131,7 @@
|
|||||||
>{$_("runner")}</label
|
>{$_("runner")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
filterRunners(label, filterText, option)}
|
filterRunners(label, filterText, option)}
|
||||||
items={runners}
|
items={runners}
|
||||||
@ -195,7 +195,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -66,7 +66,7 @@
|
|||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -90,7 +90,7 @@
|
|||||||
<button
|
<button
|
||||||
on:click={submit}
|
on:click={submit}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("delete")}
|
{$_("delete")}
|
||||||
</button>
|
</button>
|
||||||
@ -99,7 +99,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -218,7 +218,7 @@
|
|||||||
>{$_("runner")}</label
|
>{$_("runner")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
filterRunners(label, filterText, option)}
|
filterRunners(label, filterText, option)}
|
||||||
items={current_runners}
|
items={current_runners}
|
||||||
|
@ -92,7 +92,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -103,7 +103,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -133,7 +133,7 @@
|
|||||||
class="block text-sm font-medium text-gray-700">Track</label
|
class="block text-sm font-medium text-gray-700">Track</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
option.value.id
|
option.value.id
|
||||||
@ -178,7 +178,7 @@
|
|||||||
name="enabled"
|
name="enabled"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={enabled}
|
checked={enabled}
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
{$_("this-scanstation-is")}
|
{$_("this-scanstation-is")}
|
||||||
{#if enabled}{$_("enabled")}{:else}{$_("disabled")}{/if}
|
{#if enabled}{$_("enabled")}{:else}{$_("disabled")}{/if}
|
||||||
@ -203,7 +203,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -53,7 +53,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -82,14 +82,14 @@
|
|||||||
<button
|
<button
|
||||||
on:click={deleteStation}
|
on:click={deleteStation}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("confirm-delete-station-with-all-scans")}
|
{$_("confirm-delete-station-with-all-scans")}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={cancelDelete}
|
on:click={cancelDelete}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel-keep-station")}
|
{$_("cancel-keep-station")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { tick } from "svelte";
|
import { tick } from "svelte";
|
||||||
import { toCanvas } from "@bwip-js/browser";
|
import bwipjs from "bwip-js";
|
||||||
import toast from "svelte-french-toast";
|
import toast from "svelte-french-toast";
|
||||||
|
|
||||||
export let copy_modal_open;
|
export let copy_modal_open;
|
||||||
@ -51,7 +51,7 @@
|
|||||||
if (bcid == "code128") {
|
if (bcid == "code128") {
|
||||||
codeconfig.height = 10;
|
codeconfig.height = 10;
|
||||||
}
|
}
|
||||||
toCanvas(canvas, codeconfig);
|
bwipjs.toCanvas(canvas, codeconfig);
|
||||||
return canvas.toDataURL("image/png");
|
return canvas.toDataURL("image/png");
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@ -75,7 +75,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -86,7 +86,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -170,7 +170,7 @@
|
|||||||
<img
|
<img
|
||||||
class:w-[50%]={is_qrcode}
|
class:w-[50%]={is_qrcode}
|
||||||
class:w-full={!is_qrcode}
|
class:w-full={!is_qrcode}
|
||||||
class="w-full lg:max-w-[50vw] lg:max-h-[10rem] object-contain mb-2 mx-auto"
|
class="md:w-auto mb-2 mx-auto"
|
||||||
alt="Registrierungscode"
|
alt="Registrierungscode"
|
||||||
src={textToBase64Barcode(window.config.baseurl, is_qrcode)}
|
src={textToBase64Barcode(window.config.baseurl, is_qrcode)}
|
||||||
/>
|
/>
|
||||||
@ -178,15 +178,13 @@
|
|||||||
<img
|
<img
|
||||||
class:w-[50%]={is_qrcode}
|
class:w-[50%]={is_qrcode}
|
||||||
class:w-full={!is_qrcode}
|
class:w-full={!is_qrcode}
|
||||||
class="w-full lg:max-w-[50vw] lg:max-h-[10rem] object-contain mb-2 mx-auto"
|
class="md:w-auto mb-2 mx-auto"
|
||||||
alt="Registrierungscode"
|
alt="Registrierungscode"
|
||||||
src={barcode}
|
src={barcode}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
|
||||||
class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10"
|
|
||||||
>
|
|
||||||
<button
|
<button
|
||||||
on:click={close}
|
on:click={close}
|
||||||
type="button"
|
type="button"
|
||||||
|
@ -178,7 +178,7 @@
|
|||||||
name="enabled"
|
name="enabled"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={editable.enabled}
|
checked={editable.enabled}
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
{$_("this-scanstation-is")}
|
{$_("this-scanstation-is")}
|
||||||
{#if editable.enabled}{$_("enabled")}{:else}{$_("disabled")}{/if}
|
{#if editable.enabled}{$_("enabled")}{:else}{$_("disabled")}{/if}
|
||||||
|
@ -210,7 +210,7 @@
|
|||||||
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
||||||
>
|
>
|
||||||
<span class="inline-block align-middle mr-8">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -54,7 +54,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -85,14 +85,14 @@
|
|||||||
<button
|
<button
|
||||||
on:click={deleteMe}
|
on:click={deleteMe}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("confirm-delete-my-user-profile")}
|
{$_("confirm-delete-my-user-profile")}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={cancelDelete}
|
on:click={cancelDelete}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel-keep-my-profile")}
|
{$_("cancel-keep-my-profile")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -15,8 +15,6 @@
|
|||||||
<button on:click={detailsAction} class="text-indigo-600 hover:text-indigo-900"
|
<button on:click={detailsAction} class="text-indigo-600 hover:text-indigo-900"
|
||||||
>{$_("details")}</button
|
>{$_("details")}</button
|
||||||
>
|
>
|
||||||
{:else}
|
|
||||||
<span class="inline-block opacity-0 cursor-default" style="">{$_("details")}</span>
|
|
||||||
{/if}
|
{/if}
|
||||||
{#if deleteEnabled}
|
{#if deleteEnabled}
|
||||||
<button
|
<button
|
||||||
|
@ -78,7 +78,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -89,7 +89,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -148,7 +148,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -52,7 +52,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@ -81,14 +81,14 @@
|
|||||||
<button
|
<button
|
||||||
on:click={deleteClient}
|
on:click={deleteClient}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("confirm-delete-statsclient")}
|
{$_("confirm-delete-statsclient")}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={cancelDelete}
|
on:click={cancelDelete}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel-keep-statsclient")}
|
{$_("cancel-keep-statsclient")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -63,7 +63,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
|
@ -161,7 +161,7 @@
|
|||||||
{:catch error}
|
{:catch error}
|
||||||
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
<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">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -89,7 +89,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -100,7 +100,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -158,7 +158,7 @@
|
|||||||
>{$_("organization")}</label
|
>{$_("organization")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
option.value.id
|
option.value.id
|
||||||
@ -199,7 +199,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -55,7 +55,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -85,14 +85,14 @@
|
|||||||
<button
|
<button
|
||||||
on:click={deleteTeam}
|
on:click={deleteTeam}
|
||||||
type="button"
|
type="button"
|
||||||
class="confirm_deletion_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"
|
||||||
>
|
>
|
||||||
{$_("confirm-delete-team-and-associated-runners")}
|
{$_("confirm-delete-team-and-associated-runners")}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={cancelDelete}
|
on:click={cancelDelete}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel-keep-team")}
|
{$_("cancel-keep-team")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -212,7 +212,7 @@
|
|||||||
>{$_("contact")}</label
|
>{$_("contact")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
option.value.id.toString().startsWith(filterText.toLowerCase())}
|
option.value.id.toString().startsWith(filterText.toLowerCase())}
|
||||||
@ -231,7 +231,7 @@
|
|||||||
>{$_("organization")}</label
|
>{$_("organization")}</label
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
containerClasses="rounded-l-md 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-neutral-800 rounded-md p-2"
|
||||||
itemFilter={(label, filterText, option) =>
|
itemFilter={(label, filterText, option) =>
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
||||||
option.id.value.toString().startsWith(filterText.toLowerCase())}
|
option.id.value.toString().startsWith(filterText.toLowerCase())}
|
||||||
|
@ -144,7 +144,7 @@
|
|||||||
<input
|
<input
|
||||||
bind:checked={t.is_selected}
|
bind:checked={t.is_selected}
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
@ -215,7 +215,7 @@
|
|||||||
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
|
||||||
>
|
>
|
||||||
<span class="inline-block align-middle mr-8">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,548 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { _, time } from "svelte-i18n";
|
|
||||||
import { RunnerCardService, RunnerService } from "@odit/lfk-client-js";
|
|
||||||
import QrCodeScanner from "./QrCodeScanner.svelte";
|
|
||||||
import { onMount } from "svelte";
|
|
||||||
let state = "scan_runner";
|
|
||||||
let runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
let cardCode = "";
|
|
||||||
let scannerActive = true;
|
|
||||||
let barcodeInput;
|
|
||||||
let nextButton;
|
|
||||||
let tryAgainButton;
|
|
||||||
|
|
||||||
function resetAll() {
|
|
||||||
state = "scan_runner";
|
|
||||||
runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
cardCode = "";
|
|
||||||
scannerActive = true;
|
|
||||||
setTimeout(() => {
|
|
||||||
barcodeInput && barcodeInput.focus();
|
|
||||||
}, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
onMount(() => {
|
|
||||||
if (barcodeInput) {
|
|
||||||
barcodeInput.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function handleInput(input) {
|
|
||||||
if (runnerinfo.id === 0) {
|
|
||||||
new Audio("/beep.mp3").play();
|
|
||||||
if (input.includes("https://portal.lauf-fuer-kaya.de/profile/")) {
|
|
||||||
const runnerID = JSON.parse(
|
|
||||||
atob(
|
|
||||||
input
|
|
||||||
.replace("https://portal.lauf-fuer-kaya.de/profile/", "")
|
|
||||||
.split(".")[1]
|
|
||||||
)
|
|
||||||
).id;
|
|
||||||
RunnerService.runnerControllerGetOne(runnerID)
|
|
||||||
.then((runner) => {
|
|
||||||
runnerinfo = runner;
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
console.error(e);
|
|
||||||
state = "error_runner";
|
|
||||||
setTimeout(() => {
|
|
||||||
tryAgainButton && tryAgainButton.focus();
|
|
||||||
}, 100);
|
|
||||||
// resetAll();
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const runnerID = parseInt(input);
|
|
||||||
RunnerService.runnerControllerGetOne(runnerID)
|
|
||||||
.then((runner) => {
|
|
||||||
runnerinfo = runner;
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
console.error(e);
|
|
||||||
state = "error_runner";
|
|
||||||
setTimeout(() => {
|
|
||||||
tryAgainButton && tryAgainButton.focus();
|
|
||||||
}, 100);
|
|
||||||
// resetAll();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (`${input}`.length > 10) {
|
|
||||||
cardCode = input;
|
|
||||||
new Audio("/beep.mp3").play();
|
|
||||||
state = "assigning";
|
|
||||||
RunnerCardService.runnerCardControllerGetAll()
|
|
||||||
.then((cards) => {
|
|
||||||
// console.log(cards);
|
|
||||||
const card = cards.find((c) => c.code === cardCode);
|
|
||||||
if (card) {
|
|
||||||
console.log("card found", card);
|
|
||||||
RunnerCardService.runnerCardControllerPut(card.id, {
|
|
||||||
enabled: true,
|
|
||||||
id: card.id,
|
|
||||||
runner: runnerinfo.id,
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
state = "done";
|
|
||||||
setTimeout(() => {
|
|
||||||
nextButton && nextButton.focus();
|
|
||||||
}, 100);
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
state = "error_card";
|
|
||||||
scannerActive = false;
|
|
||||||
setTimeout(() => {
|
|
||||||
tryAgainButton && tryAgainButton.focus();
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
console.log("card not found");
|
|
||||||
// scannerActive = true;
|
|
||||||
state = "error_card";
|
|
||||||
scannerActive = false;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
scannerActive = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div class="p-4">
|
|
||||||
<h3 class="text-3xl font-bold">{$_("card_assignment_for_mobile")}</h3>
|
|
||||||
{#if state === "done"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
class="h-64 mx-auto"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 500 500"
|
|
||||||
><path
|
|
||||||
d="m339.91 38.77-2 1.14c-16.77 9.58-27.19 27.41-26.49 46.53a50.12 50.12 0 0 0 .81 7.33 54.34 54.34 0 0 0 32.62 39.6c9.79 3.94 21.14 5.27 28.8 12.46 10 9.36 9.88 24.8 9.1 38.36s-.83 29 9.18 38.32c6.27 5.84 15.36 7.88 24 7.65 22.8-.61 43.57-15.93 54.22-35.83s12.18-43.63 8.31-65.82c-5.46-31.09-21.78-60.95-47.75-79.33s-61.88-23.8-90.8-10.41ZM152.06 393l2.36-.64c19.89-5.4 35.44-21 39.85-41a55.18 55.18 0 0 0 1.13-7.79 58 58 0 0 0-23.09-49.67c-9.05-6.7-20.43-11.12-26.42-20.6-7.79-12.35-3.56-28.28.89-42.08s8.63-29.75.79-42.07c-4.91-7.71-13.75-12.25-22.71-14.32-23.71-5.49-49.29 4.77-65.63 22.48S34.94 239.14 33 263.11c-2.74 33.57 6.14 68.81 28.05 94.77s57.54 41.19 91.01 35.12Z"
|
|
||||||
style="fill:#f5f5f5"
|
|
||||||
/><circle
|
|
||||||
cx="409.16"
|
|
||||||
cy="320.55"
|
|
||||||
r="36.72"
|
|
||||||
style="fill:#f5f5f5"
|
|
||||||
transform="rotate(-45 409.165 320.548)"
|
|
||||||
/><path
|
|
||||||
d="M470.34 473.11c0 .15-98.66.26-220.33.26s-220.35-.11-220.35-.26 98.64-.26 220.35-.26 220.33.15 220.33.26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M453.56 473.11a9.53 9.53 0 0 1-1-2c-.54-1.27-1.24-3-2-5s-1.4-3.53-2-5a14.87 14.87 0 0 1-.8-2.09 7.37 7.37 0 0 1 1.14 1.93c.61 1.25 1.36 3 2.13 5s1.42 3.75 1.87 5a10.55 10.55 0 0 1 .66 2.16ZM458.16 473.31c-.15 0-.66-3.33-1.59-7.41s-1.9-7.32-1.76-7.37a8.61 8.61 0 0 1 .84 2.07c.44 1.31 1 3.14 1.43 5.19s.77 3.93.94 5.29a8.54 8.54 0 0 1 .14 2.23ZM466.32 459.42c.14.08-1.36 3.08-2.88 6.91s-2.51 7-2.66 7a9.06 9.06 0 0 1 .46-2.15 53.35 53.35 0 0 1 3.93-9.86 8.66 8.66 0 0 1 1.15-1.9ZM225.88 473.11a74 74 0 0 1-6.08-10.68 71.59 71.59 0 0 1 6.08 10.68ZM230.2 473a79 79 0 0 1-2.66-12.67A82 82 0 0 1 230.2 473ZM239.31 461.69a39.45 39.45 0 0 1-3.08 5.76 41.06 41.06 0 0 1-3.53 5.49 39.66 39.66 0 0 1 3.08-5.75 42.46 42.46 0 0 1 3.53-5.5ZM55.68 473.11a29 29 0 0 1-2.94-4.68 29 29 0 0 1-2.49-4.93 29.84 29.84 0 0 1 2.94 4.68 29.92 29.92 0 0 1 2.49 4.93ZM58.09 457.6a60.92 60.92 0 0 1 1.17 7.73 56.51 56.51 0 0 1 .64 7.78 118.57 118.57 0 0 1-1.81-15.51ZM67.49 462.53a29.15 29.15 0 0 1-1.38 5.37 29.37 29.37 0 0 1-1.88 5.21 29.37 29.37 0 0 1 1.38-5.36 31.72 31.72 0 0 1 1.88-5.22Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M141.72 440a6.16 6.16 0 0 1 3.2 3.62 11 11 0 0 1 .43 4.91c-.37 3.19-2.18 6.4-4.12 8.95-2.69-2.34-3.3-6.43-3.49-8.52-.29-3.31 1.2-9.46 4-9M144.34 462.69a5.24 5.24 0 0 1 1.71-5 7 7 0 0 1 5.15-1.61 2.94 2.94 0 0 1 2.27 1 2.26 2.26 0 0 1 0 2.29 4.49 4.49 0 0 1-1.69 1.66c-2.32 1.46-4.84 2.44-7.47 1.65"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M140.9 472.46a4.38 4.38 0 0 1 .1-.65c.08-.46.19-1.06.32-1.77a18.5 18.5 0 0 1 1.83-5.65 11.28 11.28 0 0 1 4.06-4.31 7.33 7.33 0 0 1 1.65-.73 3 3 0 0 1 .48-.12h.17a11.36 11.36 0 0 0-2.22 1 11.75 11.75 0 0 0-3.94 4.28 20.19 20.19 0 0 0-1.87 5.57c-.16.74-.29 1.34-.39 1.76a2.49 2.49 0 0 1-.19.62Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M141 444.74a1.36 1.36 0 0 1 0 .29l.05.82c0 .71.08 1.74.12 3 .08 2.55.14 6.08.13 10s-.11 7.42-.22 10c-.05 1.28-.1 2.31-.15 3 0 .33 0 .6-.05.82a1.33 1.33 0 0 1 0 .28 1.29 1.29 0 0 1 0-.29v-.82c0-.74.05-1.77.08-3 .06-2.55.13-6.08.15-10s0-7.42-.07-10V445c-.04-.16-.04-.26-.04-.26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M139.7 464.63a12.32 12.32 0 0 0-6.72-9c-.9-.43-2.07-.71-2.81 0s-.57 1.86-.21 2.79a10.54 10.54 0 0 0 9.68 6.54"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M133.41 458.63a3 3 0 0 1 .57.25 5.17 5.17 0 0 1 .64.34 9.69 9.69 0 0 1 .82.52 9.89 9.89 0 0 1 .94.7 11.62 11.62 0 0 1 1 .91 13.72 13.72 0 0 1 1.89 2.43 14 14 0 0 1 1.25 2.82 10.26 10.26 0 0 1 .31 1.31 9.15 9.15 0 0 1 .16 1.16 8.75 8.75 0 0 1 0 1v.73a4 4 0 0 1-.07.62s0-.89-.12-2.3a10.83 10.83 0 0 0-.19-1.14 11.51 11.51 0 0 0-.33-1.28 13.92 13.92 0 0 0-1.24-2.77 14.19 14.19 0 0 0-1.85-2.4 10.11 10.11 0 0 0-1-.91 10.49 10.49 0 0 0-.9-.72c-1.1-.9-1.9-1.22-1.88-1.27Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M411.83 430.38a8.16 8.16 0 0 1 4.22 4.79 14.35 14.35 0 0 1 .57 6.48c-.48 4.21-2.87 8.46-5.45 11.82-3.54-3.09-4.35-8.49-4.6-11.25-.38-4.36 1.58-12.49 5.26-11.84M415.29 460.41a7 7 0 0 1 2.25-6.61 9.26 9.26 0 0 1 6.81-2.13 3.89 3.89 0 0 1 3 1.35 3 3 0 0 1 .05 3 6 6 0 0 1-2.23 2.2c-3.07 1.93-6.4 3.23-9.87 2.18"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M410.75 473.31a5.31 5.31 0 0 1 .13-.86l.42-2.34a24.66 24.66 0 0 1 2.42-7.46 14.9 14.9 0 0 1 5.35-5.69 10.1 10.1 0 0 1 2.19-1 6.47 6.47 0 0 1 .63-.16.61.61 0 0 1 .22 0 13.81 13.81 0 0 0-8.13 7 26.37 26.37 0 0 0-2.46 7.36c-.22 1-.39 1.77-.53 2.32a4.05 4.05 0 0 1-.24.83Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M410.88 436.7a1.65 1.65 0 0 1 .05.38q0 .42.06 1.08c.05.94.11 2.31.16 4 .11 3.38.19 8 .17 13.18s-.15 9.81-.28 13.18c-.07 1.69-.14 3.05-.2 4 0 .44 0 .8-.07 1.08a1.65 1.65 0 0 1 0 .38 2.21 2.21 0 0 1 0-.38v-1.08c0-1 .06-2.34.1-4 .08-3.37.17-8 .2-13.17s0-9.8-.09-13.17c0-1.66 0-3-.06-4v-1.09a2.79 2.79 0 0 1-.04-.39Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M409.16 463a16.22 16.22 0 0 0-8.88-11.92c-1.19-.57-2.73-.94-3.71-.06s-.75 2.46-.28 3.69a13.9 13.9 0 0 0 12.79 8.63"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M400.85 455.05a3.47 3.47 0 0 1 .75.32 9.58 9.58 0 0 1 .85.46 10.94 10.94 0 0 1 1.08.68 12.91 12.91 0 0 1 1.24.93 15.58 15.58 0 0 1 1.32 1.19 16.82 16.82 0 0 1 4.15 6.94 16.17 16.17 0 0 1 .42 1.74 13.28 13.28 0 0 1 .21 1.53c.06.47 0 .9.06 1.28a9.24 9.24 0 0 1 0 1 4.38 4.38 0 0 1-.09.81c-.07 0 .05-1.17-.16-3-.06-.46-.12-1-.24-1.51s-.27-1.1-.44-1.69a18.46 18.46 0 0 0-1.64-3.65 19.56 19.56 0 0 0-2.44-3.18 17.44 17.44 0 0 0-1.28-1.2c-.41-.37-.83-.67-1.2-.95-1.55-1.16-2.62-1.64-2.59-1.7ZM155.45 292c0 .14-14 .26-31.2.26S93 292.15 93 292s14-.26 31.21-.26 31.24.12 31.24.26ZM136.75 284.1c0 .14-14 .26-31.2.26s-31.21-.12-31.21-.26 14-.26 31.21-.26 31.2.16 31.2.26ZM294.43 412.9c0 .14-8.07.26-18 .26s-18-.12-18-.26 8.06-.26 18-.26 18 .12 18 .26ZM283.64 405c0 .15-8.07.26-18 .26s-18-.11-18-.26 8.06-.26 18-.26 18 .11 18 .26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><circle cx="88.02" cy="72.37" r="14.66" style="fill:#5e9cff" /><path
|
|
||||||
d="M88 87a14.68 14.68 0 0 1-13.52-9 14.78 14.78 0 0 1 0-11.43A14.84 14.84 0 0 1 77.64 62a14.69 14.69 0 0 1 20.76 0 14.84 14.84 0 0 1 3.14 4.66A14.67 14.67 0 0 1 88 87ZM85.93 105.14c-.08 0-.15-2.7-.15-6s.07-6 .15-6a56.83 56.83 0 0 1 .16 6 56.56 56.56 0 0 1-.16 6Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M85.93 105.16s-.08 0-.12-1.79v-8.55c0-1.78.09-1.78.12-1.78s.08 0 .13 1.78v8.55c-.06 1.79-.06 1.79-.13 1.79Zm0-12.08c-.07.22-.14 2.52-.14 6s.07 5.79.14 6c.07-.23.14-2.52.14-6s-.07-5.78-.14-6ZM77.48 89.64a63 63 0 0 1-3.07 5.64c-1.78 3.08-3.28 5.53-3.35 5.49a63.32 63.32 0 0 1 3.08-5.64c1.77-3.07 3.27-5.53 3.34-5.49Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M71.06 100.79s-.07 0 .84-1.7c.58-1.07 1.38-2.47 2.23-4s1.68-2.87 2.32-3.91c.89-1.46 1-1.58 1-1.58s.07 0-.84 1.7c-.58 1.07-1.37 2.48-2.23 4-1.52 2.64-3.22 5.46-3.35 5.5Zm6.41-11.12c-.18.17-1.46 2.25-3.32 5.47s-3 5.36-3.08 5.61c.18-.18 1.46-2.25 3.32-5.47s3.02-5.37 3.08-5.61ZM68.81 84.24a31 31 0 0 1-3.42 2.92 32.1 32.1 0 0 1-3.61 2.68 32.32 32.32 0 0 1 3.42-2.92 35.42 35.42 0 0 1 3.61-2.68Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M61.78 89.86s0-.06 1-.93c.65-.55 1.52-1.26 2.46-2a35.08 35.08 0 0 1 3.62-2.68 34.93 34.93 0 0 1-3.43 2.92c-.94.75-1.83 1.44-2.52 2a5 5 0 0 1-1.13.69Zm7-5.6a38.16 38.16 0 0 0-3.59 2.67 40.2 40.2 0 0 0-3.42 2.9 37.22 37.22 0 0 0 3.59-2.68 39.77 39.77 0 0 0 3.44-2.89Zm0 0ZM100.56 99.19a7.77 7.77 0 0 1-.39-1.49c-.21-.92-.51-2.19-.89-3.59s-.75-2.64-1-3.55a8.5 8.5 0 0 1-.41-1.48 7.14 7.14 0 0 1 .62 1.41c.33.89.75 2.14 1.12 3.54a36.32 36.32 0 0 1 .8 3.63 6.9 6.9 0 0 1 .15 1.53Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M100.55 99.2s-.11-.22-.4-1.5c-.19-.86-.5-2.16-.88-3.58s-.78-2.72-1-3.55c-.37-1.2-.45-1.46-.4-1.48s0 0 .22.37.27.64.42 1c.23.6.68 1.87 1.13 3.54s.69 3 .8 3.62a7.38 7.38 0 0 1 .17 1.54Zm-2.7-10.09a13.79 13.79 0 0 0 .41 1.43c.26.83.65 2.1 1 3.55s.69 2.73.88 3.59.32 1.37.37 1.46a10.18 10.18 0 0 0-.18-1.5c-.11-.64-.35-2-.8-3.62s-.9-2.94-1.13-3.54a9.12 9.12 0 0 0-.55-1.37ZM115.42 88.64a54.77 54.77 0 0 1-4.33-3.58 51.8 51.8 0 0 1-4.09-3.82 50.82 50.82 0 0 1 4.33 3.58 49.69 49.69 0 0 1 4.09 3.82Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M115.42 88.65a54.61 54.61 0 0 1-4.34-3.58c-1.13-1-2.18-1.93-3-2.65-1.22-1.13-1.19-1.17-1.17-1.19.15 0 2.34 1.85 4.33 3.59 1.13 1 2.19 1.93 3 2.65 1.22 1.13 1.18 1.17 1.16 1.19ZM107 81.26c.11.18 1.67 1.64 4.12 3.78s4.11 3.5 4.3 3.58c-.1-.19-1.67-1.64-4.12-3.79s-4.12-3.49-4.3-3.57ZM121.12 74.14a11.91 11.91 0 0 1-1.77-.26c-1.09-.18-2.59-.41-4.25-.6s-3.19-.3-4.29-.37a10.88 10.88 0 0 1-1.78-.16 8.74 8.74 0 0 1 1.79-.06 43.17 43.17 0 0 1 4.31.28c1.68.2 3.18.46 4.26.7a9.11 9.11 0 0 1 1.73.47Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M121.07 74.16c-.13 0-.49-.06-1.37-.2l-.35-.06c-1.49-.25-2.92-.45-4.26-.61s-2.77-.27-4.28-.37h-.35c-1.2-.08-1.44-.1-1.44-.15a9.68 9.68 0 0 1 1.79-.07 42.81 42.81 0 0 1 4.31.29 41.81 41.81 0 0 1 4.26.7 9.36 9.36 0 0 1 1.74.47s-.01 0-.05 0Zm-12-1.41a13.35 13.35 0 0 0 1.41.12h.35c1.51.1 3 .22 4.28.37s2.77.36 4.25.61l.35.06c.71.12 1.24.2 1.37.2a12.87 12.87 0 0 0-1.7-.44 41.81 41.81 0 0 0-4.26-.7 43 43 0 0 0-4.31-.29 13.47 13.47 0 0 0-1.75.07ZM121.14 59.88c0 .08-3.16.93-7.09 1.89s-7.14 1.66-7.16 1.58 3.15-.92 7.09-1.88 7.14-1.67 7.16-1.59Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M106.92 63.37s0-.08 2.07-.64c1.34-.35 3.13-.8 5-1.27s3.7-.88 5-1.18c2.11-.47 2.13-.42 2.13-.39s0 .07-2.07.63c-1.34.36-3.12.81-5 1.27s-3.69.88-5 1.18a16 16 0 0 1-2.13.4Zm14.18-3.48c-.29 0-3 .59-7.12 1.59s-6.8 1.73-7.06 1.86c.29 0 3-.58 7.13-1.59s6.8-1.75 7.05-1.86ZM104.57 43.27a63.61 63.61 0 0 1-3.39 5.41c-1.94 2.94-3.58 5.29-3.65 5.24s1.45-2.47 3.39-5.41 3.58-5.29 3.65-5.24Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M97.53 53.93c0-.14 1.72-2.9 3.39-5.42.94-1.42 1.84-2.75 2.53-3.74 1.06-1.52 1.12-1.52 1.14-1.5s.07 0-.93 1.64c-.65 1-1.52 2.37-2.46 3.79s-1.83 2.75-2.52 3.74c-.98 1.37-1.11 1.49-1.15 1.49Zm7-10.64c-.19.17-1.59 2.15-3.62 5.23s-3.32 5.14-3.39 5.37c.19-.16 1.58-2.14 3.62-5.22s3.34-5.14 3.42-5.38ZM88.13 39.8a12.88 12.88 0 0 1 0 2v4.85c0 1.85 0 3.61.06 4.85a14.66 14.66 0 0 1 0 2 11.36 11.36 0 0 1-.2-2c-.08-1.24-.14-3-.14-4.86s0-3.61.13-4.86a12.13 12.13 0 0 1 .15-1.98Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M88.15 53.54s-.05 0-.1-.55-.08-.88-.12-1.47c-.05-.84-.14-2.58-.14-4.86s.08-4 .13-4.86c0-.59.07-1.09.11-1.47s.08-.55.1-.55c.05 0 .07.19 0 2v4.85c0 1.91 0 3.54.05 4.77v2.08Zm0-13.71a18 18 0 0 0-.18 2c0 .83-.13 2.58-.13 4.85s.09 4 .14 4.86a16.64 16.64 0 0 0 .19 2v-2.08c0-1.23-.05-2.92-.05-4.77v-4.85c.03-.76.05-1.84.01-2.01ZM75.68 55.3c-.07.05-1.61-2.35-3.44-5.34s-3.24-5.47-3.19-5.51 1.62 2.35 3.45 5.35a63 63 0 0 1 3.18 5.5Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M75.68 55.32s-.16-.12-1.07-1.54c-.65-1-1.5-2.37-2.39-3.82-1.57-2.57-3.22-5.37-3.22-5.51s.07 0 1.09 1.54c.65 1 1.5 2.37 2.38 3.82s1.71 2.82 2.31 3.86c.94 1.63.9 1.65.87 1.67Zm-6.61-10.85c.06.24 1.26 2.34 3.18 5.48s3.24 5.16 3.42 5.33c-.07-.24-1.26-2.34-3.18-5.48s-3.24-5.16-3.42-5.33ZM68.25 61.62a7 7 0 0 1-1.56-.24c-1-.2-2.26-.52-3.69-.94s-2.7-.87-3.6-1.21a7.56 7.56 0 0 1-1.4-.64 8.28 8.28 0 0 1 1.52.43c.92.3 2.2.7 3.62 1.12s2.71.77 3.65 1a9.86 9.86 0 0 1 1.46.48Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M68.2 61.65h-.38c-.29 0-.68-.12-1.13-.22-.65-.13-2-.44-3.69-.94s-3-1-3.61-1.21l-1.07-.44c-.4-.17-.39-.2-.38-.22s.22 0 1.53.42c.74.24 2.12.68 3.62 1.13s2.6.74 3.65 1c1.34.36 1.53.43 1.52.48s0 0-.06 0ZM58 58.6a9.9 9.9 0 0 0 1.42.61c.62.24 1.9.71 3.61 1.21s3 .81 3.68.94a10.47 10.47 0 0 0 1.51.26 15.06 15.06 0 0 0-1.48-.44c-1-.28-2.29-.62-3.65-1s-2.89-.91-3.63-1.18c-.58-.15-1.36-.4-1.46-.4ZM65 72.89a38 38 0 0 1-4.68.6 37.31 37.31 0 0 1-4.71.3 35.07 35.07 0 0 1 4.68-.61 34.11 34.11 0 0 1 4.71-.29Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M55.88 73.83a1 1 0 0 1-.27 0 39.32 39.32 0 0 1 4.69-.6 39.75 39.75 0 0 1 4.72-.3 40.29 40.29 0 0 1-4.69.61c-1.81.14-3.74.29-4.45.29Zm-.24 0a43.5 43.5 0 0 0 4.68-.31 46 46 0 0 0 4.68-.63 43.61 43.61 0 0 0-4.69.31 39.33 39.33 0 0 0-4.67.59Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="m321.8 444.95 7.41 19.13 16.31-3.83 3.59-8.75-5.52-18.14-21.79 11.59z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="m349.94 449.25.58 1.45s29 0 31.09 4.61l-49.89 19.33-5.66-16.58c8.73.5 16.64-2.13 23.88-8.81Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="M333.13 461.32a2.15 2.15 0 0 0-.52 2.83 2.11 2.11 0 0 0 2.84.5 2.25 2.25 0 0 0 .53-3 2.19 2.19 0 0 0-3-.2"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="m331.72 474.64-1.36-4 48.32-17.07s2.59.09 2.93 1.73Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><path
|
|
||||||
d="M350.75 450.77c.08.24-1.1.82-2 2.06s-1.15 2.48-1.41 2.48-.44-1.54.68-3 2.69-1.78 2.73-1.54ZM356.81 450.87c.14.21-.76 1-1.19 2.36s-.26 2.5-.5 2.58-.93-1.21-.36-2.86 1.95-2.31 2.05-2.08ZM362.17 455.87c-.2.14-1-.93-.89-2.48s1.05-2.52 1.23-2.36-.25 1.14-.32 2.41.21 2.32-.02 2.43ZM259.73 325.23c.43 1.14 27.19 31 33.15 39.7 6.74 9.84 8.16 18.16 8.49 20.11 1.86 11.15 3.25 19 8.31 31.15S324.73 454 324.73 454l23.63-6.09s-13.93-59.44-15.19-69.34-3.38-17.57-8.87-26.67-29.71-58.77-29.71-58.77l-38.28 16.09Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M242.57 240.76s7.74.11 8.88.82 5.69 4.21 5.69 5a3 3 0 0 0 .32 1.38s2.86 4 1.57 5.71-2.24 2.27-2.21 2.8-.38 2.37-1.47 2.87a10.78 10.78 0 0 0-2.88 1.84 10.63 10.63 0 0 1-1.73 2.06 10.75 10.75 0 0 1-2.48 1.15 2.92 2.92 0 0 1-2.55 1.57c-1.64-.15-4.63-3.27-5.6-4.43-1.21-1.45-4.29-4-4.69-5.29a14.76 14.76 0 0 0-.92-2.3l-7.5-7.09 11.7-11.75Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M257.7 248.6a20.35 20.35 0 0 1-2.46-2.31 19.31 19.31 0 0 1-2.41-2.36 11.74 11.74 0 0 1 4.87 4.67Z"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M238.46 161.84s-8.9 7.54-11 9.43-29.46 24.87-31.29 35.27c-1.16 6.66 4 11.87 6.77 16.24 2 3.26 14.32 25.66 25.83 26.31.68 0 4.15 4.28 4.15 4.28l12.49-10.65a52.68 52.68 0 0 1-4.73-7c-5-9.38-15.89-24-15.55-24.66 2.43-4.55-3.34-3.47-3.34-3.47l23.94-21.95Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M198.89 199.64s-1.73-3.09 0-5.67S225 171.68 225 171.68s1.19.31 2.06 2.27-27 26.62-27 26.62Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M207.41 192.32s14 15.79 16 15.27 11.7-7.84 12.14-10.22-13.33-19-13.33-19ZM187.57 91.83c3.07.73 5.47 3.21 8.28 4.74 5.27 2.86 11.66 2.1 16.68-.23s9.1-6 13.61-9.1 8.09-6.22 14.6-6.81c11.49-1 23 9.11 17.78 17.7l-9.65 3.37a60.17 60.17 0 0 1-25.79 32.32c-2.42 1.47-5.16 2.83-8.17 2.45s-6.07-3.25-5.43-6c-4.78 1-9.7 1.92-14.7 1.17s-10.19-3.54-12.41-8-.26-10.48 4.56-11.35c-4.45-2.73-8.26-7.18-8.54-12s4.18-9.45 9.18-8.26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M283.46 72.49c-6.22-1.69-12 .21-17.71 3.25a32.78 32.78 0 0 0-16.23 33.58 25.23 25.23 0 0 0 10.86 16.58c7.83 5 18.5 4.54 26.4-.31s13-13.65 14.27-22.84a30.7 30.7 0 0 0-3.05-18.6 23.36 23.36 0 0 0-14.53-11.66"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M263.37 92.26c1.16-2.33 1.06-5.07 1.68-7.6 1.36-5.57 3.94-10.5 9.42-12.19 5.1-1.57 13.45.3 19.16 2.78a22.62 22.62 0 0 1 9.88 7.9 17.84 17.84 0 0 1 1.71 16.26l-28.5-7c-2.92 2-5.92 4-9.32 4.91a6 6 0 0 1-3.07.19 2.7 2.7 0 0 1-2.06-2.07c-.16-1.15.59-2.17 1.1-3.18Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m257.85 145 5-54.65a4.74 4.74 0 0 1 4.85-4.19l25.76-2.89c8.09.25 12 10.79 11.46 18.86-.65 9-1.81 19.89-3.77 26.38-3.94 13.05-14.39 13.35-14.39 13.35s-.06.52-.78 5.35c0 0-1.31 10-12.46 7.81-7.24-1.42-15.67-10.02-15.67-10.02Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M300.16 112.56a1.72 1.72 0 0 1-1.88 1.5 1.66 1.66 0 0 1-1.56-1.78 1.75 1.75 0 0 1 1.89-1.51 1.65 1.65 0 0 1 1.55 1.79ZM301.8 107.49c-.24.19-1.41-.94-3.25-1.19s-3.32.49-3.49.24.19-.49.84-.84a4.8 4.8 0 0 1 2.83-.46 4.49 4.49 0 0 1 2.54 1.22c.51.54.65.94.53 1.03ZM284.13 110.14a1.73 1.73 0 0 1-1.89 1.5 1.66 1.66 0 0 1-1.55-1.78 1.74 1.74 0 0 1 1.89-1.51 1.65 1.65 0 0 1 1.55 1.79ZM284.19 104.44c-.24.2-1.41-.94-3.25-1.19s-3.32.49-3.49.24.19-.49.84-.83a4.73 4.73 0 0 1 2.83-.47 4.49 4.49 0 0 1 2.54 1.23c.51.51.65.94.53 1.02ZM288.47 119.93a12.12 12.12 0 0 1 3.06-.14c.48 0 .94 0 1.06-.32a2.42 2.42 0 0 0-.12-1.44c-.29-1.2-.59-2.45-.9-3.77-1.24-5.36-2.06-9.74-1.84-9.79s1.39 4.26 2.62 9.62c.29 1.32.58 2.58.84 3.78a2.7 2.7 0 0 1 0 1.88 1.16 1.16 0 0 1-.86.58 3.79 3.79 0 0 1-.82 0 12.7 12.7 0 0 1-3.04-.4Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M286.76 141.88a34.19 34.19 0 0 1-17.21-7.2s3.23 9.85 16.75 10.42ZM287.09 124.26a3.35 3.35 0 0 0-2.81-1.64 3 3 0 0 0-2.24.83 1.93 1.93 0 0 0-.45 2.18 2.26 2.26 0 0 0 2.33.94 7.25 7.25 0 0 0 2.55-1.08 2.35 2.35 0 0 0 .6-.48.64.64 0 0 0 .09-.68"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M282.88 120.46c.3 0 0 2 1.55 3.67s3.67 1.73 3.65 2c0 .13-.53.32-1.43.22a5 5 0 0 1-3.06-1.56 4.31 4.31 0 0 1-1.17-3.06c.03-.84.32-1.3.46-1.27ZM285.77 97.11c-.25.47-2.06 0-4.25 0s-4 .31-4.25-.17c-.1-.24.27-.67 1-1a7.07 7.07 0 0 1 3.26-.67 7.2 7.2 0 0 1 3.21.83c.79.33 1.14.78 1.03 1.01ZM302.37 99.37c-.39.37-1.59-.24-3.12-.47s-2.85-.1-3.09-.58c-.1-.23.16-.62.78-.94a4.55 4.55 0 0 1 5 .84c.48.51.6.96.43 1.15Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M259.12 87.91c3.37-7.43 15.81-16.79 23.82-15.28l12 9.26a12.54 12.54 0 0 1-9.57 8.54c-2.36.42-5.13.29-6.72 2.09s-1.15 4.86-2.69 6.77c-2.12 2.66-7 1.95-8.69 4.89-.75 1.28-.63 2.94-1.4 4.21-1 1.69-5.82 3.43-7.62 2.61s-1.44-4-1.85-5.74a9 9 0 0 1 .42-6c1.26-3.65.7-7.8 2.3-11.35Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M263.59 113.23c.13-1-.7-3.49-1.66-3.78-2.56-.76-7.31-1.2-8.27 5.45-1.3 9.09 8.09 8.52 8.15 8.26s1.32-6.5 1.78-9.93Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M259.53 119.32s-.18.09-.46.17a1.64 1.64 0 0 1-1.19-.14c-.91-.49-1.5-2.13-1.31-3.78a5.29 5.29 0 0 1 .77-2.2 1.83 1.83 0 0 1 1.36-1 .82.82 0 0 1 .88.56c.08.28 0 .45 0 .47s.22-.12.2-.51a1 1 0 0 0-.28-.62 1.23 1.23 0 0 0-.84-.36 2.24 2.24 0 0 0-1.85 1.18 5.24 5.24 0 0 0-.91 2.45c-.21 1.84.48 3.69 1.74 4.25a1.68 1.68 0 0 0 1.48 0c.36-.25.43-.45.41-.47Z"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M292.56 78.87c.48 3.8 5.66 9.12 7.86 12.25 4.19 6 4.95 7.91 3.7 20.24 2.65-4 4.76-8 5.06-12.88a20 20 0 0 0-4-13.6 15.6 15.6 0 0 0-12.61-6"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M254.48 87.34a9.48 9.48 0 0 0 1.51.54c.49.16 1.1.34 1.82.5s1.52.39 2.44.52a43.13 43.13 0 0 0 6.47.7 49.17 49.17 0 0 0 7.95-.43 48.36 48.36 0 0 0 7.76-1.81 44.66 44.66 0 0 0 6-2.47c.85-.39 1.56-.83 2.2-1.19s1.18-.7 1.6-1a10.08 10.08 0 0 0 1.31-.94 9 9 0 0 0-1.42.76c-.44.26-1 .58-1.64.9s-1.37.75-2.21 1.11a49.36 49.36 0 0 1-6 2.34 52.85 52.85 0 0 1-7.69 1.75 53.22 53.22 0 0 1-7.86.47 47.11 47.11 0 0 1-6.42-.58c-.91-.11-1.72-.3-2.43-.44s-1.33-.28-1.83-.41a8.25 8.25 0 0 0-1.56-.32ZM252.89 93.79a3.74 3.74 0 0 0 1 .36 27.49 27.49 0 0 0 2.91.67 36.71 36.71 0 0 0 19.39-1.88 24.88 24.88 0 0 0 2.81-1.21 3.77 3.77 0 0 0 .94-.55c0-.08-1.44.59-3.8 1.4a41.36 41.36 0 0 1-19.2 1.85c-2.52-.34-4.03-.73-4.05-.64Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="m155.92 343.89-19.68-8-8.49 15.01 4.13 8.92 18.26 6.26 5.78-22.19z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="m133 362.05-1.5-.59s-20.27 21.82-25.21 20.16l20.18-51.36 16.53 7.53c-6.47 6.21-10 14.05-10 24.26Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="M135.6 340.8a2.25 2.25 0 0 0-1.79-2.4 2.14 2.14 0 0 0-2.36 1.78 2.36 2.36 0 0 0 1.9 2.53 2.23 2.23 0 0 0 2.26-2.12"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="m126.48 330.26 4 1.81-20.81 48.57s-1.87 1.89-3.35 1Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><path
|
|
||||||
d="M131.3 361.58c-.25-.11.13-1.41-.17-3s-1.09-2.64-.9-2.83 1.46.76 1.8 2.65-.53 3.33-.73 3.18ZM127 366.08c-.26 0-.26-1.3-1-2.57s-1.72-2-1.61-2.22 1.57.16 2.42 1.77.42 3.11.19 3.02ZM119.45 366.56c0-.25 1.4-.09 2.5 1.1s1.17 2.58.93 2.6-.69-1-1.6-2-1.91-1.44-1.83-1.7ZM145.78 339.09s15.36 4.19 25.9 6.15 22.64 4.78 31 7c8.81 2.29 12.72 3.59 12.72 3.59s2 2.61 3.5-7.74 6.1-47.73 6.1-47.73l5.06-16.08 30.38-5.32 16.12 21.27s-14.57 47.3-19.53 57.09-12 38.32-29.14 33.87c-10.14-2.63-89.33-27.5-89.33-27.5Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m223.39 313.78-.13 1.06-.33 2.63 23.27-11.21s.15 10.69 22 19l2.78-4.84v-14.16l-16.89-13.13h-11.68l-18.61 14"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M270.41 320.55a72.49 72.49 0 0 1-2.56 8.15 71.37 71.37 0 0 1-3.05 8 70.07 70.07 0 0 1 2.56-8.15 67 67 0 0 1 3.05-8ZM223.88 365.86a37.35 37.35 0 0 0-3.49-5.44 37.33 37.33 0 0 0-4.76-4.36 5.42 5.42 0 0 1 1.7.91 17 17 0 0 1 3.46 3.12 17.56 17.56 0 0 1 2.49 3.93 5.55 5.55 0 0 1 .6 1.84Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M226.55 272.74s-5.06 13.2-4.88 20.65-2.73 22.38-2.73 22.38 27.33-14.67 29.37-16.45c0 0-2 14.72 21.22 21.58l2 .77 7.13-21.5a68.35 68.35 0 0 0 6.19-12c1.88-5.42 4.5-15.41 4.5-15.41L237.47 258Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M289.38 287.64s12.76 17.61 12.94 20.49l-32.44 6.43-3-12.36-1.31-12.87Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M239.86 171.23c.34.94 7 23.93 7 23.93l4 33.37s-6.73 19.75-12.4 26.21c-17.58 20.09-15.68 25.57-15.68 25.57s29.74-8 44.39-5.8 10.66 27.39 32 21.41l-.17-20.54s2.68-18.95 3.35-25.57-.24-30.41-.24-30.41 7.33-23.3 7.33-30.85 1.75-7.88-4.29-18.27-15-24.24-15-24.24l-33.63-2.84-18.64 19.21Z"
|
|
||||||
style="fill:#e0e0e0"
|
|
||||||
/><path
|
|
||||||
d="M281.7 292.51c.13 0-1.75 6.24-4.21 13.83s-4.56 13.72-4.7 13.67 1.75-6.23 4.21-13.83 4.56-13.72 4.7-13.67Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M238.71 172.17c-4.43 1.19-8.35 2.56-13.19 0s-8.89-7.36-9-12.84c-.06-4.48-.07-12.74 3.53-15.41s20.16-5.39 29.43-5.36c35.69.11 40.29 6 46 8.93a5.33 5.33 0 0 1-2.15 5.57"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M235.67 165.5s1 19.66 2.47 27.09 7.38 29.67 7.38 29.67-3.28 1.23-2.79 5.68c0 0-3.55 3.09-3.95 9.89s1.57 9.76 1.57 9.76l-3.84 7.72 64.36 12.17 1.08-7.27s4.66 3 5.51-11-.82-24.45-.08-37.3 5.53-17.86 4.3-29.47C311 175.62 289.35 147 289.35 147s-31.46-5.35-34.62-1.91-19.06 20.41-19.06 20.41Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M304 226.09c-15.48-8.7-26.72-23.17-37.53-37.27l-1.14-2.82c1.11 5.89 1.42 14.1 2.54 20a72.63 72.63 0 0 0 3.66 14.11 24.45 24.45 0 0 0 8.74 11.42c7 4.61 16.5 3.85 23.85-.1 1.08-.58 2.25-1.45 2.23-2.67s-1.28-2.05-2.35-2.67Z"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M234.28 178.25a10.43 10.43 0 0 1 .6 1.69c.35 1.09.82 2.69 1.37 4.67 1.11 4 2.45 9.48 3.87 15.59s2.72 11.64 3.75 15.61c.51 1.93.93 3.51 1.24 4.71a11.9 11.9 0 0 1 .41 1.74 11.81 11.81 0 0 1-.6-1.69c-.37-1.09-.84-2.68-1.4-4.66-1.13-4-2.5-9.48-3.91-15.59s-2.7-11.64-3.71-15.62c-.5-1.92-.91-3.51-1.22-4.71a12.51 12.51 0 0 1-.4-1.74ZM265.5 233.75a26.55 26.55 0 0 1-3.27-1.23c-2-.79-4.76-1.89-7.89-2.86a49.52 49.52 0 0 0-8.18-1.79c-2.13-.26-3.46-.28-3.46-.37a2.82 2.82 0 0 1 .94-.08 20.82 20.82 0 0 1 2.56.09 39.56 39.56 0 0 1 8.29 1.66 69.24 69.24 0 0 1 7.89 3c1 .45 1.77.82 2.31 1.1a3.61 3.61 0 0 1 .81.48ZM305.27 259.42a4.28 4.28 0 0 1-.58.35 10.73 10.73 0 0 1-1.82.75 18.56 18.56 0 0 1-7.17.46 230.88 230.88 0 0 1-23.22-4.74c-9-2.19-17.11-4.25-23-5.61l-7-1.56-1.91-.42a3.36 3.36 0 0 1-.66-.18 3.14 3.14 0 0 1 .68.08l1.93.32c1.67.29 4.07.77 7 1.4 5.93 1.27 14.07 3.28 23.05 5.47s17.16 4 23.14 4.87a19.12 19.12 0 0 0 7.08-.29 23.9 23.9 0 0 0 2.48-.9Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M227.92 172.83c2.38 4 7.5 5.94 12.14 5.33s8.78-3.37 11.94-6.83 5.46-7.59 7.73-11.68l6.17-11.12c-7.32 3.05-9.81 11.52-15.35 17.2s-16.27 9.44-22.63 7.1"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M266.52 148.59s-.73.18-2 .74a14.62 14.62 0 0 0-4.52 3.43 41.85 41.85 0 0 0-4.84 7 47 47 0 0 1-2.83 4.21 21.16 21.16 0 0 1-3.91 3.82 30.22 30.22 0 0 1-9.38 4.72 25 25 0 0 1-8.49 1.18 12.17 12.17 0 0 1-5.58-1.48 6.62 6.62 0 0 1-1.27-.93 2.54 2.54 0 0 1-.38-.4 18.82 18.82 0 0 0 1.75 1.16 12.65 12.65 0 0 0 5.5 1.28 25.19 25.19 0 0 0 8.33-1.27 30.59 30.59 0 0 0 9.21-4.67 21.42 21.42 0 0 0 3.82-3.72 47.6 47.6 0 0 0 2.82-4.15 40.4 40.4 0 0 1 5-7 14.13 14.13 0 0 1 4.7-3.36 9.15 9.15 0 0 1 1.5-.47 2 2 0 0 1 .57-.09ZM260.76 225.38c-.07.16-3.33-1.38-7.65-2.23a77 77 0 0 0-7.93-.88 8.27 8.27 0 0 1 2.35-.19 29.41 29.41 0 0 1 5.68.56 28.85 28.85 0 0 1 5.45 1.66 8.68 8.68 0 0 1 2.1 1.08ZM243 227.38c.07.07-.77 1-1.77 2.64a19.77 19.77 0 0 0-1.48 3.08 21.77 21.77 0 0 0-1 4.05 21.32 21.32 0 0 0-.16 4.17 20.22 20.22 0 0 0 .55 3.38c.48 1.89 1 3 .94 3a3.32 3.32 0 0 1-.44-.74 7.08 7.08 0 0 1-.41-.93 12.82 12.82 0 0 1-.45-1.26 17.38 17.38 0 0 1-.66-3.44 19.55 19.55 0 0 1 .11-4.29 20.16 20.16 0 0 1 1.1-4.14 17.53 17.53 0 0 1 1.62-3.11 12.25 12.25 0 0 1 .78-1.08 8.48 8.48 0 0 1 .66-.77c.38-.37.61-.58.61-.56Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M234.59 178.76a19.68 19.68 0 0 0 3.4 13.92c-.99-4.68-2.36-9.22-3.4-13.92Z"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M340.48 208.44s5.27-6.17 6.6-6.62 7.22-1.77 7.88-1.22a3.09 3.09 0 0 0 1.33.67s5.11.33 5.66 2.55.34 3.33.78 3.66 1.67 1.89 1.33 3.11a11.48 11.48 0 0 0-.44 3.55 10.77 10.77 0 0 1 .5 2.78 11.39 11.39 0 0 1-.72 2.77 3.08 3.08 0 0 1-.45 3.11c-1.22 1.22-5.73 1.55-7.32 1.56-2 0-6.07.8-7.41.24a16.44 16.44 0 0 0-2.47-.8L335 225.08l-1.66-17.3Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M356.93 201.48a23.19 23.19 0 0 1-3.51.42 22.36 22.36 0 0 1-3.51.38 8.47 8.47 0 0 1 3.45-.9 8.38 8.38 0 0 1 3.57.1Z"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M264 182.13c4 10.83 7.79 25.38 10.6 33.79 3.81 11.43 15.63 15.68 21.67 16.14 7.73.58 45.4-6.55 45.4-6.55l-1.74-19-4.27.11a5.72 5.72 0 0 0-3-1.44c-7.93-1.87-29.3-.31-29.3-.31s-5.75-23.11-7-34.46c-1-9-1-23.68-15.07-24.53-9.15.43-15.06 3.81-17.29 13.61"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M264 159.53s0-.14.08-.4.16-.67.29-1.18a19.72 19.72 0 0 1 1.76-4.37 13.72 13.72 0 0 1 5.28-5.37 22.3 22.3 0 0 1 9.87-2.44l1.53.19a8.4 8.4 0 0 1 1.56.29l1.58.44 1.53.71a12.92 12.92 0 0 1 5 4.92 23.71 23.71 0 0 1 2.63 7.23 74 74 0 0 1 1.13 8.18 161.08 161.08 0 0 0 2.91 17.77c1.3 6.2 2.78 12.67 4.42 19.35l-.26-.18c5.12-.35 10.45-.59 15.92-.62 2.74 0 5.52 0 8.33.23a38.23 38.23 0 0 1 4.22.51 13.37 13.37 0 0 1 2.1.51 5.35 5.35 0 0 1 1.9 1.17l-.19-.07 4.27-.11h.24v.51c.59 6.41 1.17 12.7 1.72 18.7v.23h-.23c-7.65 1.43-15.09 2.73-22.26 3.88q-5.39.87-10.55 1.57c-3.45.47-6.82.88-10.14 1.06a22.36 22.36 0 0 1-9.5-1.65 28.77 28.77 0 0 1-7.87-4.54 23 23 0 0 1-5.39-6.5 36.76 36.76 0 0 1-2.74-7.26c-2.84-9.43-5-17-6.64-22.2-.82-2.6-1.49-4.59-1.95-5.94-.22-.66-.4-1.17-.52-1.53a5.06 5.06 0 0 1-.16-.52s.07.16.2.5.33.86.57 1.52c.49 1.34 1.19 3.32 2 5.91 1.72 5.16 3.91 12.75 6.79 22.16a36.86 36.86 0 0 0 2.75 7.18 22.52 22.52 0 0 0 5.32 6.37 28.72 28.72 0 0 0 7.76 4.45 22.15 22.15 0 0 0 9.33 1.59c3.29-.18 6.66-.6 10.1-1.07s6.95-1 10.53-1.59c7.16-1.16 14.6-2.46 22.24-3.89l-.21.27c-.55-6-1.13-12.28-1.72-18.69v-.26l.26.23-4.26.11h-.11l-.08-.08a6.64 6.64 0 0 0-3.74-1.54 36.32 36.32 0 0 0-4.16-.5c-2.78-.2-5.55-.24-8.28-.24-5.46 0-10.78.26-15.89.6h-.21l-.05-.21a536.51 536.51 0 0 1-4.39-19.37 156.74 156.74 0 0 1-2.88-17.83 74.73 74.73 0 0 0-1.1-8.14 23.43 23.43 0 0 0-2.55-7.13 12.64 12.64 0 0 0-4.89-4.8l-1.48-.7-1.54-.44a7.37 7.37 0 0 0-1.53-.29l-1.51-.2a22.13 22.13 0 0 0-9.77 2.35 13.6 13.6 0 0 0-5.25 5.24 20.45 20.45 0 0 0-1.82 4.31l-.33 1.17Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M298.27 216a19.44 19.44 0 0 0 5-11.61 5.13 5.13 0 0 1 .08 1.92 14.38 14.38 0 0 1-1.12 4.51 14.19 14.19 0 0 1-2.5 3.92 4.86 4.86 0 0 1-1.46 1.26ZM337 226a88.26 88.26 0 0 1-1.07-9.59 91.09 91.09 0 0 1-.54-9.64 87.31 87.31 0 0 1 1.06 9.6A89.66 89.66 0 0 1 337 226Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<h3 class="text-2xl font-bold">{$_("done")}</h3>
|
|
||||||
<h4 class="text-xl font-semibold">
|
|
||||||
{cardCode}<br />{runnerinfo.firstname}
|
|
||||||
{runnerinfo.lastname} [#{runnerinfo.id}]
|
|
||||||
</h4>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
resetAll();
|
|
||||||
}}
|
|
||||||
bind:this={nextButton}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("next_runner")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else if state === "assigning"}
|
|
||||||
<p class="text-center font-semibold">
|
|
||||||
{$_("please_wait_a_moment_while_we_assign_the_card")}<br />{cardCode}
|
|
||||||
</p>
|
|
||||||
{:else if state === "error_runner"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
class="h-64 mx-auto"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 500 500"
|
|
||||||
><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#fff;opacity:.9"
|
|
||||||
/><path
|
|
||||||
d="M360.6 263.05h-.36c-26.64-2.18-45-25-45.74-25.92a4.47 4.47 0 0 1 7-5.55c.21.27 15.9 19.61 37.63 22.37 7-7 13-25.48 12.33-31.07v-.16c-.14-1.8-.48-8 1.29-11.65a4.47 4.47 0 0 1 8 3.88c-.44.92-.65 4.23-.44 7 1 9.2-7 32.42-17 40.19a4.47 4.47 0 0 1-2.71.91ZM148.82 238.82a65.8 65.8 0 0 1-48.56-22.28 4.46 4.46 0 0 1-.26-5.64c7.22-9.71 20-32.64 22-40.11a10.91 10.91 0 0 0-4.14-4.33 4.45 4.45 0 0 1-2.55-3.61l-.72-7.32a4.47 4.47 0 0 1 8.89-.88l.5 5.09a22.34 22.34 0 0 1 6.81 8.65 4.48 4.48 0 0 1 .32 2.26c-.92 7.93-13.79 30.9-21.71 42.51 18.49 18.43 40.59 16.75 41.56 16.66a4.47 4.47 0 0 1 .82 8.9c-.26.02-1.29.1-2.96.1ZM292.87 416.09h-12a4.47 4.47 0 0 1-4.31-5.66c3.13-11.24 4.67-20.39 5.82-34.71-4.24-20-8.23-38.21-8.27-38.39a4.47 4.47 0 0 1 8.73-1.91c0 .18 4.12 18.86 8.41 39.08a4.23 4.23 0 0 1 .08 1.28c-1 12.86-2.31 21.75-4.67 31.38h6.18a4.47 4.47 0 0 1 0 8.93ZM200.32 416.09h-6.76a4.45 4.45 0 0 1-4.42-5.08c1.15-8.2 7-23.13 13.3-38.14 2.23-19.8 4.05-36.8 4.07-37a4.47 4.47 0 1 1 8.88 1c0 .17-1.88 17.56-4.15 37.65a4.31 4.31 0 0 1-.32 1.22c-4.43 10.63-9.49 23.15-11.8 31.44h1.2a4.47 4.47 0 1 1 0 8.93Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m204.21 111-52.06 52.07c-2.62 57.71-2.41 118.33 0 181.18h172.16c-3.41-81.1-3.73-159.17 0-233.25Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M324.31 345.13H152.15a.9.9 0 0 1-.9-.86c-2.49-65.27-2.49-126.27 0-181.27a.9.9 0 0 1 .27-.59l52.06-52.07a.89.89 0 0 1 .63-.26h120.1a.9.9 0 0 1 .65.28.87.87 0 0 1 .24.66c-3.59 71.34-3.59 147.61 0 233.17a.89.89 0 0 1-.25.65.86.86 0 0 1-.64.29ZM153 343.34h170.38c-3.54-84.86-3.55-160.59 0-231.47h-118.8L153 163.43c-2.45 54.64-2.45 115.16 0 179.91Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M214.28 219.19c-.2-4.36-2.67-7.8-5.53-7.7s-5 3.71-4.82 8.07 2.67 7.8 5.53 7.69 5.02-3.71 4.82-8.06ZM274.65 217.82c-.2-4.35-2.67-7.79-5.53-7.69s-5 3.71-4.82 8.07 2.68 7.8 5.53 7.69 5.02-3.71 4.82-8.07ZM229.35 237a36.55 36.55 0 0 1 28.63 1.3 1.27 1.27 0 0 1 .49 1.74 1.3 1.3 0 0 1-1.75.49c-.15-.08-14.4-7.76-31.41 1a1.31 1.31 0 0 1-1.74-.54 1.27 1.27 0 0 1 .55-1.72 41.73 41.73 0 0 1 5.23-2.27ZM205.64 178.34a2.64 2.64 0 0 1 1.26.36 2.58 2.58 0 0 1 .92 3.51A25.29 25.29 0 0 1 188.27 195a2.59 2.59 0 0 1-2.69-2.45 2.55 2.55 0 0 1 2.44-2.66c.39 0 9.62-.58 15.36-10.27a2.52 2.52 0 0 1 2.26-1.28ZM266.05 176.87a2.57 2.57 0 0 1 2.33.72c8 8 17.14 6.39 17.52 6.32a2.6 2.6 0 0 1 3 2 2.54 2.54 0 0 1-2 3c-.5.09-12.14 2.31-22.21-7.75a2.54 2.54 0 0 1 1.31-4.3Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="m321.72 204.86-7.31.68a5.22 5.22 0 0 1-5.58-4.06L298.7 156.1a5.22 5.22 0 0 1 3.77-6.18l19.59-5.14ZM209 167.69c-5.09-13.89-10.18-36.12-4.81-56.71l-52.06 52.07c14.73 4.95 38.19 7.06 56.87 4.64Z"
|
|
||||||
style="opacity:.2"
|
|
||||||
/><path
|
|
||||||
d="M204.21 163.05c-5.71-16.86-3.38-39.78 0-52.07l-52.06 52.07c15.76 2.87 33.37 2.41 52.06 0Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M176 165.92a133.14 133.14 0 0 1-24-2 .88.88 0 0 1-.47-1.5l52.06-52.07a.89.89 0 0 1 1.49.87c-3.14 11.44-5.75 34.6 0 51.54a.93.93 0 0 1-.09.76.87.87 0 0 1-.64.41 221.85 221.85 0 0 1-28.35 1.99Zm-22-3.46c13.84 2.29 29.91 2.24 49-.16-4.71-14.94-3.64-34.71-.48-48.4Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<p class="text-lg font-semibold">{$_("runner_not_found")}</p>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
resetAll();
|
|
||||||
}}
|
|
||||||
bind:this={tryAgainButton}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("try_again")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else if state === "error_card"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
class="h-64 mx-auto"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 500 500"
|
|
||||||
><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#fff;opacity:.9"
|
|
||||||
/><path
|
|
||||||
d="M360.6 263.05h-.36c-26.64-2.18-45-25-45.74-25.92a4.47 4.47 0 0 1 7-5.55c.21.27 15.9 19.61 37.63 22.37 7-7 13-25.48 12.33-31.07v-.16c-.14-1.8-.48-8 1.29-11.65a4.47 4.47 0 0 1 8 3.88c-.44.92-.65 4.23-.44 7 1 9.2-7 32.42-17 40.19a4.47 4.47 0 0 1-2.71.91ZM148.82 238.82a65.8 65.8 0 0 1-48.56-22.28 4.46 4.46 0 0 1-.26-5.64c7.22-9.71 20-32.64 22-40.11a10.91 10.91 0 0 0-4.14-4.33 4.45 4.45 0 0 1-2.55-3.61l-.72-7.32a4.47 4.47 0 0 1 8.89-.88l.5 5.09a22.34 22.34 0 0 1 6.81 8.65 4.48 4.48 0 0 1 .32 2.26c-.92 7.93-13.79 30.9-21.71 42.51 18.49 18.43 40.59 16.75 41.56 16.66a4.47 4.47 0 0 1 .82 8.9c-.26.02-1.29.1-2.96.1ZM292.87 416.09h-12a4.47 4.47 0 0 1-4.31-5.66c3.13-11.24 4.67-20.39 5.82-34.71-4.24-20-8.23-38.21-8.27-38.39a4.47 4.47 0 0 1 8.73-1.91c0 .18 4.12 18.86 8.41 39.08a4.23 4.23 0 0 1 .08 1.28c-1 12.86-2.31 21.75-4.67 31.38h6.18a4.47 4.47 0 0 1 0 8.93ZM200.32 416.09h-6.76a4.45 4.45 0 0 1-4.42-5.08c1.15-8.2 7-23.13 13.3-38.14 2.23-19.8 4.05-36.8 4.07-37a4.47 4.47 0 1 1 8.88 1c0 .17-1.88 17.56-4.15 37.65a4.31 4.31 0 0 1-.32 1.22c-4.43 10.63-9.49 23.15-11.8 31.44h1.2a4.47 4.47 0 1 1 0 8.93Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m204.21 111-52.06 52.07c-2.62 57.71-2.41 118.33 0 181.18h172.16c-3.41-81.1-3.73-159.17 0-233.25Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M324.31 345.13H152.15a.9.9 0 0 1-.9-.86c-2.49-65.27-2.49-126.27 0-181.27a.9.9 0 0 1 .27-.59l52.06-52.07a.89.89 0 0 1 .63-.26h120.1a.9.9 0 0 1 .65.28.87.87 0 0 1 .24.66c-3.59 71.34-3.59 147.61 0 233.17a.89.89 0 0 1-.25.65.86.86 0 0 1-.64.29ZM153 343.34h170.38c-3.54-84.86-3.55-160.59 0-231.47h-118.8L153 163.43c-2.45 54.64-2.45 115.16 0 179.91Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M214.28 219.19c-.2-4.36-2.67-7.8-5.53-7.7s-5 3.71-4.82 8.07 2.67 7.8 5.53 7.69 5.02-3.71 4.82-8.06ZM274.65 217.82c-.2-4.35-2.67-7.79-5.53-7.69s-5 3.71-4.82 8.07 2.68 7.8 5.53 7.69 5.02-3.71 4.82-8.07ZM229.35 237a36.55 36.55 0 0 1 28.63 1.3 1.27 1.27 0 0 1 .49 1.74 1.3 1.3 0 0 1-1.75.49c-.15-.08-14.4-7.76-31.41 1a1.31 1.31 0 0 1-1.74-.54 1.27 1.27 0 0 1 .55-1.72 41.73 41.73 0 0 1 5.23-2.27ZM205.64 178.34a2.64 2.64 0 0 1 1.26.36 2.58 2.58 0 0 1 .92 3.51A25.29 25.29 0 0 1 188.27 195a2.59 2.59 0 0 1-2.69-2.45 2.55 2.55 0 0 1 2.44-2.66c.39 0 9.62-.58 15.36-10.27a2.52 2.52 0 0 1 2.26-1.28ZM266.05 176.87a2.57 2.57 0 0 1 2.33.72c8 8 17.14 6.39 17.52 6.32a2.6 2.6 0 0 1 3 2 2.54 2.54 0 0 1-2 3c-.5.09-12.14 2.31-22.21-7.75a2.54 2.54 0 0 1 1.31-4.3Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="m321.72 204.86-7.31.68a5.22 5.22 0 0 1-5.58-4.06L298.7 156.1a5.22 5.22 0 0 1 3.77-6.18l19.59-5.14ZM209 167.69c-5.09-13.89-10.18-36.12-4.81-56.71l-52.06 52.07c14.73 4.95 38.19 7.06 56.87 4.64Z"
|
|
||||||
style="opacity:.2"
|
|
||||||
/><path
|
|
||||||
d="M204.21 163.05c-5.71-16.86-3.38-39.78 0-52.07l-52.06 52.07c15.76 2.87 33.37 2.41 52.06 0Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M176 165.92a133.14 133.14 0 0 1-24-2 .88.88 0 0 1-.47-1.5l52.06-52.07a.89.89 0 0 1 1.49.87c-3.14 11.44-5.75 34.6 0 51.54a.93.93 0 0 1-.09.76.87.87 0 0 1-.64.41 221.85 221.85 0 0 1-28.35 1.99Zm-22-3.46c13.84 2.29 29.91 2.24 49-.16-4.71-14.94-3.64-34.71-.48-48.4Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<p class="text-lg font-semibold">{$_("card_not_found")}</p>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
state = "scan_card";
|
|
||||||
scannerActive = true;
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("try_again")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<!-- -->
|
|
||||||
{#if runnerinfo.id === 0}
|
|
||||||
<h3 class="text-2xl font-bold">{$_("scan_runner")}</h3>
|
|
||||||
<h4 class="text-xl font-semibold">
|
|
||||||
{$_("selfservice_qr_registration_barcode")}
|
|
||||||
</h4>
|
|
||||||
{:else}
|
|
||||||
<h3 class="text-2xl font-bold">
|
|
||||||
{runnerinfo.firstname}
|
|
||||||
{runnerinfo.lastname}
|
|
||||||
</h3>
|
|
||||||
<p>
|
|
||||||
ID: #{runnerinfo.id}<br />created_via: {runnerinfo.created_via}<br
|
|
||||||
/>{runnerinfo.group.name}
|
|
||||||
</p>
|
|
||||||
{/if}
|
|
||||||
<!-- -->
|
|
||||||
{/if}
|
|
||||||
{#if state === "scan_card"}
|
|
||||||
<h3 class="text-2xl font-bold">{$_("scan_card")}</h3>
|
|
||||||
<h4 class="text-xl font-semibold">{$_("code_128_barcode")}</h4>
|
|
||||||
{/if}
|
|
||||||
{#if state.includes("scan_")}
|
|
||||||
{#if scannerActive}
|
|
||||||
<QrCodeScanner
|
|
||||||
:paused={!scannerActive}
|
|
||||||
on:detect={(e) => {
|
|
||||||
if (scannerActive) {
|
|
||||||
if (`${e.detail.decodedText}`.length === 13) {
|
|
||||||
e.detail.decodedText = e.detail.decodedText.substring(
|
|
||||||
0,
|
|
||||||
e.detail.decodedText.length - 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
scannerActive = false;
|
|
||||||
console.log({ type: "DETECT", code: e.detail.decodedText });
|
|
||||||
handleInput(e.detail.decodedText);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
width={320}
|
|
||||||
height={320}
|
|
||||||
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden"
|
|
||||||
/>
|
|
||||||
<form
|
|
||||||
on:submit={(e) => {
|
|
||||||
handleInput(barcodeInput.value);
|
|
||||||
barcodeInput.value = "";
|
|
||||||
e.preventDefault();
|
|
||||||
}}
|
|
||||||
class="mt-2"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder={$_("barcode_scanner")}
|
|
||||||
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden mt-2"
|
|
||||||
bind:this={barcodeInput}
|
|
||||||
/>
|
|
||||||
</form>
|
|
||||||
{/if}
|
|
||||||
{#if runnerinfo.id !== 0 && state !== "scan_card"}
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
state = "scan_card";
|
|
||||||
scannerActive = true;
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 w-full mt-2"
|
|
||||||
>
|
|
||||||
{$_("scan_card")}
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
{#if state === "scan_card" || runnerinfo.id !== 0}
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
state = "scan_runner";
|
|
||||||
scannerActive = true;
|
|
||||||
runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
cardCode = "";
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-red-100 text-red-800 hover:bg-red-200 focus:outline-hidden focus:bg-red-200 disabled:opacity-50 disabled:pointer-events-none dark:text-red-500 dark:bg-red-800/30 dark:hover:bg-red-800/20 dark:focus:bg-red-800/20 w-full mt-2"
|
|
||||||
>
|
|
||||||
{$_("cancel")}
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
<!-- -->
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
@ -1,542 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { _ } from "svelte-i18n";
|
|
||||||
import { RunnerCardService, RunnerService } from "@odit/lfk-client-js";
|
|
||||||
import QrCodeScanner from "./QrCodeScanner.svelte";
|
|
||||||
import Select from "svelte-select";
|
|
||||||
|
|
||||||
let state = "select_runner";
|
|
||||||
let runners = [];
|
|
||||||
let runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
let cardCode = "";
|
|
||||||
let scannerActive = true;
|
|
||||||
let barcodeInput;
|
|
||||||
let nextButton;
|
|
||||||
let tryAgainButton;
|
|
||||||
|
|
||||||
RunnerService.runnerControllerGetAll()
|
|
||||||
.then((val) => {
|
|
||||||
runners = val.map((r) => {
|
|
||||||
return { label: getRunnerLabel(r), value: r };
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.log("error fetching runners:", err);
|
|
||||||
});
|
|
||||||
|
|
||||||
const getRunnerLabel = (option) =>
|
|
||||||
option.firstname + " " + (option.middlename || "") + " " + option.lastname;
|
|
||||||
|
|
||||||
const filterRunners = (label, filterText, option) => {
|
|
||||||
if (filterText.startsWith("#")) {
|
|
||||||
return option.value.id == parseInt(filterText.replace("#", ""));
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
label.toLowerCase().includes(filterText.toLowerCase()) ||
|
|
||||||
option.value.toString().startsWith(filterText.toLowerCase())
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
function resetAll() {
|
|
||||||
state = "select_runner";
|
|
||||||
runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
cardCode = "";
|
|
||||||
scannerActive = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleBarcode(input) {
|
|
||||||
if (`${input}`.length > 10) {
|
|
||||||
cardCode = input;
|
|
||||||
new Audio("/beep.mp3").play();
|
|
||||||
state = "assigning";
|
|
||||||
RunnerCardService.runnerCardControllerGetAll()
|
|
||||||
.then((cards) => {
|
|
||||||
// console.log(cards);
|
|
||||||
const card = cards.find((c) => c.code === cardCode);
|
|
||||||
if (card) {
|
|
||||||
console.log("card found", card);
|
|
||||||
RunnerCardService.runnerCardControllerPut(card.id, {
|
|
||||||
enabled: true,
|
|
||||||
id: card.id,
|
|
||||||
runner: runnerinfo.id,
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
state = "done";
|
|
||||||
setTimeout(() => {
|
|
||||||
nextButton && nextButton.focus();
|
|
||||||
}, 100);
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
state = "error_card";
|
|
||||||
scannerActive = false;
|
|
||||||
setTimeout(() => {
|
|
||||||
tryAgainButton && tryAgainButton.focus();
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
console.log("card not found");
|
|
||||||
// scannerActive = true;
|
|
||||||
state = "error_card";
|
|
||||||
scannerActive = false;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
scannerActive = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div class="p-4">
|
|
||||||
<h3 class="text-3xl font-bold">{$_("fast_card_replacement")}</h3>
|
|
||||||
{#if state === "done"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
class="h-64 mx-auto"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 500 500"
|
|
||||||
><path
|
|
||||||
d="m339.91 38.77-2 1.14c-16.77 9.58-27.19 27.41-26.49 46.53a50.12 50.12 0 0 0 .81 7.33 54.34 54.34 0 0 0 32.62 39.6c9.79 3.94 21.14 5.27 28.8 12.46 10 9.36 9.88 24.8 9.1 38.36s-.83 29 9.18 38.32c6.27 5.84 15.36 7.88 24 7.65 22.8-.61 43.57-15.93 54.22-35.83s12.18-43.63 8.31-65.82c-5.46-31.09-21.78-60.95-47.75-79.33s-61.88-23.8-90.8-10.41ZM152.06 393l2.36-.64c19.89-5.4 35.44-21 39.85-41a55.18 55.18 0 0 0 1.13-7.79 58 58 0 0 0-23.09-49.67c-9.05-6.7-20.43-11.12-26.42-20.6-7.79-12.35-3.56-28.28.89-42.08s8.63-29.75.79-42.07c-4.91-7.71-13.75-12.25-22.71-14.32-23.71-5.49-49.29 4.77-65.63 22.48S34.94 239.14 33 263.11c-2.74 33.57 6.14 68.81 28.05 94.77s57.54 41.19 91.01 35.12Z"
|
|
||||||
style="fill:#f5f5f5"
|
|
||||||
/><circle
|
|
||||||
cx="409.16"
|
|
||||||
cy="320.55"
|
|
||||||
r="36.72"
|
|
||||||
style="fill:#f5f5f5"
|
|
||||||
transform="rotate(-45 409.165 320.548)"
|
|
||||||
/><path
|
|
||||||
d="M470.34 473.11c0 .15-98.66.26-220.33.26s-220.35-.11-220.35-.26 98.64-.26 220.35-.26 220.33.15 220.33.26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M453.56 473.11a9.53 9.53 0 0 1-1-2c-.54-1.27-1.24-3-2-5s-1.4-3.53-2-5a14.87 14.87 0 0 1-.8-2.09 7.37 7.37 0 0 1 1.14 1.93c.61 1.25 1.36 3 2.13 5s1.42 3.75 1.87 5a10.55 10.55 0 0 1 .66 2.16ZM458.16 473.31c-.15 0-.66-3.33-1.59-7.41s-1.9-7.32-1.76-7.37a8.61 8.61 0 0 1 .84 2.07c.44 1.31 1 3.14 1.43 5.19s.77 3.93.94 5.29a8.54 8.54 0 0 1 .14 2.23ZM466.32 459.42c.14.08-1.36 3.08-2.88 6.91s-2.51 7-2.66 7a9.06 9.06 0 0 1 .46-2.15 53.35 53.35 0 0 1 3.93-9.86 8.66 8.66 0 0 1 1.15-1.9ZM225.88 473.11a74 74 0 0 1-6.08-10.68 71.59 71.59 0 0 1 6.08 10.68ZM230.2 473a79 79 0 0 1-2.66-12.67A82 82 0 0 1 230.2 473ZM239.31 461.69a39.45 39.45 0 0 1-3.08 5.76 41.06 41.06 0 0 1-3.53 5.49 39.66 39.66 0 0 1 3.08-5.75 42.46 42.46 0 0 1 3.53-5.5ZM55.68 473.11a29 29 0 0 1-2.94-4.68 29 29 0 0 1-2.49-4.93 29.84 29.84 0 0 1 2.94 4.68 29.92 29.92 0 0 1 2.49 4.93ZM58.09 457.6a60.92 60.92 0 0 1 1.17 7.73 56.51 56.51 0 0 1 .64 7.78 118.57 118.57 0 0 1-1.81-15.51ZM67.49 462.53a29.15 29.15 0 0 1-1.38 5.37 29.37 29.37 0 0 1-1.88 5.21 29.37 29.37 0 0 1 1.38-5.36 31.72 31.72 0 0 1 1.88-5.22Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M141.72 440a6.16 6.16 0 0 1 3.2 3.62 11 11 0 0 1 .43 4.91c-.37 3.19-2.18 6.4-4.12 8.95-2.69-2.34-3.3-6.43-3.49-8.52-.29-3.31 1.2-9.46 4-9M144.34 462.69a5.24 5.24 0 0 1 1.71-5 7 7 0 0 1 5.15-1.61 2.94 2.94 0 0 1 2.27 1 2.26 2.26 0 0 1 0 2.29 4.49 4.49 0 0 1-1.69 1.66c-2.32 1.46-4.84 2.44-7.47 1.65"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M140.9 472.46a4.38 4.38 0 0 1 .1-.65c.08-.46.19-1.06.32-1.77a18.5 18.5 0 0 1 1.83-5.65 11.28 11.28 0 0 1 4.06-4.31 7.33 7.33 0 0 1 1.65-.73 3 3 0 0 1 .48-.12h.17a11.36 11.36 0 0 0-2.22 1 11.75 11.75 0 0 0-3.94 4.28 20.19 20.19 0 0 0-1.87 5.57c-.16.74-.29 1.34-.39 1.76a2.49 2.49 0 0 1-.19.62Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M141 444.74a1.36 1.36 0 0 1 0 .29l.05.82c0 .71.08 1.74.12 3 .08 2.55.14 6.08.13 10s-.11 7.42-.22 10c-.05 1.28-.1 2.31-.15 3 0 .33 0 .6-.05.82a1.33 1.33 0 0 1 0 .28 1.29 1.29 0 0 1 0-.29v-.82c0-.74.05-1.77.08-3 .06-2.55.13-6.08.15-10s0-7.42-.07-10V445c-.04-.16-.04-.26-.04-.26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M139.7 464.63a12.32 12.32 0 0 0-6.72-9c-.9-.43-2.07-.71-2.81 0s-.57 1.86-.21 2.79a10.54 10.54 0 0 0 9.68 6.54"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M133.41 458.63a3 3 0 0 1 .57.25 5.17 5.17 0 0 1 .64.34 9.69 9.69 0 0 1 .82.52 9.89 9.89 0 0 1 .94.7 11.62 11.62 0 0 1 1 .91 13.72 13.72 0 0 1 1.89 2.43 14 14 0 0 1 1.25 2.82 10.26 10.26 0 0 1 .31 1.31 9.15 9.15 0 0 1 .16 1.16 8.75 8.75 0 0 1 0 1v.73a4 4 0 0 1-.07.62s0-.89-.12-2.3a10.83 10.83 0 0 0-.19-1.14 11.51 11.51 0 0 0-.33-1.28 13.92 13.92 0 0 0-1.24-2.77 14.19 14.19 0 0 0-1.85-2.4 10.11 10.11 0 0 0-1-.91 10.49 10.49 0 0 0-.9-.72c-1.1-.9-1.9-1.22-1.88-1.27Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M411.83 430.38a8.16 8.16 0 0 1 4.22 4.79 14.35 14.35 0 0 1 .57 6.48c-.48 4.21-2.87 8.46-5.45 11.82-3.54-3.09-4.35-8.49-4.6-11.25-.38-4.36 1.58-12.49 5.26-11.84M415.29 460.41a7 7 0 0 1 2.25-6.61 9.26 9.26 0 0 1 6.81-2.13 3.89 3.89 0 0 1 3 1.35 3 3 0 0 1 .05 3 6 6 0 0 1-2.23 2.2c-3.07 1.93-6.4 3.23-9.87 2.18"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M410.75 473.31a5.31 5.31 0 0 1 .13-.86l.42-2.34a24.66 24.66 0 0 1 2.42-7.46 14.9 14.9 0 0 1 5.35-5.69 10.1 10.1 0 0 1 2.19-1 6.47 6.47 0 0 1 .63-.16.61.61 0 0 1 .22 0 13.81 13.81 0 0 0-8.13 7 26.37 26.37 0 0 0-2.46 7.36c-.22 1-.39 1.77-.53 2.32a4.05 4.05 0 0 1-.24.83Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M410.88 436.7a1.65 1.65 0 0 1 .05.38q0 .42.06 1.08c.05.94.11 2.31.16 4 .11 3.38.19 8 .17 13.18s-.15 9.81-.28 13.18c-.07 1.69-.14 3.05-.2 4 0 .44 0 .8-.07 1.08a1.65 1.65 0 0 1 0 .38 2.21 2.21 0 0 1 0-.38v-1.08c0-1 .06-2.34.1-4 .08-3.37.17-8 .2-13.17s0-9.8-.09-13.17c0-1.66 0-3-.06-4v-1.09a2.79 2.79 0 0 1-.04-.39Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M409.16 463a16.22 16.22 0 0 0-8.88-11.92c-1.19-.57-2.73-.94-3.71-.06s-.75 2.46-.28 3.69a13.9 13.9 0 0 0 12.79 8.63"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M400.85 455.05a3.47 3.47 0 0 1 .75.32 9.58 9.58 0 0 1 .85.46 10.94 10.94 0 0 1 1.08.68 12.91 12.91 0 0 1 1.24.93 15.58 15.58 0 0 1 1.32 1.19 16.82 16.82 0 0 1 4.15 6.94 16.17 16.17 0 0 1 .42 1.74 13.28 13.28 0 0 1 .21 1.53c.06.47 0 .9.06 1.28a9.24 9.24 0 0 1 0 1 4.38 4.38 0 0 1-.09.81c-.07 0 .05-1.17-.16-3-.06-.46-.12-1-.24-1.51s-.27-1.1-.44-1.69a18.46 18.46 0 0 0-1.64-3.65 19.56 19.56 0 0 0-2.44-3.18 17.44 17.44 0 0 0-1.28-1.2c-.41-.37-.83-.67-1.2-.95-1.55-1.16-2.62-1.64-2.59-1.7ZM155.45 292c0 .14-14 .26-31.2.26S93 292.15 93 292s14-.26 31.21-.26 31.24.12 31.24.26ZM136.75 284.1c0 .14-14 .26-31.2.26s-31.21-.12-31.21-.26 14-.26 31.21-.26 31.2.16 31.2.26ZM294.43 412.9c0 .14-8.07.26-18 .26s-18-.12-18-.26 8.06-.26 18-.26 18 .12 18 .26ZM283.64 405c0 .15-8.07.26-18 .26s-18-.11-18-.26 8.06-.26 18-.26 18 .11 18 .26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><circle cx="88.02" cy="72.37" r="14.66" style="fill:#5e9cff" /><path
|
|
||||||
d="M88 87a14.68 14.68 0 0 1-13.52-9 14.78 14.78 0 0 1 0-11.43A14.84 14.84 0 0 1 77.64 62a14.69 14.69 0 0 1 20.76 0 14.84 14.84 0 0 1 3.14 4.66A14.67 14.67 0 0 1 88 87ZM85.93 105.14c-.08 0-.15-2.7-.15-6s.07-6 .15-6a56.83 56.83 0 0 1 .16 6 56.56 56.56 0 0 1-.16 6Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M85.93 105.16s-.08 0-.12-1.79v-8.55c0-1.78.09-1.78.12-1.78s.08 0 .13 1.78v8.55c-.06 1.79-.06 1.79-.13 1.79Zm0-12.08c-.07.22-.14 2.52-.14 6s.07 5.79.14 6c.07-.23.14-2.52.14-6s-.07-5.78-.14-6ZM77.48 89.64a63 63 0 0 1-3.07 5.64c-1.78 3.08-3.28 5.53-3.35 5.49a63.32 63.32 0 0 1 3.08-5.64c1.77-3.07 3.27-5.53 3.34-5.49Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M71.06 100.79s-.07 0 .84-1.7c.58-1.07 1.38-2.47 2.23-4s1.68-2.87 2.32-3.91c.89-1.46 1-1.58 1-1.58s.07 0-.84 1.7c-.58 1.07-1.37 2.48-2.23 4-1.52 2.64-3.22 5.46-3.35 5.5Zm6.41-11.12c-.18.17-1.46 2.25-3.32 5.47s-3 5.36-3.08 5.61c.18-.18 1.46-2.25 3.32-5.47s3.02-5.37 3.08-5.61ZM68.81 84.24a31 31 0 0 1-3.42 2.92 32.1 32.1 0 0 1-3.61 2.68 32.32 32.32 0 0 1 3.42-2.92 35.42 35.42 0 0 1 3.61-2.68Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M61.78 89.86s0-.06 1-.93c.65-.55 1.52-1.26 2.46-2a35.08 35.08 0 0 1 3.62-2.68 34.93 34.93 0 0 1-3.43 2.92c-.94.75-1.83 1.44-2.52 2a5 5 0 0 1-1.13.69Zm7-5.6a38.16 38.16 0 0 0-3.59 2.67 40.2 40.2 0 0 0-3.42 2.9 37.22 37.22 0 0 0 3.59-2.68 39.77 39.77 0 0 0 3.44-2.89Zm0 0ZM100.56 99.19a7.77 7.77 0 0 1-.39-1.49c-.21-.92-.51-2.19-.89-3.59s-.75-2.64-1-3.55a8.5 8.5 0 0 1-.41-1.48 7.14 7.14 0 0 1 .62 1.41c.33.89.75 2.14 1.12 3.54a36.32 36.32 0 0 1 .8 3.63 6.9 6.9 0 0 1 .15 1.53Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M100.55 99.2s-.11-.22-.4-1.5c-.19-.86-.5-2.16-.88-3.58s-.78-2.72-1-3.55c-.37-1.2-.45-1.46-.4-1.48s0 0 .22.37.27.64.42 1c.23.6.68 1.87 1.13 3.54s.69 3 .8 3.62a7.38 7.38 0 0 1 .17 1.54Zm-2.7-10.09a13.79 13.79 0 0 0 .41 1.43c.26.83.65 2.1 1 3.55s.69 2.73.88 3.59.32 1.37.37 1.46a10.18 10.18 0 0 0-.18-1.5c-.11-.64-.35-2-.8-3.62s-.9-2.94-1.13-3.54a9.12 9.12 0 0 0-.55-1.37ZM115.42 88.64a54.77 54.77 0 0 1-4.33-3.58 51.8 51.8 0 0 1-4.09-3.82 50.82 50.82 0 0 1 4.33 3.58 49.69 49.69 0 0 1 4.09 3.82Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M115.42 88.65a54.61 54.61 0 0 1-4.34-3.58c-1.13-1-2.18-1.93-3-2.65-1.22-1.13-1.19-1.17-1.17-1.19.15 0 2.34 1.85 4.33 3.59 1.13 1 2.19 1.93 3 2.65 1.22 1.13 1.18 1.17 1.16 1.19ZM107 81.26c.11.18 1.67 1.64 4.12 3.78s4.11 3.5 4.3 3.58c-.1-.19-1.67-1.64-4.12-3.79s-4.12-3.49-4.3-3.57ZM121.12 74.14a11.91 11.91 0 0 1-1.77-.26c-1.09-.18-2.59-.41-4.25-.6s-3.19-.3-4.29-.37a10.88 10.88 0 0 1-1.78-.16 8.74 8.74 0 0 1 1.79-.06 43.17 43.17 0 0 1 4.31.28c1.68.2 3.18.46 4.26.7a9.11 9.11 0 0 1 1.73.47Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M121.07 74.16c-.13 0-.49-.06-1.37-.2l-.35-.06c-1.49-.25-2.92-.45-4.26-.61s-2.77-.27-4.28-.37h-.35c-1.2-.08-1.44-.1-1.44-.15a9.68 9.68 0 0 1 1.79-.07 42.81 42.81 0 0 1 4.31.29 41.81 41.81 0 0 1 4.26.7 9.36 9.36 0 0 1 1.74.47s-.01 0-.05 0Zm-12-1.41a13.35 13.35 0 0 0 1.41.12h.35c1.51.1 3 .22 4.28.37s2.77.36 4.25.61l.35.06c.71.12 1.24.2 1.37.2a12.87 12.87 0 0 0-1.7-.44 41.81 41.81 0 0 0-4.26-.7 43 43 0 0 0-4.31-.29 13.47 13.47 0 0 0-1.75.07ZM121.14 59.88c0 .08-3.16.93-7.09 1.89s-7.14 1.66-7.16 1.58 3.15-.92 7.09-1.88 7.14-1.67 7.16-1.59Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M106.92 63.37s0-.08 2.07-.64c1.34-.35 3.13-.8 5-1.27s3.7-.88 5-1.18c2.11-.47 2.13-.42 2.13-.39s0 .07-2.07.63c-1.34.36-3.12.81-5 1.27s-3.69.88-5 1.18a16 16 0 0 1-2.13.4Zm14.18-3.48c-.29 0-3 .59-7.12 1.59s-6.8 1.73-7.06 1.86c.29 0 3-.58 7.13-1.59s6.8-1.75 7.05-1.86ZM104.57 43.27a63.61 63.61 0 0 1-3.39 5.41c-1.94 2.94-3.58 5.29-3.65 5.24s1.45-2.47 3.39-5.41 3.58-5.29 3.65-5.24Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M97.53 53.93c0-.14 1.72-2.9 3.39-5.42.94-1.42 1.84-2.75 2.53-3.74 1.06-1.52 1.12-1.52 1.14-1.5s.07 0-.93 1.64c-.65 1-1.52 2.37-2.46 3.79s-1.83 2.75-2.52 3.74c-.98 1.37-1.11 1.49-1.15 1.49Zm7-10.64c-.19.17-1.59 2.15-3.62 5.23s-3.32 5.14-3.39 5.37c.19-.16 1.58-2.14 3.62-5.22s3.34-5.14 3.42-5.38ZM88.13 39.8a12.88 12.88 0 0 1 0 2v4.85c0 1.85 0 3.61.06 4.85a14.66 14.66 0 0 1 0 2 11.36 11.36 0 0 1-.2-2c-.08-1.24-.14-3-.14-4.86s0-3.61.13-4.86a12.13 12.13 0 0 1 .15-1.98Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M88.15 53.54s-.05 0-.1-.55-.08-.88-.12-1.47c-.05-.84-.14-2.58-.14-4.86s.08-4 .13-4.86c0-.59.07-1.09.11-1.47s.08-.55.1-.55c.05 0 .07.19 0 2v4.85c0 1.91 0 3.54.05 4.77v2.08Zm0-13.71a18 18 0 0 0-.18 2c0 .83-.13 2.58-.13 4.85s.09 4 .14 4.86a16.64 16.64 0 0 0 .19 2v-2.08c0-1.23-.05-2.92-.05-4.77v-4.85c.03-.76.05-1.84.01-2.01ZM75.68 55.3c-.07.05-1.61-2.35-3.44-5.34s-3.24-5.47-3.19-5.51 1.62 2.35 3.45 5.35a63 63 0 0 1 3.18 5.5Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M75.68 55.32s-.16-.12-1.07-1.54c-.65-1-1.5-2.37-2.39-3.82-1.57-2.57-3.22-5.37-3.22-5.51s.07 0 1.09 1.54c.65 1 1.5 2.37 2.38 3.82s1.71 2.82 2.31 3.86c.94 1.63.9 1.65.87 1.67Zm-6.61-10.85c.06.24 1.26 2.34 3.18 5.48s3.24 5.16 3.42 5.33c-.07-.24-1.26-2.34-3.18-5.48s-3.24-5.16-3.42-5.33ZM68.25 61.62a7 7 0 0 1-1.56-.24c-1-.2-2.26-.52-3.69-.94s-2.7-.87-3.6-1.21a7.56 7.56 0 0 1-1.4-.64 8.28 8.28 0 0 1 1.52.43c.92.3 2.2.7 3.62 1.12s2.71.77 3.65 1a9.86 9.86 0 0 1 1.46.48Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M68.2 61.65h-.38c-.29 0-.68-.12-1.13-.22-.65-.13-2-.44-3.69-.94s-3-1-3.61-1.21l-1.07-.44c-.4-.17-.39-.2-.38-.22s.22 0 1.53.42c.74.24 2.12.68 3.62 1.13s2.6.74 3.65 1c1.34.36 1.53.43 1.52.48s0 0-.06 0ZM58 58.6a9.9 9.9 0 0 0 1.42.61c.62.24 1.9.71 3.61 1.21s3 .81 3.68.94a10.47 10.47 0 0 0 1.51.26 15.06 15.06 0 0 0-1.48-.44c-1-.28-2.29-.62-3.65-1s-2.89-.91-3.63-1.18c-.58-.15-1.36-.4-1.46-.4ZM65 72.89a38 38 0 0 1-4.68.6 37.31 37.31 0 0 1-4.71.3 35.07 35.07 0 0 1 4.68-.61 34.11 34.11 0 0 1 4.71-.29Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M55.88 73.83a1 1 0 0 1-.27 0 39.32 39.32 0 0 1 4.69-.6 39.75 39.75 0 0 1 4.72-.3 40.29 40.29 0 0 1-4.69.61c-1.81.14-3.74.29-4.45.29Zm-.24 0a43.5 43.5 0 0 0 4.68-.31 46 46 0 0 0 4.68-.63 43.61 43.61 0 0 0-4.69.31 39.33 39.33 0 0 0-4.67.59Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="m321.8 444.95 7.41 19.13 16.31-3.83 3.59-8.75-5.52-18.14-21.79 11.59z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="m349.94 449.25.58 1.45s29 0 31.09 4.61l-49.89 19.33-5.66-16.58c8.73.5 16.64-2.13 23.88-8.81Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="M333.13 461.32a2.15 2.15 0 0 0-.52 2.83 2.11 2.11 0 0 0 2.84.5 2.25 2.25 0 0 0 .53-3 2.19 2.19 0 0 0-3-.2"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="m331.72 474.64-1.36-4 48.32-17.07s2.59.09 2.93 1.73Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><path
|
|
||||||
d="M350.75 450.77c.08.24-1.1.82-2 2.06s-1.15 2.48-1.41 2.48-.44-1.54.68-3 2.69-1.78 2.73-1.54ZM356.81 450.87c.14.21-.76 1-1.19 2.36s-.26 2.5-.5 2.58-.93-1.21-.36-2.86 1.95-2.31 2.05-2.08ZM362.17 455.87c-.2.14-1-.93-.89-2.48s1.05-2.52 1.23-2.36-.25 1.14-.32 2.41.21 2.32-.02 2.43ZM259.73 325.23c.43 1.14 27.19 31 33.15 39.7 6.74 9.84 8.16 18.16 8.49 20.11 1.86 11.15 3.25 19 8.31 31.15S324.73 454 324.73 454l23.63-6.09s-13.93-59.44-15.19-69.34-3.38-17.57-8.87-26.67-29.71-58.77-29.71-58.77l-38.28 16.09Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M242.57 240.76s7.74.11 8.88.82 5.69 4.21 5.69 5a3 3 0 0 0 .32 1.38s2.86 4 1.57 5.71-2.24 2.27-2.21 2.8-.38 2.37-1.47 2.87a10.78 10.78 0 0 0-2.88 1.84 10.63 10.63 0 0 1-1.73 2.06 10.75 10.75 0 0 1-2.48 1.15 2.92 2.92 0 0 1-2.55 1.57c-1.64-.15-4.63-3.27-5.6-4.43-1.21-1.45-4.29-4-4.69-5.29a14.76 14.76 0 0 0-.92-2.3l-7.5-7.09 11.7-11.75Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M257.7 248.6a20.35 20.35 0 0 1-2.46-2.31 19.31 19.31 0 0 1-2.41-2.36 11.74 11.74 0 0 1 4.87 4.67Z"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M238.46 161.84s-8.9 7.54-11 9.43-29.46 24.87-31.29 35.27c-1.16 6.66 4 11.87 6.77 16.24 2 3.26 14.32 25.66 25.83 26.31.68 0 4.15 4.28 4.15 4.28l12.49-10.65a52.68 52.68 0 0 1-4.73-7c-5-9.38-15.89-24-15.55-24.66 2.43-4.55-3.34-3.47-3.34-3.47l23.94-21.95Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M198.89 199.64s-1.73-3.09 0-5.67S225 171.68 225 171.68s1.19.31 2.06 2.27-27 26.62-27 26.62Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M207.41 192.32s14 15.79 16 15.27 11.7-7.84 12.14-10.22-13.33-19-13.33-19ZM187.57 91.83c3.07.73 5.47 3.21 8.28 4.74 5.27 2.86 11.66 2.1 16.68-.23s9.1-6 13.61-9.1 8.09-6.22 14.6-6.81c11.49-1 23 9.11 17.78 17.7l-9.65 3.37a60.17 60.17 0 0 1-25.79 32.32c-2.42 1.47-5.16 2.83-8.17 2.45s-6.07-3.25-5.43-6c-4.78 1-9.7 1.92-14.7 1.17s-10.19-3.54-12.41-8-.26-10.48 4.56-11.35c-4.45-2.73-8.26-7.18-8.54-12s4.18-9.45 9.18-8.26Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M283.46 72.49c-6.22-1.69-12 .21-17.71 3.25a32.78 32.78 0 0 0-16.23 33.58 25.23 25.23 0 0 0 10.86 16.58c7.83 5 18.5 4.54 26.4-.31s13-13.65 14.27-22.84a30.7 30.7 0 0 0-3.05-18.6 23.36 23.36 0 0 0-14.53-11.66"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M263.37 92.26c1.16-2.33 1.06-5.07 1.68-7.6 1.36-5.57 3.94-10.5 9.42-12.19 5.1-1.57 13.45.3 19.16 2.78a22.62 22.62 0 0 1 9.88 7.9 17.84 17.84 0 0 1 1.71 16.26l-28.5-7c-2.92 2-5.92 4-9.32 4.91a6 6 0 0 1-3.07.19 2.7 2.7 0 0 1-2.06-2.07c-.16-1.15.59-2.17 1.1-3.18Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m257.85 145 5-54.65a4.74 4.74 0 0 1 4.85-4.19l25.76-2.89c8.09.25 12 10.79 11.46 18.86-.65 9-1.81 19.89-3.77 26.38-3.94 13.05-14.39 13.35-14.39 13.35s-.06.52-.78 5.35c0 0-1.31 10-12.46 7.81-7.24-1.42-15.67-10.02-15.67-10.02Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M300.16 112.56a1.72 1.72 0 0 1-1.88 1.5 1.66 1.66 0 0 1-1.56-1.78 1.75 1.75 0 0 1 1.89-1.51 1.65 1.65 0 0 1 1.55 1.79ZM301.8 107.49c-.24.19-1.41-.94-3.25-1.19s-3.32.49-3.49.24.19-.49.84-.84a4.8 4.8 0 0 1 2.83-.46 4.49 4.49 0 0 1 2.54 1.22c.51.54.65.94.53 1.03ZM284.13 110.14a1.73 1.73 0 0 1-1.89 1.5 1.66 1.66 0 0 1-1.55-1.78 1.74 1.74 0 0 1 1.89-1.51 1.65 1.65 0 0 1 1.55 1.79ZM284.19 104.44c-.24.2-1.41-.94-3.25-1.19s-3.32.49-3.49.24.19-.49.84-.83a4.73 4.73 0 0 1 2.83-.47 4.49 4.49 0 0 1 2.54 1.23c.51.51.65.94.53 1.02ZM288.47 119.93a12.12 12.12 0 0 1 3.06-.14c.48 0 .94 0 1.06-.32a2.42 2.42 0 0 0-.12-1.44c-.29-1.2-.59-2.45-.9-3.77-1.24-5.36-2.06-9.74-1.84-9.79s1.39 4.26 2.62 9.62c.29 1.32.58 2.58.84 3.78a2.7 2.7 0 0 1 0 1.88 1.16 1.16 0 0 1-.86.58 3.79 3.79 0 0 1-.82 0 12.7 12.7 0 0 1-3.04-.4Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M286.76 141.88a34.19 34.19 0 0 1-17.21-7.2s3.23 9.85 16.75 10.42ZM287.09 124.26a3.35 3.35 0 0 0-2.81-1.64 3 3 0 0 0-2.24.83 1.93 1.93 0 0 0-.45 2.18 2.26 2.26 0 0 0 2.33.94 7.25 7.25 0 0 0 2.55-1.08 2.35 2.35 0 0 0 .6-.48.64.64 0 0 0 .09-.68"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M282.88 120.46c.3 0 0 2 1.55 3.67s3.67 1.73 3.65 2c0 .13-.53.32-1.43.22a5 5 0 0 1-3.06-1.56 4.31 4.31 0 0 1-1.17-3.06c.03-.84.32-1.3.46-1.27ZM285.77 97.11c-.25.47-2.06 0-4.25 0s-4 .31-4.25-.17c-.1-.24.27-.67 1-1a7.07 7.07 0 0 1 3.26-.67 7.2 7.2 0 0 1 3.21.83c.79.33 1.14.78 1.03 1.01ZM302.37 99.37c-.39.37-1.59-.24-3.12-.47s-2.85-.1-3.09-.58c-.1-.23.16-.62.78-.94a4.55 4.55 0 0 1 5 .84c.48.51.6.96.43 1.15Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M259.12 87.91c3.37-7.43 15.81-16.79 23.82-15.28l12 9.26a12.54 12.54 0 0 1-9.57 8.54c-2.36.42-5.13.29-6.72 2.09s-1.15 4.86-2.69 6.77c-2.12 2.66-7 1.95-8.69 4.89-.75 1.28-.63 2.94-1.4 4.21-1 1.69-5.82 3.43-7.62 2.61s-1.44-4-1.85-5.74a9 9 0 0 1 .42-6c1.26-3.65.7-7.8 2.3-11.35Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M263.59 113.23c.13-1-.7-3.49-1.66-3.78-2.56-.76-7.31-1.2-8.27 5.45-1.3 9.09 8.09 8.52 8.15 8.26s1.32-6.5 1.78-9.93Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M259.53 119.32s-.18.09-.46.17a1.64 1.64 0 0 1-1.19-.14c-.91-.49-1.5-2.13-1.31-3.78a5.29 5.29 0 0 1 .77-2.2 1.83 1.83 0 0 1 1.36-1 .82.82 0 0 1 .88.56c.08.28 0 .45 0 .47s.22-.12.2-.51a1 1 0 0 0-.28-.62 1.23 1.23 0 0 0-.84-.36 2.24 2.24 0 0 0-1.85 1.18 5.24 5.24 0 0 0-.91 2.45c-.21 1.84.48 3.69 1.74 4.25a1.68 1.68 0 0 0 1.48 0c.36-.25.43-.45.41-.47Z"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M292.56 78.87c.48 3.8 5.66 9.12 7.86 12.25 4.19 6 4.95 7.91 3.7 20.24 2.65-4 4.76-8 5.06-12.88a20 20 0 0 0-4-13.6 15.6 15.6 0 0 0-12.61-6"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M254.48 87.34a9.48 9.48 0 0 0 1.51.54c.49.16 1.1.34 1.82.5s1.52.39 2.44.52a43.13 43.13 0 0 0 6.47.7 49.17 49.17 0 0 0 7.95-.43 48.36 48.36 0 0 0 7.76-1.81 44.66 44.66 0 0 0 6-2.47c.85-.39 1.56-.83 2.2-1.19s1.18-.7 1.6-1a10.08 10.08 0 0 0 1.31-.94 9 9 0 0 0-1.42.76c-.44.26-1 .58-1.64.9s-1.37.75-2.21 1.11a49.36 49.36 0 0 1-6 2.34 52.85 52.85 0 0 1-7.69 1.75 53.22 53.22 0 0 1-7.86.47 47.11 47.11 0 0 1-6.42-.58c-.91-.11-1.72-.3-2.43-.44s-1.33-.28-1.83-.41a8.25 8.25 0 0 0-1.56-.32ZM252.89 93.79a3.74 3.74 0 0 0 1 .36 27.49 27.49 0 0 0 2.91.67 36.71 36.71 0 0 0 19.39-1.88 24.88 24.88 0 0 0 2.81-1.21 3.77 3.77 0 0 0 .94-.55c0-.08-1.44.59-3.8 1.4a41.36 41.36 0 0 1-19.2 1.85c-2.52-.34-4.03-.73-4.05-.64Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="m155.92 343.89-19.68-8-8.49 15.01 4.13 8.92 18.26 6.26 5.78-22.19z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="m133 362.05-1.5-.59s-20.27 21.82-25.21 20.16l20.18-51.36 16.53 7.53c-6.47 6.21-10 14.05-10 24.26Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="M135.6 340.8a2.25 2.25 0 0 0-1.79-2.4 2.14 2.14 0 0 0-2.36 1.78 2.36 2.36 0 0 0 1.9 2.53 2.23 2.23 0 0 0 2.26-2.12"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><g style="opacity:.6000000000000001"
|
|
||||||
><path
|
|
||||||
d="m126.48 330.26 4 1.81-20.81 48.57s-1.87 1.89-3.35 1Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/></g
|
|
||||||
><path
|
|
||||||
d="M131.3 361.58c-.25-.11.13-1.41-.17-3s-1.09-2.64-.9-2.83 1.46.76 1.8 2.65-.53 3.33-.73 3.18ZM127 366.08c-.26 0-.26-1.3-1-2.57s-1.72-2-1.61-2.22 1.57.16 2.42 1.77.42 3.11.19 3.02ZM119.45 366.56c0-.25 1.4-.09 2.5 1.1s1.17 2.58.93 2.6-.69-1-1.6-2-1.91-1.44-1.83-1.7ZM145.78 339.09s15.36 4.19 25.9 6.15 22.64 4.78 31 7c8.81 2.29 12.72 3.59 12.72 3.59s2 2.61 3.5-7.74 6.1-47.73 6.1-47.73l5.06-16.08 30.38-5.32 16.12 21.27s-14.57 47.3-19.53 57.09-12 38.32-29.14 33.87c-10.14-2.63-89.33-27.5-89.33-27.5Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m223.39 313.78-.13 1.06-.33 2.63 23.27-11.21s.15 10.69 22 19l2.78-4.84v-14.16l-16.89-13.13h-11.68l-18.61 14"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M270.41 320.55a72.49 72.49 0 0 1-2.56 8.15 71.37 71.37 0 0 1-3.05 8 70.07 70.07 0 0 1 2.56-8.15 67 67 0 0 1 3.05-8ZM223.88 365.86a37.35 37.35 0 0 0-3.49-5.44 37.33 37.33 0 0 0-4.76-4.36 5.42 5.42 0 0 1 1.7.91 17 17 0 0 1 3.46 3.12 17.56 17.56 0 0 1 2.49 3.93 5.55 5.55 0 0 1 .6 1.84Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M226.55 272.74s-5.06 13.2-4.88 20.65-2.73 22.38-2.73 22.38 27.33-14.67 29.37-16.45c0 0-2 14.72 21.22 21.58l2 .77 7.13-21.5a68.35 68.35 0 0 0 6.19-12c1.88-5.42 4.5-15.41 4.5-15.41L237.47 258Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M289.38 287.64s12.76 17.61 12.94 20.49l-32.44 6.43-3-12.36-1.31-12.87Z"
|
|
||||||
style="fill:#455a64"
|
|
||||||
/><path
|
|
||||||
d="M239.86 171.23c.34.94 7 23.93 7 23.93l4 33.37s-6.73 19.75-12.4 26.21c-17.58 20.09-15.68 25.57-15.68 25.57s29.74-8 44.39-5.8 10.66 27.39 32 21.41l-.17-20.54s2.68-18.95 3.35-25.57-.24-30.41-.24-30.41 7.33-23.3 7.33-30.85 1.75-7.88-4.29-18.27-15-24.24-15-24.24l-33.63-2.84-18.64 19.21Z"
|
|
||||||
style="fill:#e0e0e0"
|
|
||||||
/><path
|
|
||||||
d="M281.7 292.51c.13 0-1.75 6.24-4.21 13.83s-4.56 13.72-4.7 13.67 1.75-6.23 4.21-13.83 4.56-13.72 4.7-13.67Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M238.71 172.17c-4.43 1.19-8.35 2.56-13.19 0s-8.89-7.36-9-12.84c-.06-4.48-.07-12.74 3.53-15.41s20.16-5.39 29.43-5.36c35.69.11 40.29 6 46 8.93a5.33 5.33 0 0 1-2.15 5.57"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M235.67 165.5s1 19.66 2.47 27.09 7.38 29.67 7.38 29.67-3.28 1.23-2.79 5.68c0 0-3.55 3.09-3.95 9.89s1.57 9.76 1.57 9.76l-3.84 7.72 64.36 12.17 1.08-7.27s4.66 3 5.51-11-.82-24.45-.08-37.3 5.53-17.86 4.3-29.47C311 175.62 289.35 147 289.35 147s-31.46-5.35-34.62-1.91-19.06 20.41-19.06 20.41Z"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M304 226.09c-15.48-8.7-26.72-23.17-37.53-37.27l-1.14-2.82c1.11 5.89 1.42 14.1 2.54 20a72.63 72.63 0 0 0 3.66 14.11 24.45 24.45 0 0 0 8.74 11.42c7 4.61 16.5 3.85 23.85-.1 1.08-.58 2.25-1.45 2.23-2.67s-1.28-2.05-2.35-2.67Z"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M234.28 178.25a10.43 10.43 0 0 1 .6 1.69c.35 1.09.82 2.69 1.37 4.67 1.11 4 2.45 9.48 3.87 15.59s2.72 11.64 3.75 15.61c.51 1.93.93 3.51 1.24 4.71a11.9 11.9 0 0 1 .41 1.74 11.81 11.81 0 0 1-.6-1.69c-.37-1.09-.84-2.68-1.4-4.66-1.13-4-2.5-9.48-3.91-15.59s-2.7-11.64-3.71-15.62c-.5-1.92-.91-3.51-1.22-4.71a12.51 12.51 0 0 1-.4-1.74ZM265.5 233.75a26.55 26.55 0 0 1-3.27-1.23c-2-.79-4.76-1.89-7.89-2.86a49.52 49.52 0 0 0-8.18-1.79c-2.13-.26-3.46-.28-3.46-.37a2.82 2.82 0 0 1 .94-.08 20.82 20.82 0 0 1 2.56.09 39.56 39.56 0 0 1 8.29 1.66 69.24 69.24 0 0 1 7.89 3c1 .45 1.77.82 2.31 1.1a3.61 3.61 0 0 1 .81.48ZM305.27 259.42a4.28 4.28 0 0 1-.58.35 10.73 10.73 0 0 1-1.82.75 18.56 18.56 0 0 1-7.17.46 230.88 230.88 0 0 1-23.22-4.74c-9-2.19-17.11-4.25-23-5.61l-7-1.56-1.91-.42a3.36 3.36 0 0 1-.66-.18 3.14 3.14 0 0 1 .68.08l1.93.32c1.67.29 4.07.77 7 1.4 5.93 1.27 14.07 3.28 23.05 5.47s17.16 4 23.14 4.87a19.12 19.12 0 0 0 7.08-.29 23.9 23.9 0 0 0 2.48-.9Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M227.92 172.83c2.38 4 7.5 5.94 12.14 5.33s8.78-3.37 11.94-6.83 5.46-7.59 7.73-11.68l6.17-11.12c-7.32 3.05-9.81 11.52-15.35 17.2s-16.27 9.44-22.63 7.1"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M266.52 148.59s-.73.18-2 .74a14.62 14.62 0 0 0-4.52 3.43 41.85 41.85 0 0 0-4.84 7 47 47 0 0 1-2.83 4.21 21.16 21.16 0 0 1-3.91 3.82 30.22 30.22 0 0 1-9.38 4.72 25 25 0 0 1-8.49 1.18 12.17 12.17 0 0 1-5.58-1.48 6.62 6.62 0 0 1-1.27-.93 2.54 2.54 0 0 1-.38-.4 18.82 18.82 0 0 0 1.75 1.16 12.65 12.65 0 0 0 5.5 1.28 25.19 25.19 0 0 0 8.33-1.27 30.59 30.59 0 0 0 9.21-4.67 21.42 21.42 0 0 0 3.82-3.72 47.6 47.6 0 0 0 2.82-4.15 40.4 40.4 0 0 1 5-7 14.13 14.13 0 0 1 4.7-3.36 9.15 9.15 0 0 1 1.5-.47 2 2 0 0 1 .57-.09ZM260.76 225.38c-.07.16-3.33-1.38-7.65-2.23a77 77 0 0 0-7.93-.88 8.27 8.27 0 0 1 2.35-.19 29.41 29.41 0 0 1 5.68.56 28.85 28.85 0 0 1 5.45 1.66 8.68 8.68 0 0 1 2.1 1.08ZM243 227.38c.07.07-.77 1-1.77 2.64a19.77 19.77 0 0 0-1.48 3.08 21.77 21.77 0 0 0-1 4.05 21.32 21.32 0 0 0-.16 4.17 20.22 20.22 0 0 0 .55 3.38c.48 1.89 1 3 .94 3a3.32 3.32 0 0 1-.44-.74 7.08 7.08 0 0 1-.41-.93 12.82 12.82 0 0 1-.45-1.26 17.38 17.38 0 0 1-.66-3.44 19.55 19.55 0 0 1 .11-4.29 20.16 20.16 0 0 1 1.1-4.14 17.53 17.53 0 0 1 1.62-3.11 12.25 12.25 0 0 1 .78-1.08 8.48 8.48 0 0 1 .66-.77c.38-.37.61-.58.61-.56Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M234.59 178.76a19.68 19.68 0 0 0 3.4 13.92c-.99-4.68-2.36-9.22-3.4-13.92Z"
|
|
||||||
style="opacity:.30000000000000004"
|
|
||||||
/><path
|
|
||||||
d="M340.48 208.44s5.27-6.17 6.6-6.62 7.22-1.77 7.88-1.22a3.09 3.09 0 0 0 1.33.67s5.11.33 5.66 2.55.34 3.33.78 3.66 1.67 1.89 1.33 3.11a11.48 11.48 0 0 0-.44 3.55 10.77 10.77 0 0 1 .5 2.78 11.39 11.39 0 0 1-.72 2.77 3.08 3.08 0 0 1-.45 3.11c-1.22 1.22-5.73 1.55-7.32 1.56-2 0-6.07.8-7.41.24a16.44 16.44 0 0 0-2.47-.8L335 225.08l-1.66-17.3Z"
|
|
||||||
style="fill:#ffbf9d"
|
|
||||||
/><path
|
|
||||||
d="M356.93 201.48a23.19 23.19 0 0 1-3.51.42 22.36 22.36 0 0 1-3.51.38 8.47 8.47 0 0 1 3.45-.9 8.38 8.38 0 0 1 3.57.1Z"
|
|
||||||
style="fill:#ff9a6c"
|
|
||||||
/><path
|
|
||||||
d="M264 182.13c4 10.83 7.79 25.38 10.6 33.79 3.81 11.43 15.63 15.68 21.67 16.14 7.73.58 45.4-6.55 45.4-6.55l-1.74-19-4.27.11a5.72 5.72 0 0 0-3-1.44c-7.93-1.87-29.3-.31-29.3-.31s-5.75-23.11-7-34.46c-1-9-1-23.68-15.07-24.53-9.15.43-15.06 3.81-17.29 13.61"
|
|
||||||
style="fill:#5e9cff"
|
|
||||||
/><path
|
|
||||||
d="M264 159.53s0-.14.08-.4.16-.67.29-1.18a19.72 19.72 0 0 1 1.76-4.37 13.72 13.72 0 0 1 5.28-5.37 22.3 22.3 0 0 1 9.87-2.44l1.53.19a8.4 8.4 0 0 1 1.56.29l1.58.44 1.53.71a12.92 12.92 0 0 1 5 4.92 23.71 23.71 0 0 1 2.63 7.23 74 74 0 0 1 1.13 8.18 161.08 161.08 0 0 0 2.91 17.77c1.3 6.2 2.78 12.67 4.42 19.35l-.26-.18c5.12-.35 10.45-.59 15.92-.62 2.74 0 5.52 0 8.33.23a38.23 38.23 0 0 1 4.22.51 13.37 13.37 0 0 1 2.1.51 5.35 5.35 0 0 1 1.9 1.17l-.19-.07 4.27-.11h.24v.51c.59 6.41 1.17 12.7 1.72 18.7v.23h-.23c-7.65 1.43-15.09 2.73-22.26 3.88q-5.39.87-10.55 1.57c-3.45.47-6.82.88-10.14 1.06a22.36 22.36 0 0 1-9.5-1.65 28.77 28.77 0 0 1-7.87-4.54 23 23 0 0 1-5.39-6.5 36.76 36.76 0 0 1-2.74-7.26c-2.84-9.43-5-17-6.64-22.2-.82-2.6-1.49-4.59-1.95-5.94-.22-.66-.4-1.17-.52-1.53a5.06 5.06 0 0 1-.16-.52s.07.16.2.5.33.86.57 1.52c.49 1.34 1.19 3.32 2 5.91 1.72 5.16 3.91 12.75 6.79 22.16a36.86 36.86 0 0 0 2.75 7.18 22.52 22.52 0 0 0 5.32 6.37 28.72 28.72 0 0 0 7.76 4.45 22.15 22.15 0 0 0 9.33 1.59c3.29-.18 6.66-.6 10.1-1.07s6.95-1 10.53-1.59c7.16-1.16 14.6-2.46 22.24-3.89l-.21.27c-.55-6-1.13-12.28-1.72-18.69v-.26l.26.23-4.26.11h-.11l-.08-.08a6.64 6.64 0 0 0-3.74-1.54 36.32 36.32 0 0 0-4.16-.5c-2.78-.2-5.55-.24-8.28-.24-5.46 0-10.78.26-15.89.6h-.21l-.05-.21a536.51 536.51 0 0 1-4.39-19.37 156.74 156.74 0 0 1-2.88-17.83 74.73 74.73 0 0 0-1.1-8.14 23.43 23.43 0 0 0-2.55-7.13 12.64 12.64 0 0 0-4.89-4.8l-1.48-.7-1.54-.44a7.37 7.37 0 0 0-1.53-.29l-1.51-.2a22.13 22.13 0 0 0-9.77 2.35 13.6 13.6 0 0 0-5.25 5.24 20.45 20.45 0 0 0-1.82 4.31l-.33 1.17Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M298.27 216a19.44 19.44 0 0 0 5-11.61 5.13 5.13 0 0 1 .08 1.92 14.38 14.38 0 0 1-1.12 4.51 14.19 14.19 0 0 1-2.5 3.92 4.86 4.86 0 0 1-1.46 1.26ZM337 226a88.26 88.26 0 0 1-1.07-9.59 91.09 91.09 0 0 1-.54-9.64 87.31 87.31 0 0 1 1.06 9.6A89.66 89.66 0 0 1 337 226Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<h3 class="text-2xl font-bold">{$_("done")}</h3>
|
|
||||||
<h4 class="text-xl font-semibold">
|
|
||||||
{cardCode}<br />{runnerinfo.firstname}
|
|
||||||
{runnerinfo.lastname} [#{runnerinfo.id}]
|
|
||||||
</h4>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
resetAll();
|
|
||||||
}}
|
|
||||||
bind:this={nextButton}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("next_runner")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else if state === "assigning"}
|
|
||||||
<p class="text-center font-semibold">
|
|
||||||
{$_("please_wait_a_moment_while_we_assign_the_card")}<br />{cardCode}
|
|
||||||
</p>
|
|
||||||
{:else if state === "error_runner"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
class="h-64 mx-auto"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 500 500"
|
|
||||||
><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#fff;opacity:.9"
|
|
||||||
/><path
|
|
||||||
d="M360.6 263.05h-.36c-26.64-2.18-45-25-45.74-25.92a4.47 4.47 0 0 1 7-5.55c.21.27 15.9 19.61 37.63 22.37 7-7 13-25.48 12.33-31.07v-.16c-.14-1.8-.48-8 1.29-11.65a4.47 4.47 0 0 1 8 3.88c-.44.92-.65 4.23-.44 7 1 9.2-7 32.42-17 40.19a4.47 4.47 0 0 1-2.71.91ZM148.82 238.82a65.8 65.8 0 0 1-48.56-22.28 4.46 4.46 0 0 1-.26-5.64c7.22-9.71 20-32.64 22-40.11a10.91 10.91 0 0 0-4.14-4.33 4.45 4.45 0 0 1-2.55-3.61l-.72-7.32a4.47 4.47 0 0 1 8.89-.88l.5 5.09a22.34 22.34 0 0 1 6.81 8.65 4.48 4.48 0 0 1 .32 2.26c-.92 7.93-13.79 30.9-21.71 42.51 18.49 18.43 40.59 16.75 41.56 16.66a4.47 4.47 0 0 1 .82 8.9c-.26.02-1.29.1-2.96.1ZM292.87 416.09h-12a4.47 4.47 0 0 1-4.31-5.66c3.13-11.24 4.67-20.39 5.82-34.71-4.24-20-8.23-38.21-8.27-38.39a4.47 4.47 0 0 1 8.73-1.91c0 .18 4.12 18.86 8.41 39.08a4.23 4.23 0 0 1 .08 1.28c-1 12.86-2.31 21.75-4.67 31.38h6.18a4.47 4.47 0 0 1 0 8.93ZM200.32 416.09h-6.76a4.45 4.45 0 0 1-4.42-5.08c1.15-8.2 7-23.13 13.3-38.14 2.23-19.8 4.05-36.8 4.07-37a4.47 4.47 0 1 1 8.88 1c0 .17-1.88 17.56-4.15 37.65a4.31 4.31 0 0 1-.32 1.22c-4.43 10.63-9.49 23.15-11.8 31.44h1.2a4.47 4.47 0 1 1 0 8.93Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m204.21 111-52.06 52.07c-2.62 57.71-2.41 118.33 0 181.18h172.16c-3.41-81.1-3.73-159.17 0-233.25Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M324.31 345.13H152.15a.9.9 0 0 1-.9-.86c-2.49-65.27-2.49-126.27 0-181.27a.9.9 0 0 1 .27-.59l52.06-52.07a.89.89 0 0 1 .63-.26h120.1a.9.9 0 0 1 .65.28.87.87 0 0 1 .24.66c-3.59 71.34-3.59 147.61 0 233.17a.89.89 0 0 1-.25.65.86.86 0 0 1-.64.29ZM153 343.34h170.38c-3.54-84.86-3.55-160.59 0-231.47h-118.8L153 163.43c-2.45 54.64-2.45 115.16 0 179.91Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M214.28 219.19c-.2-4.36-2.67-7.8-5.53-7.7s-5 3.71-4.82 8.07 2.67 7.8 5.53 7.69 5.02-3.71 4.82-8.06ZM274.65 217.82c-.2-4.35-2.67-7.79-5.53-7.69s-5 3.71-4.82 8.07 2.68 7.8 5.53 7.69 5.02-3.71 4.82-8.07ZM229.35 237a36.55 36.55 0 0 1 28.63 1.3 1.27 1.27 0 0 1 .49 1.74 1.3 1.3 0 0 1-1.75.49c-.15-.08-14.4-7.76-31.41 1a1.31 1.31 0 0 1-1.74-.54 1.27 1.27 0 0 1 .55-1.72 41.73 41.73 0 0 1 5.23-2.27ZM205.64 178.34a2.64 2.64 0 0 1 1.26.36 2.58 2.58 0 0 1 .92 3.51A25.29 25.29 0 0 1 188.27 195a2.59 2.59 0 0 1-2.69-2.45 2.55 2.55 0 0 1 2.44-2.66c.39 0 9.62-.58 15.36-10.27a2.52 2.52 0 0 1 2.26-1.28ZM266.05 176.87a2.57 2.57 0 0 1 2.33.72c8 8 17.14 6.39 17.52 6.32a2.6 2.6 0 0 1 3 2 2.54 2.54 0 0 1-2 3c-.5.09-12.14 2.31-22.21-7.75a2.54 2.54 0 0 1 1.31-4.3Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="m321.72 204.86-7.31.68a5.22 5.22 0 0 1-5.58-4.06L298.7 156.1a5.22 5.22 0 0 1 3.77-6.18l19.59-5.14ZM209 167.69c-5.09-13.89-10.18-36.12-4.81-56.71l-52.06 52.07c14.73 4.95 38.19 7.06 56.87 4.64Z"
|
|
||||||
style="opacity:.2"
|
|
||||||
/><path
|
|
||||||
d="M204.21 163.05c-5.71-16.86-3.38-39.78 0-52.07l-52.06 52.07c15.76 2.87 33.37 2.41 52.06 0Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M176 165.92a133.14 133.14 0 0 1-24-2 .88.88 0 0 1-.47-1.5l52.06-52.07a.89.89 0 0 1 1.49.87c-3.14 11.44-5.75 34.6 0 51.54a.93.93 0 0 1-.09.76.87.87 0 0 1-.64.41 221.85 221.85 0 0 1-28.35 1.99Zm-22-3.46c13.84 2.29 29.91 2.24 49-.16-4.71-14.94-3.64-34.71-.48-48.4Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<p class="text-lg font-semibold">{$_("runner_not_found")}</p>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
resetAll();
|
|
||||||
}}
|
|
||||||
bind:this={tryAgainButton}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("try_again")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else if state === "error_card"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
class="h-64 mx-auto"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 500 500"
|
|
||||||
><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#fff;opacity:.9"
|
|
||||||
/><path
|
|
||||||
d="M360.6 263.05h-.36c-26.64-2.18-45-25-45.74-25.92a4.47 4.47 0 0 1 7-5.55c.21.27 15.9 19.61 37.63 22.37 7-7 13-25.48 12.33-31.07v-.16c-.14-1.8-.48-8 1.29-11.65a4.47 4.47 0 0 1 8 3.88c-.44.92-.65 4.23-.44 7 1 9.2-7 32.42-17 40.19a4.47 4.47 0 0 1-2.71.91ZM148.82 238.82a65.8 65.8 0 0 1-48.56-22.28 4.46 4.46 0 0 1-.26-5.64c7.22-9.71 20-32.64 22-40.11a10.91 10.91 0 0 0-4.14-4.33 4.45 4.45 0 0 1-2.55-3.61l-.72-7.32a4.47 4.47 0 0 1 8.89-.88l.5 5.09a22.34 22.34 0 0 1 6.81 8.65 4.48 4.48 0 0 1 .32 2.26c-.92 7.93-13.79 30.9-21.71 42.51 18.49 18.43 40.59 16.75 41.56 16.66a4.47 4.47 0 0 1 .82 8.9c-.26.02-1.29.1-2.96.1ZM292.87 416.09h-12a4.47 4.47 0 0 1-4.31-5.66c3.13-11.24 4.67-20.39 5.82-34.71-4.24-20-8.23-38.21-8.27-38.39a4.47 4.47 0 0 1 8.73-1.91c0 .18 4.12 18.86 8.41 39.08a4.23 4.23 0 0 1 .08 1.28c-1 12.86-2.31 21.75-4.67 31.38h6.18a4.47 4.47 0 0 1 0 8.93ZM200.32 416.09h-6.76a4.45 4.45 0 0 1-4.42-5.08c1.15-8.2 7-23.13 13.3-38.14 2.23-19.8 4.05-36.8 4.07-37a4.47 4.47 0 1 1 8.88 1c0 .17-1.88 17.56-4.15 37.65a4.31 4.31 0 0 1-.32 1.22c-4.43 10.63-9.49 23.15-11.8 31.44h1.2a4.47 4.47 0 1 1 0 8.93Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m204.21 111-52.06 52.07c-2.62 57.71-2.41 118.33 0 181.18h172.16c-3.41-81.1-3.73-159.17 0-233.25Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M324.31 345.13H152.15a.9.9 0 0 1-.9-.86c-2.49-65.27-2.49-126.27 0-181.27a.9.9 0 0 1 .27-.59l52.06-52.07a.89.89 0 0 1 .63-.26h120.1a.9.9 0 0 1 .65.28.87.87 0 0 1 .24.66c-3.59 71.34-3.59 147.61 0 233.17a.89.89 0 0 1-.25.65.86.86 0 0 1-.64.29ZM153 343.34h170.38c-3.54-84.86-3.55-160.59 0-231.47h-118.8L153 163.43c-2.45 54.64-2.45 115.16 0 179.91Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M214.28 219.19c-.2-4.36-2.67-7.8-5.53-7.7s-5 3.71-4.82 8.07 2.67 7.8 5.53 7.69 5.02-3.71 4.82-8.06ZM274.65 217.82c-.2-4.35-2.67-7.79-5.53-7.69s-5 3.71-4.82 8.07 2.68 7.8 5.53 7.69 5.02-3.71 4.82-8.07ZM229.35 237a36.55 36.55 0 0 1 28.63 1.3 1.27 1.27 0 0 1 .49 1.74 1.3 1.3 0 0 1-1.75.49c-.15-.08-14.4-7.76-31.41 1a1.31 1.31 0 0 1-1.74-.54 1.27 1.27 0 0 1 .55-1.72 41.73 41.73 0 0 1 5.23-2.27ZM205.64 178.34a2.64 2.64 0 0 1 1.26.36 2.58 2.58 0 0 1 .92 3.51A25.29 25.29 0 0 1 188.27 195a2.59 2.59 0 0 1-2.69-2.45 2.55 2.55 0 0 1 2.44-2.66c.39 0 9.62-.58 15.36-10.27a2.52 2.52 0 0 1 2.26-1.28ZM266.05 176.87a2.57 2.57 0 0 1 2.33.72c8 8 17.14 6.39 17.52 6.32a2.6 2.6 0 0 1 3 2 2.54 2.54 0 0 1-2 3c-.5.09-12.14 2.31-22.21-7.75a2.54 2.54 0 0 1 1.31-4.3Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="m321.72 204.86-7.31.68a5.22 5.22 0 0 1-5.58-4.06L298.7 156.1a5.22 5.22 0 0 1 3.77-6.18l19.59-5.14ZM209 167.69c-5.09-13.89-10.18-36.12-4.81-56.71l-52.06 52.07c14.73 4.95 38.19 7.06 56.87 4.64Z"
|
|
||||||
style="opacity:.2"
|
|
||||||
/><path
|
|
||||||
d="M204.21 163.05c-5.71-16.86-3.38-39.78 0-52.07l-52.06 52.07c15.76 2.87 33.37 2.41 52.06 0Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M176 165.92a133.14 133.14 0 0 1-24-2 .88.88 0 0 1-.47-1.5l52.06-52.07a.89.89 0 0 1 1.49.87c-3.14 11.44-5.75 34.6 0 51.54a.93.93 0 0 1-.09.76.87.87 0 0 1-.64.41 221.85 221.85 0 0 1-28.35 1.99Zm-22-3.46c13.84 2.29 29.91 2.24 49-.16-4.71-14.94-3.64-34.71-.48-48.4Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<p class="text-lg font-semibold">{$_("card_not_found")}</p>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
state = "scan_card";
|
|
||||||
scannerActive = true;
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("try_again")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<!-- -->
|
|
||||||
{#if runnerinfo.id === 0}
|
|
||||||
<h3 class="text-2xl font-bold">{$_("scan_runner")}</h3>
|
|
||||||
<h4 class="text-xl font-semibold">
|
|
||||||
{$_("select-runner")}
|
|
||||||
</h4>
|
|
||||||
<Select
|
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
|
||||||
itemFilter={(label, filterText, option) =>
|
|
||||||
filterRunners(label, filterText, option)}
|
|
||||||
items={runners}
|
|
||||||
showChevron={true}
|
|
||||||
placeholder={$_("search-for-runner-by-name-or-id")}
|
|
||||||
noOptionsMessage={$_("no-runners-found")}
|
|
||||||
on:select={(selectedValue) => {
|
|
||||||
runnerinfo = selectedValue.detail.value;
|
|
||||||
state = "scan_card";
|
|
||||||
setTimeout(() => {
|
|
||||||
barcodeInput && barcodeInput.focus();
|
|
||||||
}, 100);
|
|
||||||
}}
|
|
||||||
on:clear={() => (runnerinfo.runner = null)}
|
|
||||||
/>
|
|
||||||
{:else}
|
|
||||||
<h3 class="text-2xl font-bold">
|
|
||||||
{runnerinfo.firstname}
|
|
||||||
{runnerinfo.lastname}
|
|
||||||
</h3>
|
|
||||||
<p>
|
|
||||||
ID: #{runnerinfo.id}<br />created_via: {runnerinfo.created_via}<br
|
|
||||||
/>{runnerinfo.group.name}
|
|
||||||
</p>
|
|
||||||
{/if}
|
|
||||||
<!-- -->
|
|
||||||
{/if}
|
|
||||||
{#if state === "scan_card"}
|
|
||||||
<h3 class="text-2xl font-bold">{$_("scan_card")}</h3>
|
|
||||||
<h4 class="text-xl font-semibold">{$_("code_128_barcode")}</h4>
|
|
||||||
{/if}
|
|
||||||
{#if state.includes("scan_")}
|
|
||||||
{#if scannerActive}
|
|
||||||
<QrCodeScanner
|
|
||||||
:paused={!scannerActive}
|
|
||||||
on:detect={(e) => {
|
|
||||||
if (scannerActive) {
|
|
||||||
if (`${e.detail.decodedText}`.length === 13) {
|
|
||||||
e.detail.decodedText = e.detail.decodedText.substring(
|
|
||||||
0,
|
|
||||||
e.detail.decodedText.length - 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
scannerActive = false;
|
|
||||||
console.log({ type: "DETECT", code: e.detail.decodedText });
|
|
||||||
handleBarcode(e.detail.decodedText);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
width={320}
|
|
||||||
height={320}
|
|
||||||
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden"
|
|
||||||
/>
|
|
||||||
<form
|
|
||||||
on:submit={(e) => {
|
|
||||||
handleBarcode(barcodeInput.value);
|
|
||||||
barcodeInput.value = "";
|
|
||||||
e.preventDefault();
|
|
||||||
}}
|
|
||||||
class="mt-2"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder={$_("barcode_scanner")}
|
|
||||||
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden mt-2"
|
|
||||||
bind:this={barcodeInput}
|
|
||||||
/>
|
|
||||||
</form>
|
|
||||||
{/if}
|
|
||||||
{#if runnerinfo.id !== 0 && state !== "scan_card"}
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
state = "scan_card";
|
|
||||||
scannerActive = true;
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 w-full mt-2"
|
|
||||||
>
|
|
||||||
{$_("scan_card")}
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
{#if state === "scan_card" || runnerinfo.id !== 0}
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
state = "scan_runner";
|
|
||||||
scannerActive = true;
|
|
||||||
runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
cardCode = "";
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-red-100 text-red-800 hover:bg-red-200 focus:outline-hidden focus:bg-red-200 disabled:opacity-50 disabled:pointer-events-none dark:text-red-500 dark:bg-red-800/30 dark:hover:bg-red-800/20 dark:focus:bg-red-800/20 w-full mt-2"
|
|
||||||
>
|
|
||||||
{$_("cancel")}
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
<!-- -->
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
@ -1,422 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { _ } from "svelte-i18n";
|
|
||||||
import {
|
|
||||||
DonationService,
|
|
||||||
DonorService,
|
|
||||||
RunnerService,
|
|
||||||
} from "@odit/lfk-client-js";
|
|
||||||
import toast from "svelte-french-toast";
|
|
||||||
import VirtualSelect from "./VirtualSelect.svelte";
|
|
||||||
import { onMount } from "svelte";
|
|
||||||
|
|
||||||
let runners = [];
|
|
||||||
let donors = [];
|
|
||||||
let runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
let donorinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
let address = {
|
|
||||||
address1: "",
|
|
||||||
address2: "",
|
|
||||||
city: "",
|
|
||||||
postalcode: "",
|
|
||||||
country: "Germany",
|
|
||||||
};
|
|
||||||
let amount = null;
|
|
||||||
let address_checked = false;
|
|
||||||
let donor_create_new = false;
|
|
||||||
let last_created = null;
|
|
||||||
|
|
||||||
RunnerService.runnerControllerGetAll()
|
|
||||||
.then((val) => {
|
|
||||||
runners = val.map((r) => {
|
|
||||||
return { label: getRunnerLabel(r), value: r };
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.log("error fetching runners:", err);
|
|
||||||
});
|
|
||||||
|
|
||||||
function loadDonors() {
|
|
||||||
DonorService.donorControllerGetAll()
|
|
||||||
.then((val) => {
|
|
||||||
donors = val.map((r) => {
|
|
||||||
return { label: getRunnerLabel(r), value: r };
|
|
||||||
});
|
|
||||||
console.log("refreshed donors");
|
|
||||||
setTimeout(() => {
|
|
||||||
loadDonors;
|
|
||||||
}, 30000);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.log("error fetching donors:", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
loadDonors();
|
|
||||||
|
|
||||||
const getRunnerLabel = (option) => {
|
|
||||||
return (
|
|
||||||
[option.firstname, option.middlename, option.lastname]
|
|
||||||
.join(" ")
|
|
||||||
.replace(" ", " ") +
|
|
||||||
" [#" +
|
|
||||||
option.id +
|
|
||||||
"]"
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
let selectRefRunner;
|
|
||||||
let selectRefDonor;
|
|
||||||
|
|
||||||
function resetAll() {
|
|
||||||
runnerinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
donorinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
amount = null;
|
|
||||||
address_checked = false;
|
|
||||||
donor_create_new = false;
|
|
||||||
selectRefRunner?.reset();
|
|
||||||
selectRefDonor?.reset();
|
|
||||||
document.querySelector("#jjqzqicxujrnnh1x3447x18x").focus();
|
|
||||||
}
|
|
||||||
onMount(() => {
|
|
||||||
document.querySelector("#jjqzqicxujrnnh1x3447x18x").focus();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div class="p-4">
|
|
||||||
<h3 class="text-3xl font-bold">{$_("fast_donation_create")}</h3>
|
|
||||||
<!-- -->
|
|
||||||
<div>
|
|
||||||
<div class="w-full space-y-4 mb-6">
|
|
||||||
{#if last_created}
|
|
||||||
<div class="mt-4 p-3 bg-green-50 border border-green-200 rounded-md">
|
|
||||||
<p class="text-black">
|
|
||||||
{$_("last-created-donation")}: #{last_created.id}: {last_created.amountPerDistance /
|
|
||||||
100}€ für {getRunnerLabel(last_created.runner)} von {getRunnerLabel(
|
|
||||||
last_created.donor
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<!-- -->
|
|
||||||
<h4 class="text-xl font-semibold">{$_("runner")}</h4>
|
|
||||||
<VirtualSelect
|
|
||||||
inputElementID="jjqzqicxujrnnh1x3447x18x"
|
|
||||||
bind:this={selectRefRunner}
|
|
||||||
on:onClear={() => {
|
|
||||||
console.log("Cleared selection");
|
|
||||||
}}
|
|
||||||
options={runners}
|
|
||||||
filterFn={(item, searchTerm) => {
|
|
||||||
if (searchTerm.startsWith("#")) {
|
|
||||||
const id = parseInt(searchTerm.replace("#", ""));
|
|
||||||
return item.value.id === id;
|
|
||||||
}
|
|
||||||
return item.label.toLowerCase().includes(searchTerm.toLowerCase());
|
|
||||||
}}
|
|
||||||
bind:selected={runnerinfo}
|
|
||||||
inputAriaLabel={$_("search-for-runner-by-name-or-id")}
|
|
||||||
inputPlaceholder={$_("search-for-runner-by-name-or-id")}
|
|
||||||
noOptionsText={$_("no-runners-found")}
|
|
||||||
on:onSelected={(data) => {
|
|
||||||
if (data.detail !== null) {
|
|
||||||
document.querySelector("#donation_amount_eur").focus();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Amount Input -->
|
|
||||||
<div>
|
|
||||||
<h4 class="text-xl font-semibold">{$_("amount-per-kilometer")}</h4>
|
|
||||||
<div class="mt-1 flex rounded-md shadow-sm">
|
|
||||||
<input
|
|
||||||
autocomplete="off"
|
|
||||||
class:border-red-500={!amount > 0}
|
|
||||||
class:focus:border-red-500={!amount > 0}
|
|
||||||
class:focus:ring-red-500={!amount > 0}
|
|
||||||
bind:value={amount}
|
|
||||||
on:keydown={(e) => {
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
e.preventDefault();
|
|
||||||
document.querySelector("#button_existing_donor").focus();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
type="number"
|
|
||||||
step="0.01"
|
|
||||||
id="donation_amount_eur"
|
|
||||||
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 border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
|
||||||
placeholder="z.B. 1,50"
|
|
||||||
/>
|
|
||||||
<span
|
|
||||||
class="inline-flex items-center px-3 rounded-r-md border border-neutral-300 bg-neutral-50 text-neutral-500 text-sm"
|
|
||||||
>€</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Donor Selection -->
|
|
||||||
<div>
|
|
||||||
<h4 class="text-xl font-semibold">{$_("donor")}</h4>
|
|
||||||
|
|
||||||
<!-- Donor Type Toggle -->
|
|
||||||
<div class="mb-2">
|
|
||||||
<div class="flex border rounded-md overflow-hidden shadow-sm">
|
|
||||||
<button
|
|
||||||
on:keydown={(e) => {
|
|
||||||
if (e.key === "ArrowRight") {
|
|
||||||
e.preventDefault();
|
|
||||||
document.querySelector("#button_new_donor").focus();
|
|
||||||
document.querySelector("#button_new_donor").click();
|
|
||||||
}
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
e.preventDefault();
|
|
||||||
document.querySelector("#zt12c3udy3bme5bqobmqcif1").focus();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
id="button_existing_donor"
|
|
||||||
class:bg-indigo-600={!donor_create_new}
|
|
||||||
class:text-white={!donor_create_new}
|
|
||||||
class="py-2 px-4 w-1/2 transition-colors"
|
|
||||||
on:click={() => {
|
|
||||||
donor_create_new = false;
|
|
||||||
donorinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{$_("existing-donor")}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
on:keydown={(e) => {
|
|
||||||
if (e.key === "ArrowLeft") {
|
|
||||||
e.preventDefault();
|
|
||||||
document.querySelector("#button_existing_donor").focus();
|
|
||||||
document.querySelector("#button_existing_donor").click();
|
|
||||||
}
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
e.preventDefault();
|
|
||||||
document.querySelector("#button_new_donor").click();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
id="button_new_donor"
|
|
||||||
class={`py-2 px-4 w-1/2 transition-colors ${donor_create_new ? "bg-indigo-600 text-white" : "bg-gray-100 text-gray-700"}`}
|
|
||||||
on:click={() => {
|
|
||||||
donor_create_new = true;
|
|
||||||
donorinfo = { id: 0, firstname: "", lastname: "" };
|
|
||||||
setTimeout(() => {
|
|
||||||
document.querySelector("#firstname").focus();
|
|
||||||
}, 50);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{$_("new-donor")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{#if !donor_create_new}
|
|
||||||
<VirtualSelect
|
|
||||||
inputElementID="zt12c3udy3bme5bqobmqcif1"
|
|
||||||
bind:this={selectRefDonor}
|
|
||||||
on:onClear={() => {
|
|
||||||
console.log("Cleared selection");
|
|
||||||
}}
|
|
||||||
options={donors}
|
|
||||||
filterFn={(item, searchTerm) => {
|
|
||||||
return item.label
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchTerm.toLowerCase());
|
|
||||||
}}
|
|
||||||
bind:selected={donorinfo}
|
|
||||||
inputAriaLabel={$_("search-for-donor")}
|
|
||||||
inputPlaceholder={$_("search-for-donor")}
|
|
||||||
noOptionsText={$_("no-donors-found")}
|
|
||||||
on:onSelected={(data) => {
|
|
||||||
console.log(data.detail);
|
|
||||||
if (data.detail !== null) {
|
|
||||||
document.querySelector("#submit_button").focus();
|
|
||||||
setTimeout(() => {
|
|
||||||
document.querySelector("#submit_button").focus();
|
|
||||||
}, 100);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{:else}
|
|
||||||
<div class="space-y-3">
|
|
||||||
<!-- First Name -->
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
for="firstname"
|
|
||||||
class="block text-sm font-medium text-gray-700"
|
|
||||||
>
|
|
||||||
{$_("first-name")}
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="firstname"
|
|
||||||
on:keydown={(e) => {
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
document.querySelector("#lastname").focus();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
bind:value={donorinfo.firstname}
|
|
||||||
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
|
||||||
placeholder={$_("first-name")}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Last Name -->
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
for="lastname"
|
|
||||||
class="block text-sm font-medium text-gray-700"
|
|
||||||
>
|
|
||||||
{$_("last-name")}
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="lastname"
|
|
||||||
bind:value={donorinfo.lastname}
|
|
||||||
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
|
||||||
placeholder={$_("last-name")}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Address Checkbox -->
|
|
||||||
<div class="flex items-start mt-4">
|
|
||||||
<div class="flex items-center h-5">
|
|
||||||
<input
|
|
||||||
id="address_check"
|
|
||||||
type="checkbox"
|
|
||||||
bind:checked={address_checked}
|
|
||||||
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="ml-3 text-sm">
|
|
||||||
<label for="address_check" class="font-medium text-gray-700">
|
|
||||||
{$_("receipt-needed")}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{#if address_checked}
|
|
||||||
<!-- Address Fields -->
|
|
||||||
<div
|
|
||||||
class="space-y-3 mt-3 p-3 border border-gray-200 rounded-md bg-gray-50"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
for="address1"
|
|
||||||
class="block text-sm font-medium text-gray-700"
|
|
||||||
>
|
|
||||||
{$_("address")}
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="address1"
|
|
||||||
bind:value={address.address1}
|
|
||||||
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
for="address2"
|
|
||||||
class="block text-sm font-medium text-gray-700"
|
|
||||||
>
|
|
||||||
{$_("apartment-suite-etc")}
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="address2"
|
|
||||||
bind:value={address.address2}
|
|
||||||
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="grid grid-cols-2 gap-3">
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
for="postalcode"
|
|
||||||
class="block text-sm font-medium text-gray-700"
|
|
||||||
>
|
|
||||||
{$_("zip-postal-code")}
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="postalcode"
|
|
||||||
bind:value={address.postalcode}
|
|
||||||
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<label
|
|
||||||
for="city"
|
|
||||||
class="block text-sm font-medium text-gray-700"
|
|
||||||
>
|
|
||||||
{$_("city")}
|
|
||||||
</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="city"
|
|
||||||
bind:value={address.city}
|
|
||||||
class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
<!-- Submit Button -->
|
|
||||||
<div class="mt-6">
|
|
||||||
<button
|
|
||||||
id="submit_button"
|
|
||||||
type="button"
|
|
||||||
class="w-full inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:bg-gray-400 disabled:cursor-not-allowed"
|
|
||||||
disabled={!amount > 0 ||
|
|
||||||
!runnerinfo.id ||
|
|
||||||
(!donorinfo.id && !donor_create_new) ||
|
|
||||||
(donor_create_new &&
|
|
||||||
(!donorinfo.firstname || !donorinfo.lastname)) ||
|
|
||||||
(donor_create_new &&
|
|
||||||
address_checked &&
|
|
||||||
(!address.address1 || !address.city || !address.postalcode))}
|
|
||||||
on:click={async () => {
|
|
||||||
if (donor_create_new) {
|
|
||||||
donorinfo = await DonorService.donorControllerPost({
|
|
||||||
firstname: donorinfo.firstname,
|
|
||||||
lastname: donorinfo.lastname,
|
|
||||||
receiptNeeded: address_checked,
|
|
||||||
...(address_checked ? { address: address } : {}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
DonationService.donationControllerPostDistance({
|
|
||||||
donor: donorinfo.id,
|
|
||||||
runner: runnerinfo.id,
|
|
||||||
amountPerDistance: amount * 100,
|
|
||||||
})
|
|
||||||
.then((data) => {
|
|
||||||
last_created = data;
|
|
||||||
toast.success($_("donation-created-successfully"));
|
|
||||||
resetAll();
|
|
||||||
loadDonors();
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.error("Error creating donation:", err);
|
|
||||||
toast.error($_("error-creating-donation"));
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{$_("create")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
:global(:root) {
|
|
||||||
--sv-bg: #ffffff;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,85 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { onMount, createEventDispatcher } from "svelte";
|
|
||||||
import {
|
|
||||||
Html5QrcodeScanner,
|
|
||||||
Html5QrcodeScanType,
|
|
||||||
Html5QrcodeSupportedFormats,
|
|
||||||
} from "html5-qrcode";
|
|
||||||
import { debounce } from "underscore";
|
|
||||||
|
|
||||||
export let width;
|
|
||||||
export let height;
|
|
||||||
export let paused = false;
|
|
||||||
|
|
||||||
const dispatch = createEventDispatcher();
|
|
||||||
|
|
||||||
const debouncedDispatch = debounce(
|
|
||||||
function (decodedText) {
|
|
||||||
// console.log("dispatchEvent");
|
|
||||||
dispatch("detect", { decodedText });
|
|
||||||
},
|
|
||||||
500,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
function onScanSuccess(decodedText, decodedResult) {
|
|
||||||
// console.log("onScanSuccess", decodedText);
|
|
||||||
if (!paused) {
|
|
||||||
debouncedDispatch(decodedText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// usually better to ignore and keep scanning
|
|
||||||
function onScanFailure(message) {
|
|
||||||
if (!paused) {
|
|
||||||
dispatch("error", { message });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let scanner;
|
|
||||||
onMount(() => {
|
|
||||||
scanner = new Html5QrcodeScanner(
|
|
||||||
"qr-scanner",
|
|
||||||
{
|
|
||||||
fps: 10,
|
|
||||||
showTorchButtonIfSupported: true,
|
|
||||||
rememberLastUsedCamera: true,
|
|
||||||
qrbox: { width, height },
|
|
||||||
aspectRatio: 1,
|
|
||||||
supportedScanTypes: [Html5QrcodeScanType.SCAN_TYPE_CAMERA],
|
|
||||||
formatsToSupport: [
|
|
||||||
Html5QrcodeSupportedFormats.CODE_39,
|
|
||||||
Html5QrcodeSupportedFormats.EAN_8,
|
|
||||||
Html5QrcodeSupportedFormats.EAN_13,
|
|
||||||
Html5QrcodeSupportedFormats.QR_CODE,
|
|
||||||
Html5QrcodeSupportedFormats.CODE_128,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
false // non-verbose
|
|
||||||
);
|
|
||||||
scanner.render(onScanSuccess, onScanFailure);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div id="qr-scanner" class={$$props.class} />
|
|
||||||
|
|
||||||
<style>
|
|
||||||
/* Hide unwanted icons */
|
|
||||||
#qr-scanner :global(img[alt="Info icon"]),
|
|
||||||
#qr-scanner :global(img[alt="Camera based scan"]) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Change camera permission button text */
|
|
||||||
#qr-scanner :global(#html5-qrcode-button-camera-permission) {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
#qr-scanner :global(#html5-qrcode-button-camera-permission::after) {
|
|
||||||
position: absolute;
|
|
||||||
inset: auto 0 0;
|
|
||||||
display: block;
|
|
||||||
content: "Allow camera access";
|
|
||||||
visibility: visible;
|
|
||||||
padding: 10px 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,239 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { _, time } from "svelte-i18n";
|
|
||||||
import {
|
|
||||||
RunnerCardService,
|
|
||||||
RunnerService,
|
|
||||||
ScanService,
|
|
||||||
ScanStationService,
|
|
||||||
TrackService,
|
|
||||||
} from "@odit/lfk-client-js";
|
|
||||||
import QrCodeScanner from "./QrCodeScanner.svelte";
|
|
||||||
import { onMount } from "svelte";
|
|
||||||
import Select from "svelte-select";
|
|
||||||
let state = "scan_card";
|
|
||||||
let scaninfo = {
|
|
||||||
lapTime: 0,
|
|
||||||
track: "",
|
|
||||||
distance: null,
|
|
||||||
valid: false,
|
|
||||||
id: 0,
|
|
||||||
runner: {
|
|
||||||
id: 0,
|
|
||||||
firstname: "",
|
|
||||||
lastname: "",
|
|
||||||
distance: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
let cardCode = "";
|
|
||||||
let scannerActive = false;
|
|
||||||
let barcodeInput;
|
|
||||||
let stations = [];
|
|
||||||
let selectedStation = null;
|
|
||||||
|
|
||||||
function resetAll() {
|
|
||||||
state = "scan_card";
|
|
||||||
scaninfo = {
|
|
||||||
lapTime: 0,
|
|
||||||
track: "",
|
|
||||||
distance: null,
|
|
||||||
valid: false,
|
|
||||||
id: 0,
|
|
||||||
runner: {
|
|
||||||
id: 0,
|
|
||||||
firstname: "",
|
|
||||||
lastname: "",
|
|
||||||
distance: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
cardCode = "";
|
|
||||||
scannerActive = true;
|
|
||||||
setTimeout(() => {
|
|
||||||
barcodeInput && barcodeInput.focus();
|
|
||||||
}, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
onMount(() => {
|
|
||||||
if (barcodeInput) {
|
|
||||||
barcodeInput.focus();
|
|
||||||
}
|
|
||||||
ScanStationService.scanStationControllerGetAll()
|
|
||||||
.then((data) => {
|
|
||||||
stations = data.map((val) => {
|
|
||||||
return {
|
|
||||||
label: val.description,
|
|
||||||
value: val,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
scannerActive = true;
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
stations = [];
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function handleInput(input) {
|
|
||||||
ScanService.scanControllerPostTrackScans({
|
|
||||||
card: parseInt(input),
|
|
||||||
station: selectedStation,
|
|
||||||
})
|
|
||||||
.then((data) => {
|
|
||||||
scaninfo = data;
|
|
||||||
if (scaninfo.valid) {
|
|
||||||
new Audio("/beep.mp3").play();
|
|
||||||
state = "scan_card";
|
|
||||||
} else {
|
|
||||||
state = "error_invalid";
|
|
||||||
new Audio("/error.mp3").play();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.error(err);
|
|
||||||
state = "error_card";
|
|
||||||
new Audio("/error.mp3").play();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div class="p-4">
|
|
||||||
<h3 class="text-3xl font-bold">{$_("mobile-scanclient")}</h3>
|
|
||||||
<Select
|
|
||||||
containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
|
|
||||||
items={stations}
|
|
||||||
showChevron={true}
|
|
||||||
placeholder={$_("search-for-track")}
|
|
||||||
noOptionsMessage={$_("no-tracks-found")}
|
|
||||||
on:select={(selectedValue) => {
|
|
||||||
selectedStation = selectedValue.detail.value.id;
|
|
||||||
setTimeout(() => {
|
|
||||||
barcodeInput && barcodeInput.focus();
|
|
||||||
}, 100);
|
|
||||||
}}
|
|
||||||
on:clear={() => (selectedStation = null)}
|
|
||||||
/>
|
|
||||||
{#if state === "error_card"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
class="h-64 mx-auto"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 500 500"
|
|
||||||
><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="M298.37 335.5C382 299.85 469.46 233.1 432.31 135 398.6 46 284.74 25.75 219.62 102.47c-28.09 33.09-23.18 77.05-57.16 106.51s-90.4 45.83-75.13 104c23.67 89.93 156 46.02 211.04 22.52Z"
|
|
||||||
style="fill:#fff;opacity:.9"
|
|
||||||
/><path
|
|
||||||
d="M360.6 263.05h-.36c-26.64-2.18-45-25-45.74-25.92a4.47 4.47 0 0 1 7-5.55c.21.27 15.9 19.61 37.63 22.37 7-7 13-25.48 12.33-31.07v-.16c-.14-1.8-.48-8 1.29-11.65a4.47 4.47 0 0 1 8 3.88c-.44.92-.65 4.23-.44 7 1 9.2-7 32.42-17 40.19a4.47 4.47 0 0 1-2.71.91ZM148.82 238.82a65.8 65.8 0 0 1-48.56-22.28 4.46 4.46 0 0 1-.26-5.64c7.22-9.71 20-32.64 22-40.11a10.91 10.91 0 0 0-4.14-4.33 4.45 4.45 0 0 1-2.55-3.61l-.72-7.32a4.47 4.47 0 0 1 8.89-.88l.5 5.09a22.34 22.34 0 0 1 6.81 8.65 4.48 4.48 0 0 1 .32 2.26c-.92 7.93-13.79 30.9-21.71 42.51 18.49 18.43 40.59 16.75 41.56 16.66a4.47 4.47 0 0 1 .82 8.9c-.26.02-1.29.1-2.96.1ZM292.87 416.09h-12a4.47 4.47 0 0 1-4.31-5.66c3.13-11.24 4.67-20.39 5.82-34.71-4.24-20-8.23-38.21-8.27-38.39a4.47 4.47 0 0 1 8.73-1.91c0 .18 4.12 18.86 8.41 39.08a4.23 4.23 0 0 1 .08 1.28c-1 12.86-2.31 21.75-4.67 31.38h6.18a4.47 4.47 0 0 1 0 8.93ZM200.32 416.09h-6.76a4.45 4.45 0 0 1-4.42-5.08c1.15-8.2 7-23.13 13.3-38.14 2.23-19.8 4.05-36.8 4.07-37a4.47 4.47 0 1 1 8.88 1c0 .17-1.88 17.56-4.15 37.65a4.31 4.31 0 0 1-.32 1.22c-4.43 10.63-9.49 23.15-11.8 31.44h1.2a4.47 4.47 0 1 1 0 8.93Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="m204.21 111-52.06 52.07c-2.62 57.71-2.41 118.33 0 181.18h172.16c-3.41-81.1-3.73-159.17 0-233.25Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M324.31 345.13H152.15a.9.9 0 0 1-.9-.86c-2.49-65.27-2.49-126.27 0-181.27a.9.9 0 0 1 .27-.59l52.06-52.07a.89.89 0 0 1 .63-.26h120.1a.9.9 0 0 1 .65.28.87.87 0 0 1 .24.66c-3.59 71.34-3.59 147.61 0 233.17a.89.89 0 0 1-.25.65.86.86 0 0 1-.64.29ZM153 343.34h170.38c-3.54-84.86-3.55-160.59 0-231.47h-118.8L153 163.43c-2.45 54.64-2.45 115.16 0 179.91Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/><path
|
|
||||||
d="M214.28 219.19c-.2-4.36-2.67-7.8-5.53-7.7s-5 3.71-4.82 8.07 2.67 7.8 5.53 7.69 5.02-3.71 4.82-8.06ZM274.65 217.82c-.2-4.35-2.67-7.79-5.53-7.69s-5 3.71-4.82 8.07 2.68 7.8 5.53 7.69 5.02-3.71 4.82-8.07ZM229.35 237a36.55 36.55 0 0 1 28.63 1.3 1.27 1.27 0 0 1 .49 1.74 1.3 1.3 0 0 1-1.75.49c-.15-.08-14.4-7.76-31.41 1a1.31 1.31 0 0 1-1.74-.54 1.27 1.27 0 0 1 .55-1.72 41.73 41.73 0 0 1 5.23-2.27ZM205.64 178.34a2.64 2.64 0 0 1 1.26.36 2.58 2.58 0 0 1 .92 3.51A25.29 25.29 0 0 1 188.27 195a2.59 2.59 0 0 1-2.69-2.45 2.55 2.55 0 0 1 2.44-2.66c.39 0 9.62-.58 15.36-10.27a2.52 2.52 0 0 1 2.26-1.28ZM266.05 176.87a2.57 2.57 0 0 1 2.33.72c8 8 17.14 6.39 17.52 6.32a2.6 2.6 0 0 1 3 2 2.54 2.54 0 0 1-2 3c-.5.09-12.14 2.31-22.21-7.75a2.54 2.54 0 0 1 1.31-4.3Z"
|
|
||||||
style="fill:#407bff"
|
|
||||||
/><path
|
|
||||||
d="m321.72 204.86-7.31.68a5.22 5.22 0 0 1-5.58-4.06L298.7 156.1a5.22 5.22 0 0 1 3.77-6.18l19.59-5.14ZM209 167.69c-5.09-13.89-10.18-36.12-4.81-56.71l-52.06 52.07c14.73 4.95 38.19 7.06 56.87 4.64Z"
|
|
||||||
style="opacity:.2"
|
|
||||||
/><path
|
|
||||||
d="M204.21 163.05c-5.71-16.86-3.38-39.78 0-52.07l-52.06 52.07c15.76 2.87 33.37 2.41 52.06 0Z"
|
|
||||||
style="fill:#fff"
|
|
||||||
/><path
|
|
||||||
d="M176 165.92a133.14 133.14 0 0 1-24-2 .88.88 0 0 1-.47-1.5l52.06-52.07a.89.89 0 0 1 1.49.87c-3.14 11.44-5.75 34.6 0 51.54a.93.93 0 0 1-.09.76.87.87 0 0 1-.64.41 221.85 221.85 0 0 1-28.35 1.99Zm-22-3.46c13.84 2.29 29.91 2.24 49-.16-4.71-14.94-3.64-34.71-.48-48.4Z"
|
|
||||||
style="fill:#263238"
|
|
||||||
/></svg
|
|
||||||
>
|
|
||||||
<p class="text-lg font-semibold">{$_("card_not_found")}</p>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
resetAll();
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("try_again")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else if state === "error_invalid"}
|
|
||||||
<div class="text-center mx-auto">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
class="w-64 h-64 text-center mx-auto text-red-600 mt-2"
|
|
||||||
viewBox="5.25 5.25 13.5 13.5"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
d="M6 18L18 6M6 6l12 12"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
<p class="text-lg font-semibold">{$_("invalid-scan")}</p>
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
resetAll();
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
|
|
||||||
>
|
|
||||||
{$_("try_again")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<p>
|
|
||||||
<b>{$_("runner")}:</b>
|
|
||||||
{scaninfo.runner?.firstname}
|
|
||||||
{scaninfo.runner?.lastname}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<b>{$_("laptime")}:</b>
|
|
||||||
{Math.floor(scaninfo.lapTime / 60) +
|
|
||||||
"min " +
|
|
||||||
(Math.floor(scaninfo.lapTime % 60) + "").padStart(2, "0") +
|
|
||||||
"s"}
|
|
||||||
</p>
|
|
||||||
<!-- -->
|
|
||||||
{/if}
|
|
||||||
{#if state.includes("scan_")}
|
|
||||||
{#if scannerActive}
|
|
||||||
<QrCodeScanner
|
|
||||||
:paused={!scannerActive}
|
|
||||||
on:detect={(e) => {
|
|
||||||
if (scannerActive) {
|
|
||||||
if (`${e.detail.decodedText}`.length === 13) {
|
|
||||||
e.detail.decodedText = e.detail.decodedText.substring(
|
|
||||||
0,
|
|
||||||
e.detail.decodedText.length - 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
console.log({ type: "DETECT", code: e.detail.decodedText });
|
|
||||||
handleInput(e.detail.decodedText);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
width={320}
|
|
||||||
height={320}
|
|
||||||
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden"
|
|
||||||
/>
|
|
||||||
<form
|
|
||||||
on:submit={(e) => {
|
|
||||||
handleInput(barcodeInput.value);
|
|
||||||
barcodeInput.value = "";
|
|
||||||
e.preventDefault();
|
|
||||||
}}
|
|
||||||
class="mt-2"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
placeholder={$_("barcode_scanner")}
|
|
||||||
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden mt-2"
|
|
||||||
bind:this={barcodeInput}
|
|
||||||
/>
|
|
||||||
</form>
|
|
||||||
{/if}
|
|
||||||
<!-- -->
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
@ -1,357 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { createEventDispatcher, onMount, tick } from "svelte";
|
|
||||||
|
|
||||||
// Generate a default unique ID
|
|
||||||
function generateDefaultID() {
|
|
||||||
return "virtual-select-" + Math.random().toString(36).slice(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Props
|
|
||||||
export let options = [];
|
|
||||||
export let selected = null;
|
|
||||||
export let inputPlaceholder = "Search options...";
|
|
||||||
export let noOptionsText = "No options found";
|
|
||||||
export let inputAriaLabel = "Search and select an option";
|
|
||||||
export let toggleAriaLabel = "Toggle dropdown";
|
|
||||||
export let clearAriaLabel = "Clear selection";
|
|
||||||
export let filterFn = null; // Custom filter function
|
|
||||||
export let autofocus = false; // Autofocus input
|
|
||||||
export let inputElementID = generateDefaultID(); // Input element ID
|
|
||||||
|
|
||||||
// Internal state
|
|
||||||
let searchTerm = "";
|
|
||||||
let filteredOptions = options;
|
|
||||||
let isOpen = false;
|
|
||||||
let container;
|
|
||||||
let visibleItems = [];
|
|
||||||
let startIndex = 0;
|
|
||||||
let itemHeight = 40; // Fixed height for each option (in pixels)
|
|
||||||
let visibleCount = 10; // Default number of items to render
|
|
||||||
let focusedIndex = -1; // Track the focused option index (-1 means no focus)
|
|
||||||
let inputElement; // Reference to input element
|
|
||||||
|
|
||||||
const dispatch = createEventDispatcher();
|
|
||||||
|
|
||||||
// Filter options based on search term
|
|
||||||
$: {
|
|
||||||
filteredOptions = searchTerm
|
|
||||||
? filterFn
|
|
||||||
? options.filter((option) => filterFn(option, searchTerm))
|
|
||||||
: options.filter((option) =>
|
|
||||||
option.label.toLowerCase().includes(searchTerm.toLowerCase())
|
|
||||||
)
|
|
||||||
: options;
|
|
||||||
// Reset scroll and focus when filtered options change
|
|
||||||
startIndex = 0;
|
|
||||||
focusedIndex = -1;
|
|
||||||
updateVisibleItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update visible items based on scroll position
|
|
||||||
function updateVisibleItems() {
|
|
||||||
if (!container) return;
|
|
||||||
const scrollTop = container.scrollTop;
|
|
||||||
startIndex = Math.floor(scrollTop / itemHeight);
|
|
||||||
const endIndex = Math.min(
|
|
||||||
startIndex + visibleCount,
|
|
||||||
filteredOptions.length
|
|
||||||
);
|
|
||||||
visibleItems = filteredOptions.slice(startIndex, endIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle scroll event
|
|
||||||
function handleScroll() {
|
|
||||||
updateVisibleItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate visible item count based on container height
|
|
||||||
async function updateVisibleCount() {
|
|
||||||
if (container) {
|
|
||||||
await tick(); // Wait for DOM to render
|
|
||||||
visibleCount = Math.ceil(container.clientHeight / itemHeight) + 2; // Buffer of 2 items
|
|
||||||
updateVisibleItems();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle option selection
|
|
||||||
function selectOption(option) {
|
|
||||||
selected = option.value;
|
|
||||||
isOpen = false;
|
|
||||||
searchTerm = option.label; // Set searchTerm to the selected option's label
|
|
||||||
focusedIndex = -1;
|
|
||||||
dispatch("onSelected", option.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle clear selection
|
|
||||||
function clearSelection() {
|
|
||||||
selected = null;
|
|
||||||
searchTerm = "";
|
|
||||||
focusedIndex = -1;
|
|
||||||
dispatch("onSelected", null);
|
|
||||||
dispatch("onClear");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset component state
|
|
||||||
export function reset() {
|
|
||||||
selected = null;
|
|
||||||
searchTerm = "";
|
|
||||||
isOpen = false;
|
|
||||||
focusedIndex = -1;
|
|
||||||
startIndex = 0;
|
|
||||||
updateVisibleItems();
|
|
||||||
dispatch("onSelected", null);
|
|
||||||
dispatch("onClear");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Toggle dropdown
|
|
||||||
async function toggleDropdown() {
|
|
||||||
isOpen = !isOpen;
|
|
||||||
if (isOpen) {
|
|
||||||
forceVisibleItems();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle click outside to close dropdown
|
|
||||||
function handleClickOutside(event) {
|
|
||||||
if (!event.target.closest(".select-container")) {
|
|
||||||
isOpen = false;
|
|
||||||
focusedIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle input focus to open dropdown
|
|
||||||
async function handleInputFocus() {
|
|
||||||
// forceVisibleItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle input typing to open dropdown
|
|
||||||
async function handleInput() {
|
|
||||||
forceVisibleItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
async function forceVisibleItems() {
|
|
||||||
isOpen = true;
|
|
||||||
await updateVisibleCount(); // Ensure items render on focus
|
|
||||||
// these 2 timeouts are a more or less tmp fix for rendering items when dropdown opens
|
|
||||||
setTimeout(async () => {
|
|
||||||
await updateVisibleCount(); // Ensure items render on focus
|
|
||||||
}, 25);
|
|
||||||
setTimeout(async () => {
|
|
||||||
await updateVisibleCount(); // Ensure items render on focus
|
|
||||||
}, 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle keyboard navigation
|
|
||||||
function handleKeydown(event, index) {
|
|
||||||
if (!isOpen) return;
|
|
||||||
|
|
||||||
if (event.key === "ArrowDown") {
|
|
||||||
event.preventDefault();
|
|
||||||
if (focusedIndex < filteredOptions.length - 1) {
|
|
||||||
focusedIndex += 1;
|
|
||||||
scrollToFocusedItem();
|
|
||||||
}
|
|
||||||
} else if (event.key === "ArrowUp") {
|
|
||||||
event.preventDefault();
|
|
||||||
if (focusedIndex > 0) {
|
|
||||||
focusedIndex -= 1;
|
|
||||||
scrollToFocusedItem();
|
|
||||||
} else if (focusedIndex === -1 && filteredOptions.length > 0) {
|
|
||||||
focusedIndex = 0;
|
|
||||||
scrollToFocusedItem();
|
|
||||||
}
|
|
||||||
} else if (event.key === "Enter" && index >= 0) {
|
|
||||||
event.preventDefault();
|
|
||||||
selectOption(filteredOptions[index]);
|
|
||||||
} else if (event.key === "Escape") {
|
|
||||||
event.preventDefault();
|
|
||||||
isOpen = false;
|
|
||||||
focusedIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scroll to the focused item
|
|
||||||
function scrollToFocusedItem() {
|
|
||||||
if (!container || focusedIndex < 0) return;
|
|
||||||
|
|
||||||
const itemTop = focusedIndex * itemHeight;
|
|
||||||
const itemBottom = itemTop + itemHeight;
|
|
||||||
const containerTop = container.scrollTop;
|
|
||||||
const containerBottom = containerTop + container.clientHeight;
|
|
||||||
|
|
||||||
if (itemTop < containerTop) {
|
|
||||||
container.scrollTop = itemTop;
|
|
||||||
} else if (itemBottom > containerBottom) {
|
|
||||||
container.scrollTop = itemBottom - container.clientHeight;
|
|
||||||
}
|
|
||||||
updateVisibleItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize container size observer and autofocus fallback
|
|
||||||
onMount(async () => {
|
|
||||||
if (container) {
|
|
||||||
const resizeObserver = new ResizeObserver(updateVisibleCount);
|
|
||||||
resizeObserver.observe(container);
|
|
||||||
return () => resizeObserver.disconnect();
|
|
||||||
}
|
|
||||||
// Fallback autofocus with tick to ensure inputElement is bound
|
|
||||||
if (autofocus && inputElement) {
|
|
||||||
await tick();
|
|
||||||
inputElement.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Get display text for the input
|
|
||||||
function getDisplayText() {
|
|
||||||
if (!selected) return inputPlaceholder;
|
|
||||||
const selectedOption = options.find((option) => option.value === selected);
|
|
||||||
return selectedOption ? selectedOption.label : inputPlaceholder;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<svelte:window on:click={handleClickOutside} />
|
|
||||||
|
|
||||||
<div class="select-container relative w-full">
|
|
||||||
<!-- Select element with inline search -->
|
|
||||||
<div
|
|
||||||
class="border rounded-md px-3 py-2 bg-white shadow-sm flex items-center gap-2"
|
|
||||||
role="combobox"
|
|
||||||
aria-expanded={isOpen}
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
autocomplete="off"
|
|
||||||
type="text"
|
|
||||||
id={inputElementID}
|
|
||||||
bind:value={searchTerm}
|
|
||||||
bind:this={inputElement}
|
|
||||||
placeholder={getDisplayText()}
|
|
||||||
class="w-full bg-transparent focus:outline-none {selected
|
|
||||||
? 'text-black'
|
|
||||||
: 'text-gray-700'}"
|
|
||||||
{autofocus}
|
|
||||||
on:focus={handleInputFocus}
|
|
||||||
on:input={handleInput}
|
|
||||||
on:keydown={(e) => {
|
|
||||||
if (e.key === "Enter" && !isOpen) {
|
|
||||||
toggleDropdown();
|
|
||||||
} else {
|
|
||||||
handleKeydown(e, focusedIndex);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
aria-label={inputAriaLabel}
|
|
||||||
/>
|
|
||||||
{#if selected}
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="w-5 h-5 flex items-center justify-center text-gray-500 hover:text-gray-700"
|
|
||||||
on:click={clearSelection}
|
|
||||||
on:keydown={(e) => {
|
|
||||||
if (e.key === "Enter" || e.key === " ") {
|
|
||||||
e.preventDefault();
|
|
||||||
clearSelection();
|
|
||||||
} else if (e.key === "Escape") {
|
|
||||||
e.preventDefault();
|
|
||||||
isOpen = false;
|
|
||||||
focusedIndex = -1;
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
role="button"
|
|
||||||
tabindex="0"
|
|
||||||
aria-label={clearAriaLabel}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
class="w-4 h-4"
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
d="M6 18L18 6M6 6l12 12"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
{/if}
|
|
||||||
<svg
|
|
||||||
class="w-4 h-4 text-gray-500 transform {isOpen ? 'rotate-180' : ''}"
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
on:click={toggleDropdown}
|
|
||||||
role="button"
|
|
||||||
tabindex="0"
|
|
||||||
on:keydown={(e) => {
|
|
||||||
if (e.key === "Enter") toggleDropdown();
|
|
||||||
else if (e.key === "Escape") {
|
|
||||||
e.preventDefault();
|
|
||||||
isOpen = false;
|
|
||||||
focusedIndex = -1;
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
aria-label={toggleAriaLabel}
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke
|
|
||||||
Politeness="round"
|
|
||||||
stroke-width="2"
|
|
||||||
d="M19 9l-7 7-7-7"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Dropdown -->
|
|
||||||
{#if isOpen}
|
|
||||||
<div
|
|
||||||
class="absolute z-10 w-full mt-1 bg-white border rounded-md shadow-lg max-h-80 overflow-auto"
|
|
||||||
bind:this={container}
|
|
||||||
on:scroll={handleScroll}
|
|
||||||
role="listbox"
|
|
||||||
>
|
|
||||||
{#if filteredOptions.length > 0}
|
|
||||||
<!-- Virtualized list container -->
|
|
||||||
<div style="height: {filteredOptions.length * itemHeight}px;">
|
|
||||||
<div style="transform: translateY({startIndex * itemHeight}px);">
|
|
||||||
{#each visibleItems as item, i (item.label + "-" + (startIndex + i))}
|
|
||||||
<div
|
|
||||||
class="px-3 py-2 hover:bg-blue-100 cursor-pointer {selected ===
|
|
||||||
item.value
|
|
||||||
? 'bg-blue-50'
|
|
||||||
: ''} {focusedIndex === startIndex + i
|
|
||||||
? 'bg-blue-200 outline outline-2 outline-blue-500'
|
|
||||||
: ''}"
|
|
||||||
on:click={() => selectOption(item)}
|
|
||||||
on:keydown={(e) => handleKeydown(e, startIndex + i)}
|
|
||||||
role="option"
|
|
||||||
tabindex="0"
|
|
||||||
aria-selected={selected === item.value}
|
|
||||||
>
|
|
||||||
{item.label}
|
|
||||||
</div>
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<div class="px-3 py-2 text-gray-500">{noOptionsText}</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
/* Ensure Tailwind classes handle additional styling */
|
|
||||||
:global(.select-container input:focus) {
|
|
||||||
border-color: #3b82f6; /* Tailwind's blue-500 */
|
|
||||||
}
|
|
||||||
:global([role="option"]:focus) {
|
|
||||||
outline: 2px solid #3b82f6;
|
|
||||||
outline-offset: -2px;
|
|
||||||
}
|
|
||||||
:global([role="button"]:focus) {
|
|
||||||
outline: 2px solid #3b82f6;
|
|
||||||
outline-offset: -2px;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -87,7 +87,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -98,7 +98,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="none"
|
fill="none"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -230,7 +230,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -259,7 +259,7 @@
|
|||||||
{:catch error}
|
{:catch error}
|
||||||
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
<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">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
aria-hidden="true">​</span
|
aria-hidden="true">​</span
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10"
|
class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw]"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-labelledby="modal-headline"
|
aria-labelledby="modal-headline"
|
||||||
@ -115,7 +115,7 @@
|
|||||||
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
class="size-6 text-blue-600"
|
class="h-6 w-6 text-blue-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
@ -287,7 +287,7 @@
|
|||||||
modal_open = false;
|
modal_open = false;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="cancel_modal_button"
|
class="w-full 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 hidden lg:block"
|
||||||
>
|
>
|
||||||
{$_("cancel")}
|
{$_("cancel")}
|
||||||
</button>
|
</button>
|
||||||
|
@ -192,7 +192,7 @@
|
|||||||
name="enabled"
|
name="enabled"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={editable_userdata.enabled}
|
checked={editable_userdata.enabled}
|
||||||
class="focus:ring-indigo-500 size-4 text-indigo-600 border-gray-300 rounded"
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
|
||||||
/>
|
/>
|
||||||
{$_("set-the-user-active-inactive")}
|
{$_("set-the-user-active-inactive")}
|
||||||
</p>
|
</p>
|
||||||
|
@ -182,7 +182,7 @@
|
|||||||
{:catch error}
|
{:catch error}
|
||||||
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
<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">
|
<span class="inline-block align-middle mr-8">
|
||||||
<b>{$_("general_promise_error")}</b>
|
<b class="capitalize">{$_("general_promise_error")}</b>
|
||||||
{error}
|
{error}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -41,8 +41,6 @@
|
|||||||
"already-paid": "Bereits bezahlt",
|
"already-paid": "Bereits bezahlt",
|
||||||
"amount": "Anzahl",
|
"amount": "Anzahl",
|
||||||
"amount-per-kilometer": "Betrag pro Kilometer",
|
"amount-per-kilometer": "Betrag pro Kilometer",
|
||||||
"anonyme_spende": "Anonyme Spende",
|
|
||||||
"anonymer_sponsor": "👻 Anonym",
|
|
||||||
"apartment-suite-etc": "Apartment, Wohnung, etc.",
|
"apartment-suite-etc": "Apartment, Wohnung, etc.",
|
||||||
"api-endpoint": "API-Endpunkt",
|
"api-endpoint": "API-Endpunkt",
|
||||||
"application_name": "Lauf für Kaya! - Admin",
|
"application_name": "Lauf für Kaya! - Admin",
|
||||||
@ -52,7 +50,6 @@
|
|||||||
"available-permissions": "Verfügbar",
|
"available-permissions": "Verfügbar",
|
||||||
"average-distance": "∅ Strecke/Läufer",
|
"average-distance": "∅ Strecke/Läufer",
|
||||||
"average-donation": "∅ Sponsoring",
|
"average-donation": "∅ Sponsoring",
|
||||||
"barcode_scanner": "Scannen mit Handscanner",
|
|
||||||
"by": "von",
|
"by": "von",
|
||||||
"cancel": "Abbrechen",
|
"cancel": "Abbrechen",
|
||||||
"cancel-delete": "Löschen abbrechen",
|
"cancel-delete": "Löschen abbrechen",
|
||||||
@ -66,11 +63,7 @@
|
|||||||
"card": "Läuferkarte",
|
"card": "Läuferkarte",
|
||||||
"card-added": "Karte wurde erstellt",
|
"card-added": "Karte wurde erstellt",
|
||||||
"card-deleted": "Karte gelöscht",
|
"card-deleted": "Karte gelöscht",
|
||||||
"card-replacement-menu": "Karte ersetzen",
|
|
||||||
"card-updated": "Karte aktualisiert",
|
"card-updated": "Karte aktualisiert",
|
||||||
"card_assignment_for_mobile": "Mobile Kartenzuweisung",
|
|
||||||
"card_assignment_menu": "Kartenzuweisung",
|
|
||||||
"card_not_found": "Läuferkarte nicht gefunden...",
|
|
||||||
"cards": "Läuferkarten",
|
"cards": "Läuferkarten",
|
||||||
"cards-deleted": "Karten gelöscht",
|
"cards-deleted": "Karten gelöscht",
|
||||||
"certificates": "Urkunden",
|
"certificates": "Urkunden",
|
||||||
@ -81,7 +74,6 @@
|
|||||||
"click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren",
|
"click-to-copy-token-to-clipboard": "Klicke auf den Token, um ihn in deine Zwischenablage zu kopieren",
|
||||||
"close": "Schließen",
|
"close": "Schließen",
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"code_128_barcode": "Code 128 Barcode",
|
|
||||||
"config-codes": "Konfigurations-Codes",
|
"config-codes": "Konfigurations-Codes",
|
||||||
"confirm": "Bestätigen",
|
"confirm": "Bestätigen",
|
||||||
"confirm-delete": "Löschung Bestätigen",
|
"confirm-delete": "Löschung Bestätigen",
|
||||||
@ -134,7 +126,6 @@
|
|||||||
"created-blanco-cards": "Blankokarten wurden erstellt",
|
"created-blanco-cards": "Blankokarten wurden erstellt",
|
||||||
"created_via": "Erstellt von",
|
"created_via": "Erstellt von",
|
||||||
"creating-blanco-cards": "Erstelle Blankokarten",
|
"creating-blanco-cards": "Erstelle Blankokarten",
|
||||||
"creating-donation": "Sponsoring wird erstellt...",
|
|
||||||
"credits": "Credits",
|
"credits": "Credits",
|
||||||
"csv_import__class": "Klasse",
|
"csv_import__class": "Klasse",
|
||||||
"csv_import__firstname": "Vorname",
|
"csv_import__firstname": "Vorname",
|
||||||
@ -198,16 +189,12 @@
|
|||||||
"documentation": "Dokumentation",
|
"documentation": "Dokumentation",
|
||||||
"donation-amount": "Sponsoringbetrag",
|
"donation-amount": "Sponsoringbetrag",
|
||||||
"donation-amount-must-be-greater-that-0-00eur": "Der Sponsoringbetrag muss größer als 0.00€ sein.",
|
"donation-amount-must-be-greater-that-0-00eur": "Der Sponsoringbetrag muss größer als 0.00€ sein.",
|
||||||
"donation-created": "Sponsoring erstellt",
|
|
||||||
"donation-created-successfully": "Sponsoring erstellt",
|
|
||||||
"donation-deleted": "Sponsoring gelöscht",
|
"donation-deleted": "Sponsoring gelöscht",
|
||||||
"donation-quick-add": "Sponsoringschnelleingabe",
|
|
||||||
"donation-updated": "Sponsoring wurde aktualisiert",
|
"donation-updated": "Sponsoring wurde aktualisiert",
|
||||||
"donation_added": "Sponsoring hinzugefügt",
|
"donation_added": "Sponsoring hinzugefügt",
|
||||||
"donations": "Sponsorings",
|
"donations": "Sponsorings",
|
||||||
"donations-are-being-loaded": "Sponsorings werden geladen...",
|
"donations-are-being-loaded": "Sponsorings werden geladen...",
|
||||||
"done": "✅ Fertig",
|
"donor": "Sponsor",
|
||||||
"donor": "Sponsor:in",
|
|
||||||
"donor-added": "Sponsor hinzugefügt",
|
"donor-added": "Sponsor hinzugefügt",
|
||||||
"donor-deleted": "Sponsor gelöscht",
|
"donor-deleted": "Sponsor gelöscht",
|
||||||
"donor-has-no-associated-donations": "Keine Sponsorings",
|
"donor-has-no-associated-donations": "Keine Sponsorings",
|
||||||
@ -227,17 +214,11 @@
|
|||||||
"enabled_large": "Aktiviert",
|
"enabled_large": "Aktiviert",
|
||||||
"english": "Englisch",
|
"english": "Englisch",
|
||||||
"enter-payment": "Zahlung eingeben",
|
"enter-payment": "Zahlung eingeben",
|
||||||
"error-creating-donation": "Fehler beim Erstellen des Sponsorings",
|
|
||||||
"error-during-import": "Fehler beim Importieren",
|
"error-during-import": "Fehler beim Importieren",
|
||||||
"error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage",
|
"error-whyile-copying-to-clipboard": "Fehler beim Kopieren in die Zwischenablage",
|
||||||
"error_on_login": "😢Fehler beim Login",
|
"error_on_login": "😢Fehler beim Login",
|
||||||
"everything-concerning-your-profile": "Alles zu deinem Profil",
|
"everything-concerning-your-profile": "Alles zu deinem Profil",
|
||||||
"exclude_0m_runners_certificate": "ohne 0m Läufer",
|
|
||||||
"existing-donor": "Existierende Sponsor:in",
|
|
||||||
"faq": "FAQ",
|
"faq": "FAQ",
|
||||||
"fast_card_replacement": "Karten-Schnellzusweisung (Mit Mobilgeräteunterstützung)",
|
|
||||||
"fast_donation_create": "Sponsoring-Schnellanlage",
|
|
||||||
"festbetrag": "Festbetrag",
|
|
||||||
"filename_sponsoringquittungsliste": "SponsoringQuittungsListe",
|
"filename_sponsoringquittungsliste": "SponsoringQuittungsListe",
|
||||||
"filter-by-organization-team": "Filtern nach Organisation / Team",
|
"filter-by-organization-team": "Filtern nach Organisation / Team",
|
||||||
"first-name": "Vorname",
|
"first-name": "Vorname",
|
||||||
@ -273,6 +254,7 @@
|
|||||||
"import-runners": "Läufer importieren",
|
"import-runners": "Läufer importieren",
|
||||||
"import__target-organization": "Ziel Organisation",
|
"import__target-organization": "Ziel Organisation",
|
||||||
"imprint": "Impressum ",
|
"imprint": "Impressum ",
|
||||||
|
"imprint-loading": "Impressum lädt...",
|
||||||
"inactive": "Inaktiv",
|
"inactive": "Inaktiv",
|
||||||
"inherited-permissions": "geerbte",
|
"inherited-permissions": "geerbte",
|
||||||
"installed-version": "Installierte Version",
|
"installed-version": "Installierte Version",
|
||||||
@ -283,7 +265,6 @@
|
|||||||
"key": "Schlüssel",
|
"key": "Schlüssel",
|
||||||
"laeufer-hinzufuegen": "Läufer hinzufügen",
|
"laeufer-hinzufuegen": "Läufer hinzufügen",
|
||||||
"laptime": "Rundenzeit",
|
"laptime": "Rundenzeit",
|
||||||
"last-created-donation": "Zuletzt erstellt",
|
|
||||||
"last-name": "Nachname",
|
"last-name": "Nachname",
|
||||||
"last-name-is-required": "Nachname muss angegeben werden",
|
"last-name-is-required": "Nachname muss angegeben werden",
|
||||||
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
|
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
|
||||||
@ -305,20 +286,16 @@
|
|||||||
"logout": "Abmelden",
|
"logout": "Abmelden",
|
||||||
"mail-validation-in-progress": "E-Mail Verifizierung läuft... ",
|
"mail-validation-in-progress": "E-Mail Verifizierung läuft... ",
|
||||||
"manage-admin-users": "Nutzer verwalten",
|
"manage-admin-users": "Nutzer verwalten",
|
||||||
"management": "Verwaltung",
|
|
||||||
"middle-name": "Mittelname",
|
"middle-name": "Mittelname",
|
||||||
"minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)",
|
"minimum-lap-time-in-s": "Minimale Rundenzeit (in Sekunden)",
|
||||||
"minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein",
|
"minimum-lap-time-must-be-a-positive-number-or-0": "Die minimale Rundenzeit muss eine positive Zahl oder 0 sein",
|
||||||
"mobile-scanclient": "Mobiler Scanclient",
|
|
||||||
"must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!",
|
"must-be-at-least-10-characters-long": "Passwort muss mindestens 10 Zeichen lang sein!",
|
||||||
"must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!",
|
"must-contain-a-lowercase-letter": "Passwort muss einen Großbuchstaben enthalten!",
|
||||||
"must-contain-a-number": "Passwort muss eine Zahl enthalten!",
|
"must-contain-a-number": "Passwort muss eine Zahl enthalten!",
|
||||||
"must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!",
|
"must-contain-a-uppercase-letter": "Passwort muss einen Kleinbuchstaben enthalten!",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"name-is-required": "Der Gruppenname muss angegeben werden",
|
"name-is-required": "Der Gruppenname muss angegeben werden",
|
||||||
"new-donor": "Neue Sponsor:in",
|
|
||||||
"new-password": "Neues Passwort",
|
"new-password": "Neues Passwort",
|
||||||
"next_runner": "Nächster Läufer",
|
|
||||||
"no-address": "Keine Adresse hinterlegt",
|
"no-address": "Keine Adresse hinterlegt",
|
||||||
"no-contact-found": "Keine Kontakte gefunden",
|
"no-contact-found": "Keine Kontakte gefunden",
|
||||||
"no-contact-selected": "Kein Kontakt ausgewählt",
|
"no-contact-selected": "Kein Kontakt ausgewählt",
|
||||||
@ -380,43 +357,37 @@
|
|||||||
"please-provide-the-required-information-to-create-a-new-statsclient": "Bitte gebe alle für einen Statsclient notwendigen Informationen an",
|
"please-provide-the-required-information-to-create-a-new-statsclient": "Bitte gebe alle für einen Statsclient notwendigen Informationen an",
|
||||||
"please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...",
|
"please-request-a-new-reset-mail": "Bitte eine neue Passwortreset-Mail anfordern...",
|
||||||
"please-wait-a-moment-your-login-is-still-being-processed": "Bitte warte einen Moment, deine Anmeldung wird verarbeitet",
|
"please-wait-a-moment-your-login-is-still-being-processed": "Bitte warte einen Moment, deine Anmeldung wird verarbeitet",
|
||||||
"please_wait_a_moment_while_we_assign_the_card": "Karte wird zugewiesen...",
|
|
||||||
"prefix": "Prefix",
|
"prefix": "Prefix",
|
||||||
"privacy": "Datenschutz",
|
"privacy": "Datenschutz",
|
||||||
|
"privacy-loading": "Datenschutzerklärung lädt...",
|
||||||
"profile": "Profil",
|
"profile": "Profil",
|
||||||
"profile-deleted": "Profil gelöscht!",
|
"profile-deleted": "Profil gelöscht!",
|
||||||
"profile-picture": "Profilbild",
|
"profile-picture": "Profilbild",
|
||||||
"profile-updated": "Profil wurde aktualisiert!",
|
"profile-updated": "Profil wurde aktualisiert!",
|
||||||
"quick-tools": "Werkzeuge",
|
|
||||||
"read-license": "Lizenz-Text lesen",
|
"read-license": "Lizenz-Text lesen",
|
||||||
"receipt-needed": "Spendenquittung benötigt",
|
"receipt-needed": "Spendenquittung benötigt",
|
||||||
"repo_link": "Link",
|
"repo_link": "Link",
|
||||||
"request-a-new-reset-mail": "Neue Reset-Mail anfordern",
|
"request-a-new-reset-mail": "Neue Reset-Mail anfordern",
|
||||||
"reset-my-password": "Passwort zurücksetzen",
|
"reset-my-password": "Passwort zurücksetzen",
|
||||||
"reset-password": "Passwort zurücksetzen",
|
"reset-password": "Passwort zurücksetzen",
|
||||||
"runner": "Läufer:in",
|
"runner": "Läufer",
|
||||||
"runner-added": "Läufer hinzugefügt",
|
"runner-added": "Läufer hinzugefügt",
|
||||||
"runner-deleted": "Läufer gelöscht",
|
"runner-deleted": "Läufer gelöscht",
|
||||||
"runner-import": "Läufer Import",
|
"runner-import": "Läufer Import",
|
||||||
"runner-is-being-added": "Läufer wird hinzugefügt...",
|
"runner-is-being-added": "Läufer wird hinzugefügt...",
|
||||||
"runner-updated": "Läufer aktualisiert!",
|
"runner-updated": "Läufer aktualisiert!",
|
||||||
"runner_not_found": "Läufer nicht gefunden...",
|
|
||||||
"runner_via_selfservice": "Läufer via Selfservice",
|
"runner_via_selfservice": "Läufer via Selfservice",
|
||||||
"runnercards": "Laeuferkarten",
|
"runnercards": "Laeuferkarten",
|
||||||
"runnerimport_verify_runners_org": "Bitte die Läufer für den Import in die Organisation \"{org_name}\" bestätigen",
|
"runnerimport_verify_runners_org": "Bitte die Läufer für den Import in die Organisation \"{org_name}\" bestätigen",
|
||||||
"runners": "Läufer",
|
"runners": "Läufer",
|
||||||
"runners-are-being-imported": "Läufer werden importiert ...",
|
"runners-are-being-imported": "Läufer werden importiert ...",
|
||||||
"runners-are-being-loaded": "Läufer werden geladen ...",
|
"runners-are-being-loaded": "Läufer werden geladen ...",
|
||||||
"runners_via_kiosk": "Läufer via Kiosk",
|
|
||||||
"save": "Speichern",
|
"save": "Speichern",
|
||||||
"save-changes": "Änderungen speichern",
|
"save-changes": "Änderungen speichern",
|
||||||
"scan-added": "Scan hinzugefügt",
|
"scan-added": "Scan hinzugefügt",
|
||||||
"scan-deleted": "Scan gelöscht",
|
"scan-deleted": "Scan gelöscht",
|
||||||
"scan-is-being-updated": "Scan wird aktualisiert",
|
"scan-is-being-updated": "Scan wird aktualisiert",
|
||||||
"scan-with-fixed-distance": "Scan mit Festdistanz",
|
"scan-with-fixed-distance": "Scan mit Festdistanz",
|
||||||
"scan_card": "Läuferkarte scannen",
|
|
||||||
"scan_runner": "Läufer scannen",
|
|
||||||
"scanclient": "Scanclient",
|
|
||||||
"scans": "Scans",
|
"scans": "Scans",
|
||||||
"scans-are-being-loaded": "Scans werden geladen",
|
"scans-are-being-loaded": "Scans werden geladen",
|
||||||
"scanstation": "Scanner Station",
|
"scanstation": "Scanner Station",
|
||||||
@ -426,21 +397,17 @@
|
|||||||
"scanstations-are-being-loaded": "Scannerstationen werden geladen...",
|
"scanstations-are-being-loaded": "Scannerstationen werden geladen...",
|
||||||
"search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder #ID)",
|
"search-for-an-organization-by-name-or-id": "Suche eine Organisation (via Name oder #ID)",
|
||||||
"search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder #ID)",
|
"search-for-an-organization-or-team-by-name-or-id": "Suche eine Organisation oder ein Team (via Name oder #ID)",
|
||||||
"search-for-donor": "Nach Sponsor:in suchen",
|
|
||||||
"search-for-donor-name-or-id": "Suche eine Sponsor (via Name oder #ID)",
|
"search-for-donor-name-or-id": "Suche eine Sponsor (via Name oder #ID)",
|
||||||
"search-for-permission": "Berechtigungen durchsuchen",
|
"search-for-permission": "Berechtigungen durchsuchen",
|
||||||
"search-for-runner-by-name-or-id": "Suche einen Läufer (via Name oder #ID)",
|
"search-for-runner-by-name-or-id": "Suche einen Läufer (via Name oder #ID)",
|
||||||
"select-all": "Alle auswählen",
|
"select-all": "Alle auswählen",
|
||||||
"select-language": "Sprache auswählen",
|
"select-language": "Sprache auswählen",
|
||||||
"select-runner": "Läuferin auswählen",
|
|
||||||
"selfservice-registration": "Selfservice Registrierung",
|
"selfservice-registration": "Selfservice Registrierung",
|
||||||
"selfservice_qr_registration_barcode": "Kiosk QR/ Selfservice Barcode",
|
|
||||||
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
|
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
|
||||||
"set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen",
|
"set-the-user-active-inactive": "Den Benutzer auf (in)aktiv setzen",
|
||||||
"settings": "Einstellungen",
|
"settings": "Einstellungen",
|
||||||
"settings-for-your-profile": "Die Einstellungen deines Accounts",
|
"settings-for-your-profile": "Die Einstellungen deines Accounts",
|
||||||
"something-about-the-group": "Infos zur Gruppe",
|
"something-about-the-group": "Infos zur Gruppe",
|
||||||
"spende_pro_km": "Spende pro km",
|
|
||||||
"sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen",
|
"sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen",
|
||||||
"sponsorings": "Sponsoringerklaerungen",
|
"sponsorings": "Sponsoringerklaerungen",
|
||||||
"station-deleted": "Scannerstation gelöscht",
|
"station-deleted": "Scannerstation gelöscht",
|
||||||
@ -454,7 +421,6 @@
|
|||||||
"status": "Status",
|
"status": "Status",
|
||||||
"stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können",
|
"stuff-that-could-harm-your-profile": "Einstellungen, die deinem Profil nachhaltig schaden können",
|
||||||
"successful-password-reset": "Passwort erfolgreich zurückgesetzt!",
|
"successful-password-reset": "Passwort erfolgreich zurückgesetzt!",
|
||||||
"system": "System",
|
|
||||||
"team": "Team",
|
"team": "Team",
|
||||||
"team-added": "Team wurde erstellt",
|
"team-added": "Team wurde erstellt",
|
||||||
"team-deleted": "Team gelöscht",
|
"team-deleted": "Team gelöscht",
|
||||||
@ -505,7 +471,6 @@
|
|||||||
"track-updated": "Laufstrecke aktualisiert",
|
"track-updated": "Laufstrecke aktualisiert",
|
||||||
"track-was-updated": "Laufstrecke wurde aktualisiert",
|
"track-was-updated": "Laufstrecke wurde aktualisiert",
|
||||||
"tracks": "Laufstrecken",
|
"tracks": "Laufstrecken",
|
||||||
"try_again": "erneut versuchen",
|
|
||||||
"unpaid": "Offen",
|
"unpaid": "Offen",
|
||||||
"update-card": "Karte aktualisieren",
|
"update-card": "Karte aktualisieren",
|
||||||
"update-password": "Passwort ändern",
|
"update-password": "Passwort ändern",
|
||||||
|
@ -41,8 +41,6 @@
|
|||||||
"already-paid": "Already paid",
|
"already-paid": "Already paid",
|
||||||
"amount": "Amount",
|
"amount": "Amount",
|
||||||
"amount-per-kilometer": "Amount per kilometer",
|
"amount-per-kilometer": "Amount per kilometer",
|
||||||
"anonyme_spende": "Anonymous",
|
|
||||||
"anonymer_sponsor": "👻 Anonymous",
|
|
||||||
"apartment-suite-etc": "Apartment, suite, etc.",
|
"apartment-suite-etc": "Apartment, suite, etc.",
|
||||||
"api-endpoint": "API-Endpoint",
|
"api-endpoint": "API-Endpoint",
|
||||||
"application_name": "Lauf für Kaya! - Admin",
|
"application_name": "Lauf für Kaya! - Admin",
|
||||||
@ -51,8 +49,7 @@
|
|||||||
"author": "Author",
|
"author": "Author",
|
||||||
"available-permissions": "available",
|
"available-permissions": "available",
|
||||||
"average-distance": "∅ distance",
|
"average-distance": "∅ distance",
|
||||||
"average-donation": "∅ Donation",
|
"average-donation": "∅ donation",
|
||||||
"barcode_scanner": "Scan via barcode scanner",
|
|
||||||
"by": "by",
|
"by": "by",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"cancel-delete": "Cancel Delete",
|
"cancel-delete": "Cancel Delete",
|
||||||
@ -66,11 +63,7 @@
|
|||||||
"card": "card",
|
"card": "card",
|
||||||
"card-added": "Card added",
|
"card-added": "Card added",
|
||||||
"card-deleted": "Card deleted",
|
"card-deleted": "Card deleted",
|
||||||
"card-replacement-menu": "Replace card",
|
|
||||||
"card-updated": "Card updated",
|
"card-updated": "Card updated",
|
||||||
"card_assignment_for_mobile": "Card Assignment for Mobile",
|
|
||||||
"card_assignment_menu": "Card Assignment",
|
|
||||||
"card_not_found": "Card not found...",
|
|
||||||
"cards": "Cards",
|
"cards": "Cards",
|
||||||
"cards-deleted": "Cards deleted",
|
"cards-deleted": "Cards deleted",
|
||||||
"certificates": "Certificates",
|
"certificates": "Certificates",
|
||||||
@ -81,7 +74,6 @@
|
|||||||
"click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard",
|
"click-to-copy-token-to-clipboard": "Click to copy the token to your clipboard",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"code_128_barcode": "Code 128 Barcode",
|
|
||||||
"config-codes": "Config codes",
|
"config-codes": "Config codes",
|
||||||
"confirm": "Confirm",
|
"confirm": "Confirm",
|
||||||
"confirm-delete": "Confirm Delete",
|
"confirm-delete": "Confirm Delete",
|
||||||
@ -134,7 +126,6 @@
|
|||||||
"created-blanco-cards": "Created blanco cards",
|
"created-blanco-cards": "Created blanco cards",
|
||||||
"created_via": "Erstellt über",
|
"created_via": "Erstellt über",
|
||||||
"creating-blanco-cards": "Creating blanco cards",
|
"creating-blanco-cards": "Creating blanco cards",
|
||||||
"creating-donation": "Creating donation...",
|
|
||||||
"credits": "Credits",
|
"credits": "Credits",
|
||||||
"csv_import__class": "Class",
|
"csv_import__class": "Class",
|
||||||
"csv_import__firstname": "Firstname",
|
"csv_import__firstname": "Firstname",
|
||||||
@ -198,15 +189,11 @@
|
|||||||
"documentation": "Documentation",
|
"documentation": "Documentation",
|
||||||
"donation-amount": "Donation amount",
|
"donation-amount": "Donation amount",
|
||||||
"donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€",
|
"donation-amount-must-be-greater-that-0-00eur": "Donation amount must be greater that 0.00€",
|
||||||
"donation-created": "Created sponsoring",
|
|
||||||
"donation-created-successfully": "Donation created",
|
|
||||||
"donation-deleted": "Donation deleted",
|
"donation-deleted": "Donation deleted",
|
||||||
"donation-quick-add": "Mass sponsoring creation",
|
|
||||||
"donation-updated": "Donation updated",
|
"donation-updated": "Donation updated",
|
||||||
"donation_added": "Donation_added",
|
"donation_added": "Donation_added",
|
||||||
"donations": "Donations",
|
"donations": "Donations",
|
||||||
"donations-are-being-loaded": "donations are being loaded",
|
"donations-are-being-loaded": "donations are being loaded",
|
||||||
"done": "✅ Done",
|
|
||||||
"donor": "Donor",
|
"donor": "Donor",
|
||||||
"donor-added": "Donor added",
|
"donor-added": "Donor added",
|
||||||
"donor-deleted": "donor deleted",
|
"donor-deleted": "donor deleted",
|
||||||
@ -227,17 +214,11 @@
|
|||||||
"enabled_large": "Enabled",
|
"enabled_large": "Enabled",
|
||||||
"english": "English",
|
"english": "English",
|
||||||
"enter-payment": "Enter payment",
|
"enter-payment": "Enter payment",
|
||||||
"error-creating-donation": "error creating the sponsoring",
|
|
||||||
"error-during-import": "Error during import",
|
"error-during-import": "Error during import",
|
||||||
"error-whyile-copying-to-clipboard": "Error while copying to clipboard",
|
"error-whyile-copying-to-clipboard": "Error while copying to clipboard",
|
||||||
"error_on_login": "Error on login",
|
"error_on_login": "Error on login",
|
||||||
"everything-concerning-your-profile": "Everything concerning your profile",
|
"everything-concerning-your-profile": "Everything concerning your profile",
|
||||||
"exclude_0m_runners_certificate": "exclude runners without scans",
|
|
||||||
"existing-donor": "Existing Donor",
|
|
||||||
"faq": "FAQ",
|
"faq": "FAQ",
|
||||||
"fast_card_replacement": "Fast card replacement (with mobile support)",
|
|
||||||
"fast_donation_create": "Mass donation creator",
|
|
||||||
"festbetrag": "Fixed amount",
|
|
||||||
"filename_sponsoringquittungsliste": "DonorReceiptList",
|
"filename_sponsoringquittungsliste": "DonorReceiptList",
|
||||||
"filter-by-organization-team": "Filter by Organization/ Team",
|
"filter-by-organization-team": "Filter by Organization/ Team",
|
||||||
"first-name": "First name",
|
"first-name": "First name",
|
||||||
@ -273,6 +254,7 @@
|
|||||||
"import-runners": "Import runners",
|
"import-runners": "Import runners",
|
||||||
"import__target-organization": "Target Organization",
|
"import__target-organization": "Target Organization",
|
||||||
"imprint": "Imprint",
|
"imprint": "Imprint",
|
||||||
|
"imprint-loading": "Imprint loading...",
|
||||||
"inactive": "Inactive",
|
"inactive": "Inactive",
|
||||||
"inherited-permissions": "inherited",
|
"inherited-permissions": "inherited",
|
||||||
"installed-version": "Installed version",
|
"installed-version": "Installed version",
|
||||||
@ -283,7 +265,6 @@
|
|||||||
"key": "Key",
|
"key": "Key",
|
||||||
"laeufer-hinzufuegen": "Add runner",
|
"laeufer-hinzufuegen": "Add runner",
|
||||||
"laptime": "Laptime",
|
"laptime": "Laptime",
|
||||||
"last-created-donation": "Last created",
|
|
||||||
"last-name": "Last name",
|
"last-name": "Last name",
|
||||||
"last-name-is-required": "Last Name is required",
|
"last-name-is-required": "Last Name is required",
|
||||||
"lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.",
|
"lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.",
|
||||||
@ -308,16 +289,13 @@
|
|||||||
"middle-name": "Middle name",
|
"middle-name": "Middle name",
|
||||||
"minimum-lap-time-in-s": "minimum lap time in s",
|
"minimum-lap-time-in-s": "minimum lap time in s",
|
||||||
"minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0",
|
"minimum-lap-time-must-be-a-positive-number-or-0": "minimum lap time must be a positive number or 0",
|
||||||
"mobile-scanclient": "Mobile scanclient",
|
|
||||||
"must-be-at-least-10-characters-long": "Must be at least 10 characters long!",
|
"must-be-at-least-10-characters-long": "Must be at least 10 characters long!",
|
||||||
"must-contain-a-lowercase-letter": "Must contain a lowercase letter!",
|
"must-contain-a-lowercase-letter": "Must contain a lowercase letter!",
|
||||||
"must-contain-a-number": "Must contain a number!",
|
"must-contain-a-number": "Must contain a number!",
|
||||||
"must-contain-a-uppercase-letter": "Must contain a uppercase letter!",
|
"must-contain-a-uppercase-letter": "Must contain a uppercase letter!",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"name-is-required": "Name is required",
|
"name-is-required": "Name is required",
|
||||||
"new-donor": "New donor",
|
|
||||||
"new-password": "New password",
|
"new-password": "New password",
|
||||||
"next_runner": "Next Runner",
|
|
||||||
"no-address": "no address",
|
"no-address": "no address",
|
||||||
"no-contact-found": "No contacts found",
|
"no-contact-found": "No contacts found",
|
||||||
"no-contact-selected": "No contact selected",
|
"no-contact-selected": "No contact selected",
|
||||||
@ -379,14 +357,13 @@
|
|||||||
"please-provide-the-required-information-to-create-a-new-statsclient": "Please provide the required information to create a new statsclient",
|
"please-provide-the-required-information-to-create-a-new-statsclient": "Please provide the required information to create a new statsclient",
|
||||||
"please-request-a-new-reset-mail": "Please request a new reset mail...",
|
"please-request-a-new-reset-mail": "Please request a new reset mail...",
|
||||||
"please-wait-a-moment-your-login-is-still-being-processed": "Please wait a moment, your login is still being processed",
|
"please-wait-a-moment-your-login-is-still-being-processed": "Please wait a moment, your login is still being processed",
|
||||||
"please_wait_a_moment_while_we_assign_the_card": "Please wait a moment while we assign the card...",
|
|
||||||
"prefix": "Prefix",
|
"prefix": "Prefix",
|
||||||
"privacy": "Privacy",
|
"privacy": "Privacy",
|
||||||
|
"privacy-loading": "Privacy loading...",
|
||||||
"profile": "Profile",
|
"profile": "Profile",
|
||||||
"profile-deleted": "Profile deleted!",
|
"profile-deleted": "Profile deleted!",
|
||||||
"profile-picture": "Profile Picture",
|
"profile-picture": "Profile Picture",
|
||||||
"profile-updated": "Profile updated!",
|
"profile-updated": "Profile updated!",
|
||||||
"quick-tools": "Tools",
|
|
||||||
"read-license": "Read License",
|
"read-license": "Read License",
|
||||||
"receipt-needed": "Receipt needed",
|
"receipt-needed": "Receipt needed",
|
||||||
"repo_link": "Link",
|
"repo_link": "Link",
|
||||||
@ -399,23 +376,18 @@
|
|||||||
"runner-import": "Runner Import",
|
"runner-import": "Runner Import",
|
||||||
"runner-is-being-added": "Runner is being added...",
|
"runner-is-being-added": "Runner is being added...",
|
||||||
"runner-updated": "Runner updated!",
|
"runner-updated": "Runner updated!",
|
||||||
"runner_not_found": "Runner not found...",
|
"runner_via_selfservice": "Runner via Selfservice",
|
||||||
"runner_via_selfservice": "Runners via Selfservice",
|
|
||||||
"runnercards": "Runnercards",
|
"runnercards": "Runnercards",
|
||||||
"runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"",
|
"runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"",
|
||||||
"runners": "Runners",
|
"runners": "Runners",
|
||||||
"runners-are-being-imported": "Runners are being imported...",
|
"runners-are-being-imported": "Runners are being imported...",
|
||||||
"runners-are-being-loaded": "runners are being loaded...",
|
"runners-are-being-loaded": "runners are being loaded...",
|
||||||
"runners_via_kiosk": "Runners via Kiosk",
|
|
||||||
"save": "Save",
|
"save": "Save",
|
||||||
"save-changes": "Save Changes",
|
"save-changes": "Save Changes",
|
||||||
"scan-added": "Scan added",
|
"scan-added": "Scan added",
|
||||||
"scan-deleted": "scan deleted",
|
"scan-deleted": "scan deleted",
|
||||||
"scan-is-being-updated": "Scan is being updated",
|
"scan-is-being-updated": "Scan is being updated",
|
||||||
"scan-with-fixed-distance": "Scan with fixed distance",
|
"scan-with-fixed-distance": "Scan with fixed distance",
|
||||||
"scan_card": "Scan Card",
|
|
||||||
"scan_runner": "Scan Runner",
|
|
||||||
"scanclient": "Scanclient",
|
|
||||||
"scans": "Scans",
|
"scans": "Scans",
|
||||||
"scans-are-being-loaded": "Scans are being loaded",
|
"scans-are-being-loaded": "Scans are being loaded",
|
||||||
"scanstation": "Scanstation",
|
"scanstation": "Scanstation",
|
||||||
@ -425,21 +397,17 @@
|
|||||||
"scanstations-are-being-loaded": "Loading scanstations...",
|
"scanstations-are-being-loaded": "Loading scanstations...",
|
||||||
"search-for-an-organization-by-name-or-id": "Search for an organization (by name or #ID)",
|
"search-for-an-organization-by-name-or-id": "Search for an organization (by name or #ID)",
|
||||||
"search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or #ID)",
|
"search-for-an-organization-or-team-by-name-or-id": "Search for an organization or team (by name or #ID)",
|
||||||
"search-for-donor": "Search for donor",
|
|
||||||
"search-for-donor-name-or-id": "Search for donor (by name or #ID)",
|
"search-for-donor-name-or-id": "Search for donor (by name or #ID)",
|
||||||
"search-for-permission": "Search for permission",
|
"search-for-permission": "Search for permission",
|
||||||
"search-for-runner-by-name-or-id": "Search for runner (by name or #ID)",
|
"search-for-runner-by-name-or-id": "Search for runner (by name or #ID)",
|
||||||
"select-all": "select all",
|
"select-all": "select all",
|
||||||
"select-language": "Select language",
|
"select-language": "Select language",
|
||||||
"select-runner": "Select runner",
|
|
||||||
"selfservice-registration": "Selfservice registration",
|
"selfservice-registration": "Selfservice registration",
|
||||||
"selfservice_qr_registration_barcode": "Kiosk QR/ Selfservice Barcode",
|
|
||||||
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
||||||
"set-the-user-active-inactive": "set the user active/ inactive",
|
"set-the-user-active-inactive": "set the user active/ inactive",
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
"settings-for-your-profile": "Settings for your profile",
|
"settings-for-your-profile": "Settings for your profile",
|
||||||
"something-about-the-group": "Something about the group...",
|
"something-about-the-group": "Something about the group...",
|
||||||
"spende_pro_km": "Per Kilometer",
|
|
||||||
"sponsoring-quittungs-liste_herunterladen": "Download donor receipt list",
|
"sponsoring-quittungs-liste_herunterladen": "Download donor receipt list",
|
||||||
"sponsorings": "Sponsorings",
|
"sponsorings": "Sponsorings",
|
||||||
"station-deleted": "station deleted",
|
"station-deleted": "station deleted",
|
||||||
@ -453,7 +421,6 @@
|
|||||||
"status": "Status",
|
"status": "Status",
|
||||||
"stuff-that-could-harm-your-profile": "Stuff that could harm your profile",
|
"stuff-that-could-harm-your-profile": "Stuff that could harm your profile",
|
||||||
"successful-password-reset": "Successful password reset!",
|
"successful-password-reset": "Successful password reset!",
|
||||||
"system": "System",
|
|
||||||
"team": "Team",
|
"team": "Team",
|
||||||
"team-added": "Team added",
|
"team-added": "Team added",
|
||||||
"team-deleted": "Team deleted",
|
"team-deleted": "Team deleted",
|
||||||
@ -483,12 +450,12 @@
|
|||||||
"timestamp": "timestamp",
|
"timestamp": "timestamp",
|
||||||
"token": "Token",
|
"token": "Token",
|
||||||
"total-distance": "total distance",
|
"total-distance": "total distance",
|
||||||
"total-donation-amount": "Total donations",
|
"total-donation-amount": "total donation amount",
|
||||||
"total-donation-count": "Donations (count)",
|
"total-donation-count": "total donations (count)",
|
||||||
"total-donations": "Donations (amount)",
|
"total-donations": "total donations",
|
||||||
"total-donors": "Donors",
|
"total-donors": "total donors",
|
||||||
"total-paid-amount": "Paid",
|
"total-paid-amount": "Paid",
|
||||||
"total-scans": "Scans",
|
"total-scans": "total scans",
|
||||||
"total_donation_amount_in_eur": "Total donation amount in €",
|
"total_donation_amount_in_eur": "Total donation amount in €",
|
||||||
"track": "Track",
|
"track": "Track",
|
||||||
"track-added": "Track added",
|
"track-added": "Track added",
|
||||||
@ -504,7 +471,6 @@
|
|||||||
"track-updated": "Track deleted",
|
"track-updated": "Track deleted",
|
||||||
"track-was-updated": "Track was updated!",
|
"track-was-updated": "Track was updated!",
|
||||||
"tracks": "Tracks",
|
"tracks": "Tracks",
|
||||||
"try_again": "Try Again",
|
|
||||||
"unpaid": "Unpaid",
|
"unpaid": "Unpaid",
|
||||||
"update-card": "Update Card",
|
"update-card": "Update Card",
|
||||||
"update-password": "Update password",
|
"update-password": "Update password",
|
||||||
|
@ -43,8 +43,8 @@ const store = () => {
|
|||||||
//
|
//
|
||||||
state.refreshInterval = setInterval(() => {
|
state.refreshInterval = setInterval(() => {
|
||||||
this.refreshAuth();
|
this.refreshAuth();
|
||||||
// 60min
|
// 2min
|
||||||
}, 60 * 60000);
|
}, 2 * 60000);
|
||||||
//
|
//
|
||||||
return state;
|
return state;
|
||||||
});
|
});
|
||||||
|
@ -1,39 +1,10 @@
|
|||||||
@import "tailwindcss";
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
.activenav {
|
.activenav {
|
||||||
@apply bg-gray-300;
|
@apply bg-gray-300;
|
||||||
@apply text-black;
|
@apply text-black;
|
||||||
}
|
}
|
||||||
* {
|
* {
|
||||||
font-family: Athiti;
|
font-family: Athiti;
|
||||||
}
|
|
||||||
.html5-qrcode-element {
|
|
||||||
@apply block;
|
|
||||||
@apply w-full;
|
|
||||||
@apply p-4;
|
|
||||||
}
|
|
||||||
#qr-scanner__dashboard_section_csr {
|
|
||||||
/* padding-right: 20px; */
|
|
||||||
padding: 1rem;
|
|
||||||
}
|
|
||||||
#html5-qrcode-select-camera {
|
|
||||||
@apply px-2 py-2 inline-flex text-lg leading-5 font-semibold rounded-md border border-current bg-neutral-100 text-neutral-800 mb-2;
|
|
||||||
}
|
|
||||||
#html5-qrcode-button-camera-start {
|
|
||||||
@apply px-2 inline-flex text-lg leading-5 font-semibold rounded-md border border-current bg-green-100 text-green-800 mb-2 cursor-pointer;
|
|
||||||
}
|
|
||||||
#html5-qrcode-button-camera-stop {
|
|
||||||
@apply px-2 inline-flex text-lg leading-5 font-semibold rounded-md border border-current bg-red-100 text-red-800 mb-2 cursor-pointer;
|
|
||||||
}
|
|
||||||
.donation_inactive_tab {
|
|
||||||
@apply min-w-0 flex-1 bg-white first:border-s-0 border-s border-b-2 border-neutral-200 py-4 px-4 text-neutral-800 hover:text-neutral-700 text-sm font-medium text-center overflow-hidden hover:bg-neutral-200 cursor-pointer focus:z-10 focus:outline-hidden focus:bg-neutral-200 disabled:opacity-50 disabled:pointer-events-none;
|
|
||||||
}
|
|
||||||
.donation_active_tab {
|
|
||||||
@apply min-w-0 flex-1 bg-blue-400 text-white first:border-s-0 border-s border-b-2 border-neutral-200 py-4 px-4 text-sm font-medium text-center overflow-hidden cursor-pointer focus:outline-hidden;
|
|
||||||
}
|
|
||||||
.confirm_deletion_button {
|
|
||||||
@apply w-full cursor-pointer 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;
|
|
||||||
}
|
|
||||||
.cancel_modal_button {
|
|
||||||
@apply w-full cursor-pointer 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 hidden lg:block;
|
|
||||||
}
|
}
|
||||||
|
@tailwind utilities;
|
||||||
|
16
tailwind.config.cjs
Normal file
16
tailwind.config.cjs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
module.exports = {
|
||||||
|
darkMode: 'selector',
|
||||||
|
mode: "jit",
|
||||||
|
content: ["./src/**/*.svelte"],
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
colors: {
|
||||||
|
reepolee: {
|
||||||
|
500: "#b40000",
|
||||||
|
600: "#9c0000",
|
||||||
|
700: "#750000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
@ -1,9 +1,11 @@
|
|||||||
// vite.config.js
|
// vite.config.js
|
||||||
import { defineConfig } from "vite";
|
import { defineConfig } from "vite";
|
||||||
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
||||||
import tailwindcss from "@tailwindcss/vite";
|
|
||||||
import mkcert from 'vite-plugin-mkcert'
|
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [svelte(), tailwindcss(), mkcert()],
|
plugins: [
|
||||||
|
svelte({
|
||||||
|
/* plugin options */
|
||||||
|
}),
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user