Compare commits
	
		
			28 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 552b9200d4 | |||
| 5202ab013a | |||
| 1652e54ac6 | |||
| 52528d31a4 | |||
| e6ff8ef80b | |||
| aa707ff0cc | |||
| dc0488b1b7 | |||
| 4920da1df1 | |||
| f9a84f798b | |||
| c6f7210196 | |||
| c286969a9d | |||
| 14ae9e49fb | |||
| 4874b22796 | |||
| 72d34cbfd7 | |||
| b10e964ad9 | |||
| 919b2956ab | |||
| c4ad18cb4f | |||
| ab4f82ccf1 | |||
| 1235776a62 | |||
| 4a1e26663e | |||
| 2bdbd00189 | |||
| 85e7b7c231 | |||
| d5f685a826 | |||
| 88449174a1 | |||
| d30be90102 | |||
| 7e3570e923 | |||
| 3ac0a3c142 | |||
| dc588e83c0 | 
							
								
								
									
										101
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								.drone.yml
									
									
									
									
									
								
							| @@ -1,101 +0,0 @@ | ||||
| --- | ||||
| kind: secret | ||||
| name: docker_username | ||||
| get: | ||||
|   path: odit-registry-builder | ||||
|   name: username | ||||
|  | ||||
| --- | ||||
| kind: secret | ||||
| name: docker_password | ||||
| get: | ||||
|   path: odit-registry-builder | ||||
|   name: password | ||||
|  | ||||
| --- | ||||
| kind: secret | ||||
| name: npm_url | ||||
| get: | ||||
|   path: odit-npm-cache | ||||
|   name: url | ||||
|  | ||||
| --- | ||||
| kind: pipeline | ||||
| type: kubernetes | ||||
| name: build:dev | ||||
|  | ||||
| steps: | ||||
|   - name: build dev | ||||
|     image: plugins/docker | ||||
|     depends_on: [clone] | ||||
|     settings: | ||||
|       username: | ||||
|         from_secret: docker_username | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       build_args: | ||||
|         - NPM_REGISTRY_URL: | ||||
|           from_secret: npm_url | ||||
|       repo: registry.odit.services/lfk/beamershow | ||||
|       tags: | ||||
|         - dev | ||||
|       registry: registry.odit.services | ||||
|       mtu: 1000 | ||||
| trigger: | ||||
|   branch: | ||||
|     - dev | ||||
|   event: | ||||
|     - push | ||||
|  | ||||
| --- | ||||
| kind: pipeline | ||||
| type: kubernetes | ||||
| name: build:latest | ||||
|  | ||||
| steps: | ||||
|   - name: build latest | ||||
|     image: plugins/docker | ||||
|     depends_on: [clone] | ||||
|     settings: | ||||
|       username: | ||||
|         from_secret: docker_username | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       build_args: | ||||
|         - NPM_REGISTRY_URL: | ||||
|           from_secret: npm_url | ||||
|       repo: registry.odit.services/lfk/beamershow | ||||
|       tags: | ||||
|         - latest | ||||
|       registry: registry.odit.services | ||||
|       mtu: 1000 | ||||
| trigger: | ||||
|   branch: | ||||
|     - main | ||||
|   event: | ||||
|     - push | ||||
|  | ||||
| --- | ||||
| kind: pipeline | ||||
| type: kubernetes | ||||
| name: build:tags | ||||
| steps: | ||||
|   - name: build $DRONE_TAG | ||||
|     image: plugins/docker | ||||
|     depends_on: [clone] | ||||
|     settings: | ||||
|       username: | ||||
|         from_secret: docker_username | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       build_args: | ||||
|         - NPM_REGISTRY_URL: | ||||
|           from_secret: npm_url | ||||
|       repo: registry.odit.services/lfk/beamershow | ||||
|       tags: | ||||
|         - '${DRONE_TAG}' | ||||
|       registry: registry.odit.services | ||||
|       mtu: 1000 | ||||
| trigger: | ||||
|   event: | ||||
|   - tag | ||||
							
								
								
									
										33
									
								
								.gitea/workflows/release.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								.gitea/workflows/release.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| name: Build release images | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - "*.*.*" | ||||
|  | ||||
| jobs: | ||||
|   build-container: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Set up Node.js | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: 19 | ||||
|       - run: npm i -g pnpm@10.7 && pnpm i | ||||
|       - run: pnpm licenses:export | ||||
|       - name: Login to registry | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: registry.odit.services | ||||
|           username: ${{ vars.REGISTRY_USERNAME }} | ||||
|           password: ${{ secrets.REGISTRY_PASSWORD }} | ||||
|       - name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v3 | ||||
|       - name: Build and push | ||||
|         uses: docker/build-push-action@v6 | ||||
|         with: | ||||
|           push: true | ||||
|           tags: | | ||||
|             ${{ vars.REGISTRY }}/lfk/beamershow:${{ github.ref_name }} | ||||
|           platforms: linux/amd64,linux/arm64 | ||||
							
								
								
									
										1
									
								
								.husky/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.husky/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| _ | ||||
| @@ -1,5 +0,0 @@ | ||||
| #!/bin/sh | ||||
| . "$(dirname "$0")/_/husky.sh" | ||||
|  | ||||
| yarn format | ||||
| yarn license:export | ||||
							
								
								
									
										70
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,13 +2,81 @@ | ||||
|  | ||||
| All notable changes to this project will be documented in this file. Dates are displayed in UTC. | ||||
|  | ||||
| #### [1.0.0](https://git.odit.services/lfk/beamershow/compare/0.1.5...1.0.0) | ||||
| #### [1.0.8](https://git.odit.services/lfk/beamershow/compare/1.0.7...1.0.8) | ||||
|  | ||||
| - ci: fix license exporter [`5202ab0`](https://git.odit.services/lfk/beamershow/commit/5202ab013a31515f5ad8eeb342fb7f4eb283f1ff) | ||||
|  | ||||
| #### [1.0.7](https://git.odit.services/lfk/beamershow/compare/1.0.6...1.0.7) | ||||
|  | ||||
| > 4 April 2025 | ||||
|  | ||||
| - chore: release 1.0.7 [`1652e54`](https://git.odit.services/lfk/beamershow/commit/1652e54ac63f51c1f8e1903e22a2768967e3f90d) | ||||
|  | ||||
| #### [1.0.6](https://git.odit.services/lfk/beamershow/compare/1.0.5...1.0.6) | ||||
|  | ||||
| > 4 April 2025 | ||||
|  | ||||
| - feat: show org names for teams_distance slide [`c6f7210`](https://git.odit.services/lfk/beamershow/commit/c6f721019691cdc9f5492f920dbdd99e6b25ca9f) | ||||
| - chore(deps). bump [`dc0488b`](https://git.odit.services/lfk/beamershow/commit/dc0488b1b7632326f4dd3bf5fff0ac8fa91fb128) | ||||
| - ci: move to gitea actions [`e6ff8ef`](https://git.odit.services/lfk/beamershow/commit/e6ff8ef80b667692574319f20bebe6a4e872ca6e) | ||||
| - chore: release 1.0.6 [`52528d3`](https://git.odit.services/lfk/beamershow/commit/52528d31a46f99bd44c9b7f18833159f9cd4db56) | ||||
| - chore: update readme [`aa707ff`](https://git.odit.services/lfk/beamershow/commit/aa707ff0ccaa2cb4a69d3c7b396591cd40827c6d) | ||||
| - chore(deps): pnpm@10 [`c286969`](https://git.odit.services/lfk/beamershow/commit/c286969a9de52519005013a6798f711cef26b465) | ||||
| - ci: change release message [`4920da1`](https://git.odit.services/lfk/beamershow/commit/4920da1df1a51a071eeba44d8d2c1cb6c5f8d09c) | ||||
| - fix: i18n [`f9a84f7`](https://git.odit.services/lfk/beamershow/commit/f9a84f798b1052530688aaabf654b08c2d466da5) | ||||
| - fix(login): bg image [`14ae9e4`](https://git.odit.services/lfk/beamershow/commit/14ae9e49fbdc10a1c5681212713b166e333e4b4d) | ||||
|  | ||||
| #### [1.0.5](https://git.odit.services/lfk/beamershow/compare/1.0.4...1.0.5) | ||||
|  | ||||
| > 18 December 2024 | ||||
|  | ||||
| - chore(deps): bump some [`ab4f82c`](https://git.odit.services/lfk/beamershow/commit/ab4f82ccf14a1569921845910e3b2a740f74aeea) | ||||
| - feat(ci)!: Switched to woodpecker [`1235776`](https://git.odit.services/lfk/beamershow/commit/1235776a6255a3925f98ac6cacd3167f6e86e363) | ||||
| - chore: remove husky [`72d34cb`](https://git.odit.services/lfk/beamershow/commit/72d34cbfd7f7e47f0239416469533aea772daa79) | ||||
| - 🚀Bumped version to 1.0.5 [`4874b22`](https://git.odit.services/lfk/beamershow/commit/4874b227960c30b65d7bc822f987c9b957144953) | ||||
| - chore(deps): pnpm@9 + node@23 [`c4ad18c`](https://git.odit.services/lfk/beamershow/commit/c4ad18cb4ff4dd13e50f4674d7b6016ed788ff63) | ||||
| - feat(footer): cleaned up text [`b10e964`](https://git.odit.services/lfk/beamershow/commit/b10e964ad900fcfd2503884c248ea0f6d11a2fb9) | ||||
| - feat: improved background img import [`919b295`](https://git.odit.services/lfk/beamershow/commit/919b2956ab5253a3697c14ac284f6da700afda91) | ||||
|  | ||||
| #### [1.0.4](https://git.odit.services/lfk/beamershow/compare/1.0.3...1.0.4) | ||||
|  | ||||
| > 15 April 2023 | ||||
|  | ||||
| - 🚀Bumped version to 1.0.4 [`4a1e266`](https://git.odit.services/lfk/beamershow/commit/4a1e26663e29339d6373fa8c340ba2117d3ecf28) | ||||
| - fix: formatting of total km [`2bdbd00`](https://git.odit.services/lfk/beamershow/commit/2bdbd001898b9dd5aa541f3cce90fc108e7e458c) | ||||
|  | ||||
| #### [1.0.3](https://git.odit.services/lfk/beamershow/compare/1.0.2...1.0.3) | ||||
|  | ||||
| > 15 April 2023 | ||||
|  | ||||
| - 🚀Bumped version to 1.0.3 [`85e7b7c`](https://git.odit.services/lfk/beamershow/commit/85e7b7c231b92233b58373cd4ad56f514d6d789c) | ||||
| - cleanup loading [`d5f685a`](https://git.odit.services/lfk/beamershow/commit/d5f685a8269737d148a06e0ec784c0074eac7d3f) | ||||
| - drop laptime runner stats, fix runner distance page [`8844917`](https://git.odit.services/lfk/beamershow/commit/88449174a148ab7498075a15149388213a532c02) | ||||
|  | ||||
| #### [1.0.2](https://git.odit.services/lfk/beamershow/compare/1.0.1...1.0.2) | ||||
|  | ||||
| > 15 April 2023 | ||||
|  | ||||
| - 🚀Bumped version to 1.0.2 [`d30be90`](https://git.odit.services/lfk/beamershow/commit/d30be90102b3065b16836adc44a686c677e3053d) | ||||
| - updated release config [`7e3570e`](https://git.odit.services/lfk/beamershow/commit/7e3570e9231929f366047ff149364ec06344d2ee) | ||||
|  | ||||
| #### [1.0.1](https://git.odit.services/lfk/beamershow/compare/1.0.0...1.0.1) | ||||
|  | ||||
| > 15 April 2023 | ||||
|  | ||||
| - 🚀Bumped version to 1.0.1 [`3ac0a3c`](https://git.odit.services/lfk/beamershow/commit/3ac0a3c142427adb3b3d461cd39a458685a85335) | ||||
| - fix bg image? [`dc588e8`](https://git.odit.services/lfk/beamershow/commit/dc588e83c03d7e381f67c52b5fd5430fd0462742) | ||||
|  | ||||
| ### [1.0.0](https://git.odit.services/lfk/beamershow/compare/0.1.5...1.0.0) | ||||
|  | ||||
| > 15 April 2023 | ||||
|  | ||||
| - pin clock to bottom [`b287db4`](https://git.odit.services/lfk/beamershow/commit/b287db4d0a57e8a07d30b756ce0bea30da5ef4e3) | ||||
| - update font to match lfk 2023 branding [`70a6120`](https://git.odit.services/lfk/beamershow/commit/70a61204471cea8f8d5dc17ad225c39c5cd91a43) | ||||
| - bump windicss [`c33157e`](https://git.odit.services/lfk/beamershow/commit/c33157e2d4c5e4a5e9d30d96650e0bfa5ab1ab57) | ||||
| - 1 more empty state [`f909575`](https://git.odit.services/lfk/beamershow/commit/f909575ca5ac862ec8e34d783831c2fcb53f2083) | ||||
| - add empty state for runners_laptime [`8139a3f`](https://git.odit.services/lfk/beamershow/commit/8139a3f60b3544a8992d97b8b9d49520b28270bd) | ||||
| - 🚀Bumped version to 1.0.0 [`5d764a8`](https://git.odit.services/lfk/beamershow/commit/5d764a80a7d25be7f6c2bb29a22b816875a739bf) | ||||
| - updated pnpm lock [`de37339`](https://git.odit.services/lfk/beamershow/commit/de373390ba7051e22f1c4904b1ed60e1dc0e0c7a) | ||||
| - text responsiveness [`9b83b38`](https://git.odit.services/lfk/beamershow/commit/9b83b38356b3faa677421a98c8655bc2357fb489) | ||||
| - fix: font responsiveness [`38b0fcc`](https://git.odit.services/lfk/beamershow/commit/38b0fccb5abf762b88d5a8a3ad27cb80cf85ccb0) | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| FROM registry.odit.services/hub/library/node:19.8.1-alpine3.16 as build | ||||
| FROM registry.odit.services/hub/library/node:23.11.0-alpine3.21 as build | ||||
| ARG NPM_REGISTRY_URL=https://registry.npmjs.org | ||||
| WORKDIR /app | ||||
|  | ||||
| COPY . ./ | ||||
| RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@8 && pnpm i | ||||
| RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@10.7 && pnpm i | ||||
| RUN pnpm build | ||||
|  | ||||
| # final image | ||||
|   | ||||
| @@ -7,17 +7,17 @@ This is an API client for [https://git.odit.services/lfk/backend](@lfk/backend) | ||||
| ## Dev🛠 | ||||
| ### 🚀 Getting Started | ||||
| ``` | ||||
| yarn | ||||
| pnpm i | ||||
| ``` | ||||
| ### Development | ||||
| ``` | ||||
| yarn dev | ||||
| pnpm dev | ||||
| / | ||||
| yarn dev --open | ||||
| pnpm dev --open | ||||
| ``` | ||||
| ### Build | ||||
| ``` | ||||
| yarn build | ||||
| pnpm build | ||||
| ``` | ||||
|  | ||||
| ## Use (quickstart) 🔥 | ||||
|   | ||||
							
								
								
									
										170
									
								
								licenses.md
									
									
									
									
									
								
							
							
						
						
									
										170
									
								
								licenses.md
									
									
									
									
									
								
							| @@ -1,9 +1,102 @@ | ||||
| # @fontsource/athiti | ||||
| **Author**: Lotus <declininglotus@gmail.com> | ||||
| **Repo**: https://github.com/fontsource/fontsource | ||||
| **License**: MIT | ||||
| **Author**: Google Inc. | ||||
| **Repo**: https://github.com/fontsource/font-files | ||||
| **License**: OFL-1.1 | ||||
| **Description**: Self-host the Athiti font in a neatly bundled NPM package. | ||||
| ## License Text | ||||
| Google Inc. | ||||
|  | ||||
| This Font Software is licensed under the SIL Open Font License, Version 1.1. | ||||
| This license is copied below, and is also available with a FAQ at: | ||||
| http://scripts.sil.org/OFL | ||||
|  | ||||
|  | ||||
| ----------------------------------------------------------- | ||||
| SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 | ||||
| ----------------------------------------------------------- | ||||
|  | ||||
| PREAMBLE | ||||
| The goals of the Open Font License (OFL) are to stimulate worldwide | ||||
| development of collaborative font projects, to support the font creation | ||||
| efforts of academic and linguistic communities, and to provide a free and | ||||
| open framework in which fonts may be shared and improved in partnership | ||||
| with others. | ||||
|  | ||||
| The OFL allows the licensed fonts to be used, studied, modified and | ||||
| redistributed freely as long as they are not sold by themselves. The | ||||
| fonts, including any derivative works, can be bundled, embedded, | ||||
| redistributed and/or sold with any software provided that any reserved | ||||
| names are not used by derivative works. The fonts and derivatives, | ||||
| however, cannot be released under any other type of license. The | ||||
| requirement for fonts to remain under this license does not apply | ||||
| to any document created using the fonts or their derivatives. | ||||
|  | ||||
| DEFINITIONS | ||||
| "Font Software" refers to the set of files released by the Copyright | ||||
| Holder(s) under this license and clearly marked as such. This may | ||||
| include source files, build scripts and documentation. | ||||
|  | ||||
| "Reserved Font Name" refers to any names specified as such after the | ||||
| copyright statement(s). | ||||
|  | ||||
| "Original Version" refers to the collection of Font Software components as | ||||
| distributed by the Copyright Holder(s). | ||||
|  | ||||
| "Modified Version" refers to any derivative made by adding to, deleting, | ||||
| or substituting -- in part or in whole -- any of the components of the | ||||
| Original Version, by changing formats or by porting the Font Software to a | ||||
| new environment. | ||||
|  | ||||
| "Author" refers to any designer, engineer, programmer, technical | ||||
| writer or other person who contributed to the Font Software. | ||||
|  | ||||
| PERMISSION & CONDITIONS | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of the Font Software, to use, study, copy, merge, embed, modify, | ||||
| redistribute, and sell modified and unmodified copies of the Font | ||||
| Software, subject to the following conditions: | ||||
|  | ||||
| 1) Neither the Font Software nor any of its individual components, | ||||
| in Original or Modified Versions, may be sold by itself. | ||||
|  | ||||
| 2) Original or Modified Versions of the Font Software may be bundled, | ||||
| redistributed and/or sold with any software, provided that each copy | ||||
| contains the above copyright notice and this license. These can be | ||||
| included either as stand-alone text files, human-readable headers or | ||||
| in the appropriate machine-readable metadata fields within text or | ||||
| binary files as long as those fields can be easily viewed by the user. | ||||
|  | ||||
| 3) No Modified Version of the Font Software may use the Reserved Font | ||||
| Name(s) unless explicit written permission is granted by the corresponding | ||||
| Copyright Holder. This restriction only applies to the primary font name as | ||||
| presented to the users. | ||||
|  | ||||
| 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font | ||||
| Software shall not be used to promote, endorse or advertise any | ||||
| Modified Version, except to acknowledge the contribution(s) of the | ||||
| Copyright Holder(s) and the Author(s) or with their explicit written | ||||
| permission. | ||||
|  | ||||
| 5) The Font Software, modified or unmodified, in part or in whole, | ||||
| must be distributed entirely under this license, and must not be | ||||
| distributed under any other license. The requirement for fonts to | ||||
| remain under this license does not apply to any document created | ||||
| using the Font Software. | ||||
|  | ||||
| TERMINATION | ||||
| This license becomes null and void if any of the above conditions are | ||||
| not met. | ||||
|  | ||||
| DISCLAIMER | ||||
| THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT | ||||
| OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE | ||||
| COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL | ||||
| DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM | ||||
| OTHER DEALINGS IN THE FONT SOFTWARE. | ||||
|   | ||||
|  | ||||
| # @odit/license-exporter | ||||
| @@ -12,7 +105,7 @@ | ||||
| **License**: MIT | ||||
| **Description**: A simple license crawler for crediting open source work | ||||
| ## License Text | ||||
| MIT License Copyright (c) 2020 ODIT.Services (info@odit.services) | ||||
| MIT License Copyright (c) 2020-2022 ODIT.Services (info@odit.services) | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -33,6 +126,35 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF | ||||
| OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|   | ||||
|  | ||||
| # @philippdormann/release-it | ||||
| **Author**: Lars Kappert | ||||
| **Repo**: https://github.com/release-it/release-it | ||||
| **License**: MIT | ||||
| **Description**: Generic CLI tool to automate versioning and package publishing-related tasks. | ||||
| ## License Text | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2018 Lars Kappert | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|   | ||||
|  | ||||
| # @svitejs/vite-plugin-svelte | ||||
| **Author**: dominikg | ||||
| **Repo**: https://github.com/svitejs/svite | ||||
| @@ -177,15 +299,6 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||
| OTHER DEALINGS IN THE SOFTWARE. | ||||
|   | ||||
|  | ||||
| # husky | ||||
| **Author**: Typicode <typicode@gmail.com> | ||||
| **Repo**: https://github.com/typicode/husky | ||||
| **License**: Parity-7.0.0 AND MIT WITH Patron-1.0.0 | ||||
| **Description**: Git hooks made easy | ||||
| ## License Text | ||||
| License Zero Parity 7.0.0 (see LICENSE-PARITY file) and MIT (contributions, see LICENSE-MIT file) with exception License Zero Patron 1.0.0 (see LICENSE-PATRON file) | ||||
|   | ||||
|  | ||||
| # prettier | ||||
| **Author**: James Long | ||||
| **Repo**: prettier/prettier | ||||
| @@ -230,35 +343,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|   | ||||
|  | ||||
| # release-it | ||||
| **Author**: Lars Kappert | ||||
| **Repo**: https://github.com/release-it/release-it | ||||
| **License**: MIT | ||||
| **Description**: Generic CLI tool to automate versioning and package publishing related tasks. | ||||
| ## License Text | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2018 Lars Kappert | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|   | ||||
|  | ||||
| # svelte | ||||
| **Author**: Rich Harris | ||||
| **Repo**: https://github.com/sveltejs/svelte | ||||
| @@ -306,7 +390,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | ||||
|  | ||||
| # validator | ||||
| **Author**: Chris O'Hara <cohara87@gmail.com> | ||||
| **Repo**: https://github.com/chriso/validator.js | ||||
| **Repo**: https://github.com/validatorjs/validator.js | ||||
| **License**: MIT | ||||
| **Description**: String validation and sanitization | ||||
| ## License Text | ||||
|   | ||||
							
								
								
									
										28
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,41 +1,39 @@ | ||||
| { | ||||
| 	"name": "@lfk/beamershow", | ||||
| 	"version": "1.0.0", | ||||
| 	"version": "1.0.8", | ||||
| 	"scripts": { | ||||
| 		"dev": "vite", | ||||
| 		"build": "vite build", | ||||
| 		"format": "prettier --write --plugin-search-dir=. ./**/*.html ./**/*.svelte", | ||||
| 		"prepare": "husky install", | ||||
| 		"license:export": "license-exporter --markdown && git stage licenses.md", | ||||
| 		"licenses:export": "license-exporter --markdown && git stage licenses.md", | ||||
| 		"release": "release-it --only-version" | ||||
| 	}, | ||||
| 	"devDependencies": { | ||||
| 		"@odit/license-exporter": "0.0.11", | ||||
| 		"@odit/license-exporter": "0.2.0", | ||||
| 		"@philippdormann/release-it": "1.0.0", | ||||
| 		"@svitejs/vite-plugin-svelte": "0.11.1", | ||||
| 		"@tsconfig/svelte": "1.0.10", | ||||
| 		"@types/html-minifier": "4.0.0", | ||||
| 		"@types/html-minifier": "4.0.5", | ||||
| 		"axios": "0.21.1", | ||||
| 		"html-minifier": "4.0.0", | ||||
| 		"husky": "5.1.3", | ||||
| 		"prettier": "2.2.1", | ||||
| 		"prettier-plugin-svelte": "2.2.0", | ||||
| 		"release-it": "14.5.0", | ||||
| 		"prettier": "3.5.3", | ||||
| 		"prettier-plugin-svelte": "3.3.3", | ||||
| 		"svelte": "3.36.0", | ||||
| 		"svelte-i18n": "3.3.9", | ||||
| 		"svelte-preprocess": "4.7.0", | ||||
| 		"validator": "13.5.2", | ||||
| 		"validator": "13.15.0", | ||||
| 		"vite": "2.1.4", | ||||
| 		"vite-plugin-windicss": "1.8.10" | ||||
| 		"vite-plugin-windicss": "1.9.4" | ||||
| 	}, | ||||
| 	"release-it": { | ||||
| 		"git": { | ||||
| 			"commit": true, | ||||
| 			"requireCleanWorkingDir": false, | ||||
| 			"commitMessage": "🚀Bumped version to ${version}", | ||||
| 			"commitMessage": "chore: release ${version}", | ||||
| 			"requireBranch": "main", | ||||
| 			"push": false, | ||||
| 			"push": true, | ||||
| 			"tag": true, | ||||
| 			"tagName": null, | ||||
| 			"tagName": "${version}", | ||||
| 			"tagAnnotation": "${version}" | ||||
| 		}, | ||||
| 		"npm": { | ||||
| @@ -46,6 +44,6 @@ | ||||
| 		} | ||||
| 	}, | ||||
| 	"dependencies": { | ||||
| 		"@fontsource/athiti": "^4.5.10" | ||||
| 		"@fontsource/athiti": "5.2.5" | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										4127
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4127
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| onlyBuiltDependencies: | ||||
|   - esbuild | ||||
|   - svelte-preprocess | ||||
| @@ -1,416 +1,420 @@ | ||||
| <script> | ||||
|   import axios from "axios"; | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   import { slide } from "svelte/transition"; | ||||
|   import { apikey, api_endpoint, laptime_track } from "./store.js"; | ||||
|   function init(el) { | ||||
|     el.focus(); | ||||
|   } | ||||
|   $: pages = [ | ||||
|     "general", | ||||
|     "runners_distance", | ||||
|     "runners_laptime", | ||||
|     "orgs_distance", | ||||
|     // "teams_distance", | ||||
|   ]; | ||||
|   $: current_page = "general"; | ||||
|   $: general = {}; | ||||
|   $: runners = []; | ||||
|   $: runners_by_laptime = []; | ||||
|   $: orgs = []; | ||||
|   $: teams = []; | ||||
| 	import axios from "axios"; | ||||
| 	import bg from "/beamershow_background.png?inline"; | ||||
| 	import { _ } from "svelte-i18n"; | ||||
| 	import { slide } from "svelte/transition"; | ||||
| 	import { apikey, api_endpoint, laptime_track } from "./store.js"; | ||||
| 	$: pages = [ | ||||
| 		"general", | ||||
| 		"runners_distance", | ||||
| 		// "runners_laptime", | ||||
| 		"orgs_distance", | ||||
| 		// "teams_distance", | ||||
| 	]; | ||||
| 	$: current_page = "general"; | ||||
| 	$: general = {}; | ||||
| 	$: runners = []; | ||||
| 	$: runners_by_laptime = []; | ||||
| 	$: orgs = []; | ||||
| 	$: teams = []; | ||||
|  | ||||
|   let time = new Date(); | ||||
|   $: hours = (time.getHours() + "").padStart(2, "0"); | ||||
|   $: minutes = (time.getMinutes() + "").padStart(2, "0"); | ||||
|   $: seconds = (time.getSeconds() + "").padStart(2, "0"); | ||||
|   function format_laptime(laptime) { | ||||
|     if (laptime < 60) { | ||||
|       return `${laptime}s`; | ||||
|     } | ||||
|     if (laptime < 3600) { | ||||
|       return `${Math.floor(laptime / 60)}min ${ | ||||
|         laptime - Math.floor(laptime / 60) * 60 | ||||
|       }s`; | ||||
|     } | ||||
|     return `${Math.floor(laptime / 3600)}h ${ | ||||
|       laptime - Math.floor(laptime / 3600) * 3600 | ||||
|     }min ${ | ||||
|       laptime - | ||||
|       Math.floor(laptime / 3600) * 3600 - | ||||
|       Math.floor(laptime / 60) * 60 | ||||
|     }`; | ||||
|   } | ||||
|   function stats_general() { | ||||
|     axios | ||||
|       .request({ | ||||
|         method: "GET", | ||||
|         url: $api_endpoint + "api/stats/", | ||||
|         headers: { Authorization: "Bearer " + $apikey }, | ||||
|       }) | ||||
|       .then(function ({ data }) { | ||||
|         general = data; | ||||
|       }) | ||||
|       .catch(function (e) { | ||||
|         console.log(e); | ||||
|       }); | ||||
|   } | ||||
|   function stats_runners() { | ||||
|     axios | ||||
|       .request({ | ||||
|         method: "GET", | ||||
|         url: $api_endpoint + "api/stats/runners/distance", | ||||
|         headers: { Authorization: "Bearer " + $apikey }, | ||||
|       }) | ||||
|       .then(function ({ data }) { | ||||
|         runners = data; | ||||
|       }) | ||||
|       .catch(function (e) { | ||||
|         console.log(e); | ||||
|       }); | ||||
|   } | ||||
|   function stats_runners_by_laptime() { | ||||
|     axios | ||||
|       .request({ | ||||
|         method: "GET", | ||||
|         url: | ||||
|           $api_endpoint + "api/stats/runners/laptime?track=" + $laptime_track, | ||||
|         headers: { Authorization: "Bearer " + $apikey }, | ||||
|       }) | ||||
|       .then(function ({ data }) { | ||||
|         runners_by_laptime = data; | ||||
|       }) | ||||
|       .catch(function (e) { | ||||
|         console.log(e); | ||||
|       }); | ||||
|   } | ||||
|   function stats_orgs() { | ||||
|     axios | ||||
|       .request({ | ||||
|         method: "GET", | ||||
|         url: $api_endpoint + "api/stats/organizations/distance", | ||||
|         headers: { Authorization: "Bearer " + $apikey }, | ||||
|       }) | ||||
|       .then(function ({ data }) { | ||||
|         orgs = data; | ||||
|       }) | ||||
|       .catch(function (e) { | ||||
|         console.log(e); | ||||
|       }); | ||||
|   } | ||||
|   function stats_teams() { | ||||
|     axios | ||||
|       .request({ | ||||
|         method: "GET", | ||||
|         url: $api_endpoint + "api/stats/teams/distance", | ||||
|         headers: { Authorization: "Bearer " + $apikey }, | ||||
|       }) | ||||
|       .then(function ({ data }) { | ||||
|         teams = data; | ||||
|       }) | ||||
|       .catch(function (e) { | ||||
|         console.log(e); | ||||
|       }); | ||||
|   } | ||||
|   Array.prototype.cycle = function (str) { | ||||
|     const i = this.indexOf(str); | ||||
|     if (i === -1) return undefined; | ||||
|     return this[(i + 1) % this.length]; | ||||
|   }; | ||||
|   function fetch_all() { | ||||
|     stats_general(); | ||||
|     stats_runners(); | ||||
|     stats_runners_by_laptime(); | ||||
|     stats_orgs(); | ||||
|     stats_teams(); | ||||
|   } | ||||
|   fetch_all(); | ||||
|   setInterval(() => { | ||||
|     time = new Date(); | ||||
|   }, 1000); | ||||
|   setInterval(() => { | ||||
|     fetch_all(); | ||||
|   }, 90000); | ||||
|   setInterval(() => { | ||||
|     current_page = pages.cycle(current_page); | ||||
|   }, 20000); | ||||
| 	let time = new Date(); | ||||
| 	$: hours = (time.getHours() + "").padStart(2, "0"); | ||||
| 	$: minutes = (time.getMinutes() + "").padStart(2, "0"); | ||||
| 	$: seconds = (time.getSeconds() + "").padStart(2, "0"); | ||||
| 	function format_laptime(laptime) { | ||||
| 		if (laptime < 60) { | ||||
| 			return `${laptime}s`; | ||||
| 		} | ||||
| 		if (laptime < 3600) { | ||||
| 			return `${Math.floor(laptime / 60)}min ${ | ||||
| 				laptime - Math.floor(laptime / 60) * 60 | ||||
| 			}s`; | ||||
| 		} | ||||
| 		return `${Math.floor(laptime / 3600)}h ${ | ||||
| 			laptime - Math.floor(laptime / 3600) * 3600 | ||||
| 		}min ${ | ||||
| 			laptime - | ||||
| 			Math.floor(laptime / 3600) * 3600 - | ||||
| 			Math.floor(laptime / 60) * 60 | ||||
| 		}`; | ||||
| 	} | ||||
| 	function stats_general() { | ||||
| 		axios | ||||
| 			.request({ | ||||
| 				method: "GET", | ||||
| 				url: $api_endpoint + "api/stats/", | ||||
| 				headers: { Authorization: "Bearer " + $apikey }, | ||||
| 			}) | ||||
| 			.then(function ({ data }) { | ||||
| 				general = data; | ||||
| 			}) | ||||
| 			.catch(function (e) { | ||||
| 				console.log(e); | ||||
| 			}); | ||||
| 	} | ||||
| 	function stats_runners() { | ||||
| 		axios | ||||
| 			.request({ | ||||
| 				method: "GET", | ||||
| 				url: $api_endpoint + "api/stats/runners/distance", | ||||
| 				headers: { Authorization: "Bearer " + $apikey }, | ||||
| 			}) | ||||
| 			.then(function ({ data }) { | ||||
| 				runners = data; | ||||
| 			}) | ||||
| 			.catch(function (e) { | ||||
| 				console.log(e); | ||||
| 			}); | ||||
| 	} | ||||
| 	function stats_runners_by_laptime() { | ||||
| 		axios | ||||
| 			.request({ | ||||
| 				method: "GET", | ||||
| 				url: | ||||
| 					$api_endpoint + "api/stats/runners/laptime?track=" + $laptime_track, | ||||
| 				headers: { Authorization: "Bearer " + $apikey }, | ||||
| 			}) | ||||
| 			.then(function ({ data }) { | ||||
| 				runners_by_laptime = data; | ||||
| 			}) | ||||
| 			.catch(function (e) { | ||||
| 				console.log(e); | ||||
| 			}); | ||||
| 	} | ||||
| 	function stats_orgs() { | ||||
| 		axios | ||||
| 			.request({ | ||||
| 				method: "GET", | ||||
| 				url: $api_endpoint + "api/stats/organizations/distance", | ||||
| 				headers: { Authorization: "Bearer " + $apikey }, | ||||
| 			}) | ||||
| 			.then(function ({ data }) { | ||||
| 				orgs = data; | ||||
| 			}) | ||||
| 			.catch(function (e) { | ||||
| 				console.log(e); | ||||
| 			}); | ||||
| 	} | ||||
| 	function stats_teams() { | ||||
| 		axios | ||||
| 			.request({ | ||||
| 				method: "GET", | ||||
| 				url: $api_endpoint + "api/stats/teams/distance", | ||||
| 				headers: { Authorization: "Bearer " + $apikey }, | ||||
| 			}) | ||||
| 			.then(function ({ data }) { | ||||
| 				teams = data; | ||||
| 			}) | ||||
| 			.catch(function (e) { | ||||
| 				console.log(e); | ||||
| 			}); | ||||
| 	} | ||||
| 	Array.prototype.cycle = function (str) { | ||||
| 		const i = this.indexOf(str); | ||||
| 		if (i === -1) return undefined; | ||||
| 		return this[(i + 1) % this.length]; | ||||
| 	}; | ||||
| 	function fetch_all() { | ||||
| 		stats_general(); | ||||
| 		stats_runners(); | ||||
| 		// stats_runners_by_laptime(); | ||||
| 		stats_orgs(); | ||||
| 		stats_teams(); | ||||
| 	} | ||||
| 	fetch_all(); | ||||
| 	setInterval(() => { | ||||
| 		time = new Date(); | ||||
| 	}, 1000); | ||||
| 	setInterval(() => { | ||||
| 		fetch_all(); | ||||
| 	}, 50000); | ||||
| 	setInterval(() => { | ||||
| 		current_page = pages.cycle(current_page); | ||||
| 	}, 20000); | ||||
| </script> | ||||
|  | ||||
| <div | ||||
|   class="min-h-screen flex items-center justify-center bg-gray-100" | ||||
|   style="background-image: url('/beamershow_background.png');background-position: center;background-size: contain;background-repeat:no-repeat;" | ||||
| 	class="min-h-screen flex items-center justify-center bg-gray-100" | ||||
| 	style="background-image: url({bg});background-position: center;background-size: contain;background-repeat:no-repeat;" | ||||
| > | ||||
|   <div class="w-full"> | ||||
|     <div class="w-3/4 xl:w-1/2 mx-auto"> | ||||
|       <!--  --> | ||||
|       {#if current_page === "general"} | ||||
|         <div transition:slide|local> | ||||
|           <h1 | ||||
|             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900" | ||||
|           > | ||||
|             Statistiken | ||||
|           </h1> | ||||
|           <!--  --> | ||||
|           <div class="flex flex-wrap -mx-1 overflow-hidden mt-5"> | ||||
|             <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||
|               <h1 class="text-5xl font-bold text-center text-gray-900"> | ||||
|                 {general.total_runners || "0"} | ||||
|               </h1> | ||||
|               <h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||
|                 {$_("laeufer")} | ||||
|               </h1> | ||||
|             </div> | ||||
|             <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||
|               <h1 class="text-5xl font-bold text-center text-gray-900"> | ||||
|                 {general.total_distance || "0"} | ||||
|               </h1> | ||||
|               <h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||
|                 {$_("kilometer-gesamt")} | ||||
|               </h1> | ||||
|             </div> | ||||
|             <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||
|               <h1 class="text-5xl font-bold text-center text-gray-900"> | ||||
|                 {parseFloat( | ||||
|                   ((general.total_donation || 0) / 100).toFixed(2) | ||||
|                 ).toLocaleString(undefined, { | ||||
|                   minimumFractionDigits: 2, | ||||
|                   maximumFractionDigits: 2, | ||||
|                 }) || "0"} € | ||||
|               </h1> | ||||
|               <h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||
|                 {$_("spendensumme")} | ||||
|               </h1> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       {:else if current_page === "runners_distance"} | ||||
|         <div transition:slide|local> | ||||
|           <h1 | ||||
|             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
|           > | ||||
|             {$_("top-laeufer")} ({$_("distanz")}) | ||||
|           </h1> | ||||
|           {#if runners_by_laptime.length === 0} | ||||
|             <p class="w-full text-center text-3xl font-semibold"> | ||||
|               Noch keine Daten... | ||||
|             </p> | ||||
|           {:else} | ||||
|             <table | ||||
|               class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
|             > | ||||
|               <thead> | ||||
|                 <tr> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("platz")} | ||||
|                   </th> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("laeufer")} | ||||
|                   </th> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("organisation")} | ||||
|                   </th> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("kilometer")} | ||||
|                   </th> | ||||
|                 </tr> | ||||
|               </thead> | ||||
|               <tbody> | ||||
|                 {#each runners as r, i} | ||||
|                   <tr class="text-gray-700"> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {i + 1} | ||||
|                     </td> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {r.firstname} | ||||
|                       {r.lastname} | ||||
|                     </td> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {r.group.name} | ||||
|                     </td> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {r.distance / 1000} km | ||||
|                     </td> | ||||
|                   </tr> | ||||
|                 {/each} | ||||
|               </tbody> | ||||
|             </table> | ||||
|           {/if} | ||||
|         </div> | ||||
|       {:else if current_page === "runners_laptime"} | ||||
|         <div transition:slide|local> | ||||
|           <h1 | ||||
|             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
|           > | ||||
|             {$_("top-laeufer")} ({$_("rundenzeit")}) | ||||
|           </h1> | ||||
|           {#if runners_by_laptime.length === 0} | ||||
|             <p class="w-full text-center text-3xl font-semibold"> | ||||
|               Noch keine Daten... | ||||
|             </p> | ||||
|           {:else} | ||||
|             <table | ||||
|               class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
|             > | ||||
|               <thead> | ||||
|                 <tr> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("platz")} | ||||
|                   </th> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("laeufer")} | ||||
|                   </th> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("organisation")} | ||||
|                   </th> | ||||
|                   <th | ||||
|                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                   > | ||||
|                     {$_("schnellste-rundenzeit")} | ||||
|                   </th> | ||||
|                 </tr> | ||||
|               </thead> | ||||
|               <tbody> | ||||
|                 {#each runners_by_laptime as r, i} | ||||
|                   <tr class="text-gray-700"> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {i + 1} | ||||
|                     </td> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {r.firstname} | ||||
|                       {r.lastname} | ||||
|                     </td> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {r.group.name} | ||||
|                     </td> | ||||
|                     <td class="border p-4 dark:border-dark-5"> | ||||
|                       {format_laptime(r.minLaptime)} | ||||
|                     </td> | ||||
|                   </tr> | ||||
|                 {/each} | ||||
|               </tbody> | ||||
|             </table> | ||||
|           {/if} | ||||
|         </div> | ||||
|       {:else if current_page === "orgs_distance"} | ||||
|         <div transition:slide|local> | ||||
|           <h1 | ||||
|             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
|           > | ||||
|             {$_("top-organisationen")} | ||||
|           </h1> | ||||
|           <table | ||||
|             class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
|           > | ||||
|             <thead> | ||||
|               <tr> | ||||
|                 <th | ||||
|                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                 > | ||||
|                   {$_("platz")} | ||||
|                 </th> | ||||
|                 <th | ||||
|                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                 > | ||||
|                   {$_("organsiation")} | ||||
|                 </th> | ||||
|                 <th | ||||
|                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                 > | ||||
|                   {$_("kilometer")} | ||||
|                 </th> | ||||
|               </tr> | ||||
|             </thead> | ||||
|             <tbody> | ||||
|               {#each orgs as o, i} | ||||
|                 <tr class="text-gray-700"> | ||||
|                   <td class="border p-4 dark:border-dark-5"> | ||||
|                     {i + 1} | ||||
|                   </td> | ||||
|                   <td class="border p-4 dark:border-dark-5"> | ||||
|                     {o.name} | ||||
|                   </td> | ||||
|                   <td class="border p-4 dark:border-dark-5"> | ||||
|                     {o.distance / 1000} km | ||||
|                   </td> | ||||
|                 </tr> | ||||
|               {/each} | ||||
|             </tbody> | ||||
|           </table> | ||||
|         </div> | ||||
|       {:else if current_page === "teams_distance"} | ||||
|         <div transition:slide|local> | ||||
|           <h1 | ||||
|             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
|           > | ||||
|             {$_("top-teams")} | ||||
|           </h1> | ||||
|           <table | ||||
|             class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
|           > | ||||
|             <thead> | ||||
|               <tr> | ||||
|                 <th | ||||
|                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                 > | ||||
|                   {$_("platz")} | ||||
|                 </th> | ||||
|                 <th | ||||
|                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                 > | ||||
|                   {$_("team")} | ||||
|                 </th> | ||||
|                 <th | ||||
|                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
|                 > | ||||
|                   {$_("kilometer")} | ||||
|                 </th> | ||||
|               </tr> | ||||
|             </thead> | ||||
|             <tbody> | ||||
|               {#each teams as t, i} | ||||
|                 <tr class="text-gray-700"> | ||||
|                   <td class="border p-4 dark:border-dark-5"> | ||||
|                     {i + 1} | ||||
|                   </td> | ||||
|                   <td class="border p-4 dark:border-dark-5"> | ||||
|                     {t.name} | ||||
|                   </td> | ||||
|                   <td class="border p-4 dark:border-dark-5"> | ||||
|                     {t.distance / 1000} km | ||||
|                   </td> | ||||
|                 </tr> | ||||
|               {/each} | ||||
|             </tbody> | ||||
|           </table> | ||||
|         </div> | ||||
|       {:else} | ||||
|         <!-- content here --> | ||||
|       {/if} | ||||
|     </div> | ||||
|   </div> | ||||
|   <h1 | ||||
|     class="text-6xl font-semibold text-right text-gray-900 font-mono top-2 w-full fixed pr-4 xl:top-6 xl:pr-8" | ||||
|   > | ||||
|     {hours}:{minutes}:{seconds} | ||||
|   </h1> | ||||
|   <h1 | ||||
|     class="text-xl xl:text-3xl font-medium text-center text-gray-900 font-mono bottom-2 xl:bottom-4 w-full fixed" | ||||
|   > | ||||
|     <span class="text-black font-extrabold">LfK!2023 </span>powered by | ||||
|     ODIT.Services | ||||
|   </h1> | ||||
| 	<div class="w-full"> | ||||
| 		<div class="w-3/4 xl:w-1/2 mx-auto"> | ||||
| 			<!--  --> | ||||
| 			{#if current_page === "general"} | ||||
| 				<div transition:slide|local> | ||||
| 					<h1 | ||||
| 						class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900" | ||||
| 					> | ||||
| 						{$_("statistiken")} | ||||
| 					</h1> | ||||
| 					<!--  --> | ||||
| 					<div class="flex flex-wrap -mx-1 overflow-hidden mt-5"> | ||||
| 						<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||
| 							<h1 class="text-5xl font-bold text-center text-gray-900"> | ||||
| 								{general.total_runners || "0"} | ||||
| 							</h1> | ||||
| 							<h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||
| 								{$_("laeufer")} | ||||
| 							</h1> | ||||
| 						</div> | ||||
| 						<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||
| 							<h1 class="text-5xl font-bold text-center text-gray-900"> | ||||
| 								{general.total_distance / 1000 || 0} | ||||
| 							</h1> | ||||
| 							<h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||
| 								{$_("kilometer-gesamt")} | ||||
| 							</h1> | ||||
| 						</div> | ||||
| 						<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||
| 							<h1 class="text-5xl font-bold text-center text-gray-900"> | ||||
| 								{parseFloat( | ||||
| 									((general.total_donation || 0) / 100).toFixed(2) | ||||
| 								).toLocaleString(undefined, { | ||||
| 									minimumFractionDigits: 2, | ||||
| 									maximumFractionDigits: 2, | ||||
| 								}) || "0"} € | ||||
| 							</h1> | ||||
| 							<h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||
| 								{$_("spendensumme")} | ||||
| 							</h1> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			{:else if current_page === "runners_distance"} | ||||
| 				<div transition:slide|local> | ||||
| 					<h1 | ||||
| 						class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
| 					> | ||||
| 						{$_("top-laeufer")} ({$_("distanz")}) | ||||
| 					</h1> | ||||
| 					{#if runners.length === 0} | ||||
| 						<p class="w-full text-center text-3xl font-semibold"> | ||||
| 							Noch keine Daten... | ||||
| 						</p> | ||||
| 					{:else} | ||||
| 						<table | ||||
| 							class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
| 						> | ||||
| 							<thead> | ||||
| 								<tr> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("platz")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("laeufer")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("organisation")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("kilometer")} | ||||
| 									</th> | ||||
| 								</tr> | ||||
| 							</thead> | ||||
| 							<tbody> | ||||
| 								{#each runners as r, i} | ||||
| 									<tr class="text-gray-700"> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{i + 1} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{r.firstname} | ||||
| 											{r.lastname} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{r.group.name} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{r.distance / 1000} km | ||||
| 										</td> | ||||
| 									</tr> | ||||
| 								{/each} | ||||
| 							</tbody> | ||||
| 						</table> | ||||
| 					{/if} | ||||
| 				</div> | ||||
| 			{:else if current_page === "runners_laptime"} | ||||
| 				<div transition:slide|local> | ||||
| 					<h1 | ||||
| 						class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
| 					> | ||||
| 						{$_("top-laeufer")} ({$_("rundenzeit")}) | ||||
| 					</h1> | ||||
| 					{#if runners_by_laptime.length === 0} | ||||
| 						<p class="w-full text-center text-3xl font-semibold"> | ||||
| 							Noch keine Daten... | ||||
| 						</p> | ||||
| 					{:else} | ||||
| 						<table | ||||
| 							class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
| 						> | ||||
| 							<thead> | ||||
| 								<tr> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("platz")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("laeufer")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("organisation")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("schnellste-rundenzeit")} | ||||
| 									</th> | ||||
| 								</tr> | ||||
| 							</thead> | ||||
| 							<tbody> | ||||
| 								{#each runners_by_laptime as r, i} | ||||
| 									<tr class="text-gray-700"> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{i + 1} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{r.firstname} | ||||
| 											{r.lastname} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{r.group.name} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{format_laptime(r.minLaptime)} | ||||
| 										</td> | ||||
| 									</tr> | ||||
| 								{/each} | ||||
| 							</tbody> | ||||
| 						</table> | ||||
| 					{/if} | ||||
| 				</div> | ||||
| 			{:else if current_page === "orgs_distance"} | ||||
| 				<div transition:slide|local> | ||||
| 					<h1 | ||||
| 						class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
| 					> | ||||
| 						{$_("top-organisationen")} | ||||
| 					</h1> | ||||
| 					{#if orgs.length === 0} | ||||
| 						<p class="w-full text-center text-3xl font-semibold"> | ||||
| 							Noch keine Daten... | ||||
| 						</p> | ||||
| 					{:else} | ||||
| 						<table | ||||
| 							class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
| 						> | ||||
| 							<thead> | ||||
| 								<tr> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("platz")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("organsiation")} | ||||
| 									</th> | ||||
| 									<th | ||||
| 										class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 									> | ||||
| 										{$_("kilometer")} | ||||
| 									</th> | ||||
| 								</tr> | ||||
| 							</thead> | ||||
| 							<tbody> | ||||
| 								{#each orgs as o, i} | ||||
| 									<tr class="text-gray-700"> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{i + 1} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{o.name} | ||||
| 										</td> | ||||
| 										<td class="border p-4 dark:border-dark-5"> | ||||
| 											{o.distance / 1000} km | ||||
| 										</td> | ||||
| 									</tr> | ||||
| 								{/each} | ||||
| 							</tbody> | ||||
| 						</table> | ||||
| 					{/if} | ||||
| 				</div> | ||||
| 			{:else if current_page === "teams_distance"} | ||||
| 				<div transition:slide|local> | ||||
| 					<h1 | ||||
| 						class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||
| 					> | ||||
| 						{$_("top-teams")} | ||||
| 					</h1> | ||||
| 					<table | ||||
| 						class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||
| 					> | ||||
| 						<thead> | ||||
| 							<tr> | ||||
| 								<th | ||||
| 									class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 								> | ||||
| 									{$_("platz")} | ||||
| 								</th> | ||||
| 								<th | ||||
| 									class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 								> | ||||
| 									{$_("team")} | ||||
| 								</th> | ||||
| 								<th | ||||
| 									class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||
| 								> | ||||
| 									{$_("kilometer")} | ||||
| 								</th> | ||||
| 							</tr> | ||||
| 						</thead> | ||||
| 						<tbody> | ||||
| 							{#each teams as t, i} | ||||
| 								<tr class="text-gray-700"> | ||||
| 									<td class="border p-4 dark:border-dark-5"> | ||||
| 										{i + 1} | ||||
| 									</td> | ||||
| 									<td class="border p-4 dark:border-dark-5"> | ||||
| 										{t.parent.name}<br /> | ||||
| 										{t.name} | ||||
| 									</td> | ||||
| 									<td class="border p-4 dark:border-dark-5"> | ||||
| 										{t.distance / 1000} km | ||||
| 									</td> | ||||
| 								</tr> | ||||
| 							{/each} | ||||
| 						</tbody> | ||||
| 					</table> | ||||
| 				</div> | ||||
| 			{:else} | ||||
| 				<!-- content here --> | ||||
| 			{/if} | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<h1 | ||||
| 		class="text-6xl font-semibold text-right text-gray-900 font-mono top-2 w-full fixed pr-4 xl:top-6 xl:pr-8" | ||||
| 	> | ||||
| 		{hours}:{minutes}:{seconds} | ||||
| 	</h1> | ||||
| 	<h1 | ||||
| 		class="text-xl xl:text-3xl font-medium text-center text-gray-900 font-mono bottom-2 xl:bottom-4 w-full fixed" | ||||
| 	> | ||||
| 		<span class="text-black font-extrabold">Lauf für Kaya!</span> - powered by ODIT.Services | ||||
| 	</h1> | ||||
| </div> | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| <script> | ||||
|   import bg from "/beamershow_background.png?inline"; | ||||
|   import { apikey, lang, api_endpoint, laptime_track, clear } from "./store.js"; | ||||
|   import isURL from "validator/lib/isURL"; | ||||
|   import isUUID from "validator/lib/isUUID"; | ||||
| @@ -253,7 +254,7 @@ | ||||
|     <img | ||||
|       alt="" | ||||
|       class="object-cover w-full h-screen hidden md:block" | ||||
|       src="https://source.unsplash.com/IXUM4cJynP0" | ||||
|       src={bg} | ||||
|     /> | ||||
|   </div> | ||||
| </div> | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
|     "spendensumme": "Spendensumme", | ||||
|     "station_description": "Beschreibung der Scanstation", | ||||
|     "station_id": "Scanstations-ID", | ||||
|     "statistiken": "Statistiken", | ||||
|     "team": "Team", | ||||
|     "the_provided_scan_station_is_disabled": "Die angegebene Scanstation ist deaktiviert.", | ||||
|     "the_provided_scan_station_token_is_invalid": "Der angegebene Scanstation-Token ist ungültig.", | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
|     "spendensumme": "Donations", | ||||
|     "station_description": "Station Description", | ||||
|     "station_id": "Scanstation ID", | ||||
|     "statistiken": "Statistics", | ||||
|     "team": "Team", | ||||
|     "the_provided_scan_station_is_disabled": "The provided scan station is disabled.", | ||||
|     "the_provided_scan_station_token_is_invalid": "The provided scan station token is invalid.", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user