Compare commits
	
		
			40 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d30be90102 | |||
| 7e3570e923 | |||
| 3ac0a3c142 | |||
| dc588e83c0 | |||
| 5d764a80a7 | |||
| 0f32c71ef0 | |||
| 4b1a1a324b | |||
| 569296928e | |||
| c33157e2d4 | |||
| ee9799736f | |||
| 8d38e81b78 | |||
| 7005ec6a28 | |||
| 38b0fccb5a | |||
| 8a4974ffa9 | |||
| 9b83b38356 | |||
| 047941babb | |||
| f909575ca5 | |||
| 70a6120447 | |||
| b483ed1e49 | |||
| 2ce93b45c7 | |||
| 8139a3f60b | |||
| 431fc5a047 | |||
| b287db4d0a | |||
| b3ce711e6b | |||
| 456c0635a4 | |||
| b50398f6eb | |||
| e04e6713bc | |||
| de373390ba | |||
| 5be665b65f | |||
| 324612b5dd | |||
| ca1c96b252 | |||
| d284e8184c | |||
| 701aae9ed4 | |||
| 7f7b743f41 | |||
| ee6af3e069 | |||
| ea08127927 | |||
| e0f400a800 | |||
| c485898b7d | |||
| 80f5c38c36 | |||
| 205e09e2fc | 
							
								
								
									
										45
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								.drone.yml
									
									
									
									
									
								
							| @@ -12,6 +12,13 @@ get: | |||||||
|   path: odit-registry-builder |   path: odit-registry-builder | ||||||
|   name: password |   name: password | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | kind: secret | ||||||
|  | name: npm_url | ||||||
|  | get: | ||||||
|  |   path: odit-npm-cache | ||||||
|  |   name: url | ||||||
|  |  | ||||||
| --- | --- | ||||||
| kind: pipeline | kind: pipeline | ||||||
| type: kubernetes | type: kubernetes | ||||||
| @@ -26,7 +33,10 @@ steps: | |||||||
|         from_secret: docker_username |         from_secret: docker_username | ||||||
|       password: |       password: | ||||||
|         from_secret: docker_password |         from_secret: docker_password | ||||||
|       repo: registry.odit.services/lfk/selfservice |       build_args: | ||||||
|  |         - NPM_REGISTRY_URL: | ||||||
|  |           from_secret: npm_url | ||||||
|  |       repo: registry.odit.services/lfk/beamershow | ||||||
|       tags: |       tags: | ||||||
|         - dev |         - dev | ||||||
|       registry: registry.odit.services |       registry: registry.odit.services | ||||||
| @@ -37,6 +47,34 @@ trigger: | |||||||
|   event: |   event: | ||||||
|     - push |     - 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 | kind: pipeline | ||||||
| type: kubernetes | type: kubernetes | ||||||
| @@ -50,7 +88,10 @@ steps: | |||||||
|         from_secret: docker_username |         from_secret: docker_username | ||||||
|       password: |       password: | ||||||
|         from_secret: docker_password |         from_secret: docker_password | ||||||
|       repo: registry.odit.services/lfk/selfservice |       build_args: | ||||||
|  |         - NPM_REGISTRY_URL: | ||||||
|  |           from_secret: npm_url | ||||||
|  |       repo: registry.odit.services/lfk/beamershow | ||||||
|       tags: |       tags: | ||||||
|         - '${DRONE_TAG}' |         - '${DRONE_TAG}' | ||||||
|       registry: registry.odit.services |       registry: registry.odit.services | ||||||
|   | |||||||
							
								
								
									
										71
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,8 +2,79 @@ | |||||||
|  |  | ||||||
| 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.0.2](https://git.odit.services/lfk/beamershow/compare/1.0.1...1.0.2) | ||||||
|  |  | ||||||
|  | - 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) | ||||||
|  | - fix: typo [`8a4974f`](https://git.odit.services/lfk/beamershow/commit/8a4974ffa95b4d45f14c14130d7b7cb584c5cb52) | ||||||
|  | - format donation total [`431fc5a`](https://git.odit.services/lfk/beamershow/commit/431fc5a0474076568e9184d4c6b9819af6cc2e3f) | ||||||
|  | - default fallback on no data [`e04e671`](https://git.odit.services/lfk/beamershow/commit/e04e6713bc282810da2a0d103484cb6043af6063) | ||||||
|  | - formatting [`047941b`](https://git.odit.services/lfk/beamershow/commit/047941babbccb1f0674347babfa1468ac51fa487) | ||||||
|  | - monospace clock [`b50398f`](https://git.odit.services/lfk/beamershow/commit/b50398f6eb4e99e4d1c0d654e2710b265186837a) | ||||||
|  | - formatting [`ee97997`](https://git.odit.services/lfk/beamershow/commit/ee9799736f912f32e37e0d5d06a5591ec6180a31) | ||||||
|  | - improved clock position on xl [`0f32c71`](https://git.odit.services/lfk/beamershow/commit/0f32c71ef0e0267b2dc271507346c60b83eaa176) | ||||||
|  | - improved clock alignment [`4b1a1a3`](https://git.odit.services/lfk/beamershow/commit/4b1a1a324b865354472e45e0ef24230678be6111) | ||||||
|  | - fix container width [`5692969`](https://git.odit.services/lfk/beamershow/commit/569296928ee0a3c21844c183d74a36d759f65150) | ||||||
|  | - improved footer [`8d38e81`](https://git.odit.services/lfk/beamershow/commit/8d38e81b782252c84163aa87ec660199a2e2b065) | ||||||
|  | - updated width [`7005ec6`](https://git.odit.services/lfk/beamershow/commit/7005ec6a28b50763a5e4ee42a8d50e9953149168) | ||||||
|  | - drop "teams_distance" screen [`b483ed1`](https://git.odit.services/lfk/beamershow/commit/b483ed1e49aebbdfb59b41df75160a8acab546b2) | ||||||
|  | - improved empty state [`2ce93b4`](https://git.odit.services/lfk/beamershow/commit/2ce93b45c772284e59d84f063069e1546434bbc3) | ||||||
|  | - fix: width of general container [`b3ce711`](https://git.odit.services/lfk/beamershow/commit/b3ce711e6b8a8497ccbe6e5eea5ff1d6cd550e91) | ||||||
|  | - reload data every 90s [`456c063`](https://git.odit.services/lfk/beamershow/commit/456c0635a4fb5e129e94d4537fb735dc94933a12) | ||||||
|  |  | ||||||
|  | #### [0.1.5](https://git.odit.services/lfk/beamershow/compare/0.1.4...0.1.5) | ||||||
|  |  | ||||||
|  | > 29 March 2023 | ||||||
|  |  | ||||||
|  | - Switched dockerfile over to pnpm + cache [`701aae9`](https://git.odit.services/lfk/beamershow/commit/701aae9ed4af66b973e88fec384e46752fcb9ca2) | ||||||
|  | - Switched ci over to pnpm cache [`324612b`](https://git.odit.services/lfk/beamershow/commit/324612b5ddc1cf148a7750a02cdce557bef54d38) | ||||||
|  | - pinned dependencies [`d284e81`](https://git.odit.services/lfk/beamershow/commit/d284e8184c5a3c357398e3ab5a24a2e611001640) | ||||||
|  | - 🚀Bumped version to 0.1.5 [`5be665b`](https://git.odit.services/lfk/beamershow/commit/5be665b65fc021ae8ae544a965444cc29ec20e62) | ||||||
|  | - Docker copy all [`ca1c96b`](https://git.odit.services/lfk/beamershow/commit/ca1c96b252c9665b94dd9ef37c700afbb0039d46) | ||||||
|  |  | ||||||
|  | #### [0.1.4](https://git.odit.services/lfk/beamershow/compare/0.1.3...0.1.4) | ||||||
|  |  | ||||||
|  | > 5 February 2023 | ||||||
|  |  | ||||||
|  | - cleanup invalid track stuff (leftovers from scanclient) [`c485898`](https://git.odit.services/lfk/beamershow/commit/c485898b7db7ae09f6e405e12aa6d458833f2dcf) | ||||||
|  | - bullet-proof login ux [`ea08127`](https://git.odit.services/lfk/beamershow/commit/ea08127927e2b1ebcbcd7907fbf51a66a43da421) | ||||||
|  | - add rst command [`ee6af3e`](https://git.odit.services/lfk/beamershow/commit/ee6af3e06921ef33651076b8767149c2df3a1f2d) | ||||||
|  | - 🚀Bumped version to 0.1.4 [`7f7b743`](https://git.odit.services/lfk/beamershow/commit/7f7b743f414b77902a358b6bd813412096d195b3) | ||||||
|  | - Settings: reload on lang change [`e0f400a`](https://git.odit.services/lfk/beamershow/commit/e0f400a800f2652cf3edf2ac0a5f802b65d0c460) | ||||||
|  |  | ||||||
|  | #### [0.1.3](https://git.odit.services/lfk/beamershow/compare/0.1.2...0.1.3) | ||||||
|  |  | ||||||
|  | > 8 April 2021 | ||||||
|  |  | ||||||
|  | - 🚀Bumped version to 0.1.3 [`80f5c38`](https://git.odit.services/lfk/beamershow/commit/80f5c38c364c02d70a99f0e06ea9153e10438bfb) | ||||||
|  | - Fixed image name [`205e09e`](https://git.odit.services/lfk/beamershow/commit/205e09e2fc6a2a49251278a8ead31e1718ac7e44) | ||||||
|  |  | ||||||
| #### [0.1.2](https://git.odit.services/lfk/beamershow/compare/0.1.1...0.1.2) | #### [0.1.2](https://git.odit.services/lfk/beamershow/compare/0.1.1...0.1.2) | ||||||
|  |  | ||||||
|  | > 8 April 2021 | ||||||
|  |  | ||||||
|  | - 🚀Bumped version to 0.1.2 [`9125dec`](https://git.odit.services/lfk/beamershow/commit/9125dec45b41f80445cd6cc75436f5a63de2fd98) | ||||||
|  |  | ||||||
| #### 0.1.1 | #### 0.1.1 | ||||||
|  |  | ||||||
| > 7 April 2021 | > 7 April 2021 | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -1,12 +1,12 @@ | |||||||
| FROM node:15.11.0-alpine3.13 | FROM registry.odit.services/hub/library/node:19.8.1-alpine3.16 as build | ||||||
|  | ARG NPM_REGISTRY_URL=https://registry.npmjs.org | ||||||
| WORKDIR /app | WORKDIR /app | ||||||
| COPY . . |  | ||||||
| RUN yarn | COPY . ./ | ||||||
| RUN yarn build | RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@8 && pnpm i | ||||||
|  | RUN pnpm build | ||||||
|  |  | ||||||
| # final image | # final image | ||||||
| FROM alpine | FROM registry.odit.services/library/nginx-brotli:3.15 as final | ||||||
| COPY --from=0 /app/dist /app | COPY --from=build /app/dist /usr/share/nginx/html | ||||||
| FROM fholzer/nginx-brotli:v1.19.1 |  | ||||||
| COPY --from=1 /app /usr/share/nginx/html |  | ||||||
| COPY ./nginx.conf /etc/nginx/nginx.conf | COPY ./nginx.conf /etc/nginx/nginx.conf | ||||||
| @@ -6,6 +6,11 @@ | |||||||
|     <title>LfK!Beamershow</title> |     <title>LfK!Beamershow</title> | ||||||
|     <base href="./" /> |     <base href="./" /> | ||||||
|     <link rel="icon" type="image/png" href="./favicon.png" /> |     <link rel="icon" type="image/png" href="./favicon.png" /> | ||||||
|  |     <style> | ||||||
|  |       * { | ||||||
|  |         font-family: "Athiti", sans-serif; | ||||||
|  |       } | ||||||
|  |     </style> | ||||||
|   </head> |   </head> | ||||||
|  |  | ||||||
|   <body class="bg-white font-family-karla h-screen"> |   <body class="bg-white font-family-karla h-screen"> | ||||||
|   | |||||||
| @@ -1,3 +1,11 @@ | |||||||
|  | # @fontsource/athiti | ||||||
|  | **Author**: Lotus <declininglotus@gmail.com> | ||||||
|  | **Repo**: https://github.com/fontsource/fontsource | ||||||
|  | **License**: MIT | ||||||
|  | **Description**: Self-host the Athiti font in a neatly bundled NPM package. | ||||||
|  | ## License Text | ||||||
|  |   | ||||||
|  |  | ||||||
| # @odit/license-exporter | # @odit/license-exporter | ||||||
| **Author**: ODIT.Services | **Author**: ODIT.Services | ||||||
| **Repo**: https://git.odit.services/odit/license-exporter | **Repo**: https://git.odit.services/odit/license-exporter | ||||||
|   | |||||||
							
								
								
									
										99
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,48 +1,51 @@ | |||||||
| { | { | ||||||
| 	"name": "@lfk/beamershow", | 	"name": "@lfk/beamershow", | ||||||
| 	"version": "0.1.2", | 	"version": "1.0.2", | ||||||
| 	"scripts": { | 	"scripts": { | ||||||
| 		"dev": "vite", | 		"dev": "vite", | ||||||
| 		"build": "vite build", | 		"build": "vite build", | ||||||
| 		"format": "prettier --write --plugin-search-dir=. ./**/*.html ./**/*.svelte", | 		"format": "prettier --write --plugin-search-dir=. ./**/*.html ./**/*.svelte", | ||||||
| 		"prepare": "husky install", | 		"prepare": "husky install", | ||||||
| 		"license:export": "license-exporter --markdown && git stage licenses.md", | 		"license:export": "license-exporter --markdown && git stage licenses.md", | ||||||
| 		"release": "release-it --only-version" | 		"release": "release-it --only-version" | ||||||
| 	}, | 	}, | ||||||
| 	"devDependencies": { | 	"devDependencies": { | ||||||
| 		"@odit/license-exporter": "^0.0.11", | 		"@odit/license-exporter": "0.0.11", | ||||||
| 		"@svitejs/vite-plugin-svelte": "^0.11.1", | 		"@svitejs/vite-plugin-svelte": "0.11.1", | ||||||
| 		"@tsconfig/svelte": "^1.0.10", | 		"@tsconfig/svelte": "1.0.10", | ||||||
| 		"@types/html-minifier": "^4.0.0", | 		"@types/html-minifier": "4.0.0", | ||||||
| 		"axios": "^0.21.1", | 		"axios": "0.21.1", | ||||||
| 		"html-minifier": "^4.0.0", | 		"html-minifier": "4.0.0", | ||||||
| 		"husky": "^5.1.3", | 		"husky": "5.1.3", | ||||||
| 		"prettier": "^2.2.1", | 		"prettier": "2.2.1", | ||||||
| 		"prettier-plugin-svelte": "^2.2.0", | 		"prettier-plugin-svelte": "2.2.0", | ||||||
| 		"release-it": "14.5.0", | 		"release-it": "14.5.0", | ||||||
| 		"svelte": "3.36.0", | 		"svelte": "3.36.0", | ||||||
| 		"svelte-i18n": "3.3.9", | 		"svelte-i18n": "3.3.9", | ||||||
| 		"svelte-preprocess": "4.7.0", | 		"svelte-preprocess": "4.7.0", | ||||||
| 		"validator": "^13.5.2", | 		"validator": "13.5.2", | ||||||
| 		"vite": "2.1.4", | 		"vite": "2.1.4", | ||||||
| 		"vite-plugin-windicss": "0.11.2" | 		"vite-plugin-windicss": "1.8.10" | ||||||
| 	}, | 	}, | ||||||
| 	"release-it": { | 	"release-it": { | ||||||
| 		"git": { | 		"git": { | ||||||
| 			"commit": true, | 			"commit": true, | ||||||
| 			"requireCleanWorkingDir": false, | 			"requireCleanWorkingDir": false, | ||||||
| 			"commitMessage": "🚀Bumped version to ${version}", | 			"commitMessage": "🚀Bumped version to ${version}", | ||||||
| 			"requireBranch": "main", | 			"requireBranch": "main", | ||||||
| 			"push": false, | 			"push": true, | ||||||
| 			"tag": true, | 			"tag": true, | ||||||
| 			"tagName": null, | 			"tagName": null, | ||||||
| 			"tagAnnotation": "${version}" | 			"tagAnnotation": "${version}" | ||||||
| 		}, | 		}, | ||||||
| 		"npm": { | 		"npm": { | ||||||
| 			"publish": false | 			"publish": false | ||||||
| 		}, | 		}, | ||||||
| 		"hooks": { | 		"hooks": { | ||||||
| 			"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order.js  && git add src/locales" | 			"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order.js  && git add src/locales" | ||||||
| 		} | 		} | ||||||
| 	} | 	}, | ||||||
| } | 	"dependencies": { | ||||||
|  | 		"@fontsource/athiti": "^4.5.10" | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										2608
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										2608
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -12,12 +12,10 @@ | |||||||
|   import Login from "./Login.svelte"; |   import Login from "./Login.svelte"; | ||||||
|   import Settings from "./Settings.svelte"; |   import Settings from "./Settings.svelte"; | ||||||
|   export let settings_open = false; |   export let settings_open = false; | ||||||
|   $: is_configured = |   $: is_configured = $apikey?.length === 44 && $api_endpoint?.includes("://"); | ||||||
|     $apikey && |   // && | ||||||
|     $apikey !== "null" && |   // $laptime_track != 0 && | ||||||
|     $apikey !== "" && |   // $laptime_track != null; | ||||||
|     $laptime_track != 0 && |  | ||||||
|     $laptime_track != null; |  | ||||||
|   init({ |   init({ | ||||||
|     fallbackLocale: "en-US", |     fallbackLocale: "en-US", | ||||||
|     initialLocale: $lang, |     initialLocale: $lang, | ||||||
| @@ -29,12 +27,12 @@ | |||||||
|       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(); | ||||||
|         } |       //   } | ||||||
|       } |       // } | ||||||
|       if (command === "" && e.key === "c") { |       if (command === "" && e.key === "c") { | ||||||
|         command = "c"; |         command = "c"; | ||||||
|       } else if (command === "c" && e.key === "n") { |       } else if (command === "c" && e.key === "n") { | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| <script> | <script> | ||||||
|   import axios from "axios"; |   import axios from "axios"; | ||||||
|  |   import bg from "../public/beamershow_background.png?import"; | ||||||
|   import { _ } from "svelte-i18n"; |   import { _ } from "svelte-i18n"; | ||||||
|   import { slide } from "svelte/transition"; |   import { slide } from "svelte/transition"; | ||||||
|   import { apikey, api_endpoint, laptime_track } from "./store.js"; |   import { apikey, api_endpoint, laptime_track } from "./store.js"; | ||||||
| @@ -11,7 +12,7 @@ | |||||||
|     "runners_distance", |     "runners_distance", | ||||||
|     "runners_laptime", |     "runners_laptime", | ||||||
|     "orgs_distance", |     "orgs_distance", | ||||||
|     "teams_distance", |     // "teams_distance", | ||||||
|   ]; |   ]; | ||||||
|   $: current_page = "general"; |   $: current_page = "general"; | ||||||
|   $: general = {}; |   $: general = {}; | ||||||
| @@ -130,7 +131,7 @@ | |||||||
|   }, 1000); |   }, 1000); | ||||||
|   setInterval(() => { |   setInterval(() => { | ||||||
|     fetch_all(); |     fetch_all(); | ||||||
|   }, 15000); |   }, 90000); | ||||||
|   setInterval(() => { |   setInterval(() => { | ||||||
|     current_page = pages.cycle(current_page); |     current_page = pages.cycle(current_page); | ||||||
|   }, 20000); |   }, 20000); | ||||||
| @@ -138,230 +139,279 @@ | |||||||
|  |  | ||||||
| <div | <div | ||||||
|   class="min-h-screen flex items-center justify-center bg-gray-100" |   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;" |   style="background-image: url({bg});background-position: center;background-size: contain;background-repeat:no-repeat;" | ||||||
| > | > | ||||||
|   <div class="max-w-xl w-full"> |   <div class="w-full"> | ||||||
|     {#if current_page === "general"} |     <div class="w-3/4 xl:w-1/2 mx-auto"> | ||||||
|       <div transition:slide|local> |       <!--  --> | ||||||
|         <h1 class="mr-6 text-7xl font-semibold text-center text-gray-900"> |       {#if current_page === "general"} | ||||||
|           {hours}:{minutes}:{seconds} |         <div transition:slide|local> | ||||||
|         </h1> |           <h1 | ||||||
|         <!--  --> |             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900" | ||||||
|         <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"> |             Statistiken | ||||||
|             <h1 class="text-5xl font-semibold text-center text-gray-900"> |           </h1> | ||||||
|               {general.total_runners} |           <!--  --> | ||||||
|             </h1> |           <div class="flex flex-wrap -mx-1 overflow-hidden mt-5"> | ||||||
|             <h1 class="text-2xl font-semibold text-center text-gray-900"> |             <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||||
|               {$_("laeufer")} |               <h1 class="text-5xl font-bold text-center text-gray-900"> | ||||||
|             </h1> |                 {general.total_runners || "0"} | ||||||
|           </div> |               </h1> | ||||||
|           <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> |               <h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||||
|             <h1 class="text-5xl font-semibold text-center text-gray-900"> |                 {$_("laeufer")} | ||||||
|               {general.total_distance} |               </h1> | ||||||
|             </h1> |             </div> | ||||||
|             <h1 class="text-2xl font-semibold text-center text-gray-900"> |             <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||||
|               {$_("kilometer-gesamt")} |               <h1 class="text-5xl font-bold text-center text-gray-900"> | ||||||
|             </h1> |                 {general.total_distance || "0"} | ||||||
|           </div> |               </h1> | ||||||
|           <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> |               <h1 class="text-2xl font-semibold text-center text-gray-900"> | ||||||
|             <h1 class="text-5xl font-semibold text-center text-gray-900"> |                 {$_("kilometer-gesamt")} | ||||||
|               {general.total_donation} € |               </h1> | ||||||
|             </h1> |             </div> | ||||||
|             <h1 class="text-2xl font-semibold text-center text-gray-900"> |             <div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> | ||||||
|               {$_("spendensumme")} |               <h1 class="text-5xl font-bold text-center text-gray-900"> | ||||||
|             </h1> |                 {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> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       {:else if current_page === "runners_distance"} | ||||||
|     {:else if current_page === "runners_distance"} |         <div transition:slide|local> | ||||||
|       <div transition:slide|local> |           <h1 | ||||||
|         <h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5"> |             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||||
|           {$_("top-laeufer")} ({$_("distanz")}) |           > | ||||||
|         </h1> |             {$_("top-laeufer")} ({$_("distanz")}) | ||||||
|         <table class="table p-4 bg-white shadow rounded-lg w-full"> |           </h1> | ||||||
|           <thead> |           {#if runners_by_laptime.length === 0} | ||||||
|             <tr> |             <p class="w-full text-center text-3xl font-semibold"> | ||||||
|               <th |               Noch keine Daten... | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |             </p> | ||||||
|               > |           {:else} | ||||||
|                 {$_("platz")} |             <table | ||||||
|               </th> |               class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||||
|               <th |             > | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |               <thead> | ||||||
|               > |                 <tr> | ||||||
|                 {$_("laeufer")} |                   <th | ||||||
|               </th> |                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||||
|               <th |                   > | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |                     {$_("platz")} | ||||||
|               > |                   </th> | ||||||
|                 {$_("organisation")} |                   <th | ||||||
|               </th> |                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||||
|               <th |                   > | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |                     {$_("laeufer")} | ||||||
|               > |                   </th> | ||||||
|                 {$_("kilometer")} |                   <th | ||||||
|               </th> |                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||||
|             </tr> |                   > | ||||||
|           </thead> |                     {$_("organisation")} | ||||||
|           <tbody> |                   </th> | ||||||
|             {#each runners as r, i} |                   <th | ||||||
|               <tr class="text-gray-700"> |                     class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |                   > | ||||||
|                   {i + 1} |                     {$_("kilometer")} | ||||||
|                 </td> |                   </th> | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |                 </tr> | ||||||
|                   {r.firstname} |               </thead> | ||||||
|                   {r.lastname} |               <tbody> | ||||||
|                 </td> |                 {#each runners as r, i} | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |                   <tr class="text-gray-700"> | ||||||
|                   {r.group.name} |                     <td class="border p-4 dark:border-dark-5"> | ||||||
|                 </td> |                       {i + 1} | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |                     </td> | ||||||
|                   {r.distance / 1000} km |                     <td class="border p-4 dark:border-dark-5"> | ||||||
|                 </td> |                       {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> |               </tr> | ||||||
|             {/each} |             </thead> | ||||||
|           </tbody> |             <tbody> | ||||||
|         </table> |               {#each orgs as o, i} | ||||||
|       </div> |                 <tr class="text-gray-700"> | ||||||
|     {:else if current_page === "runners_laptime"} |                   <td class="border p-4 dark:border-dark-5"> | ||||||
|       <div transition:slide|local> |                     {i + 1} | ||||||
|         <h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5"> |                   </td> | ||||||
|           {$_("top-laeufer")} ({$_("rundenzeit")}) |                   <td class="border p-4 dark:border-dark-5"> | ||||||
|         </h1> |                     {o.name} | ||||||
|         <table class="table p-4 bg-white shadow rounded-lg w-full"> |                   </td> | ||||||
|           <thead> |                   <td class="border p-4 dark:border-dark-5"> | ||||||
|             <tr> |                     {o.distance / 1000} km | ||||||
|               <th |                   </td> | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |                 </tr> | ||||||
|               > |               {/each} | ||||||
|                 {$_("platz")} |             </tbody> | ||||||
|               </th> |           </table> | ||||||
|               <th |         </div> | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |       {:else if current_page === "teams_distance"} | ||||||
|               > |         <div transition:slide|local> | ||||||
|                 {$_("laeufer")} |           <h1 | ||||||
|               </th> |             class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" | ||||||
|               <th |           > | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |             {$_("top-teams")} | ||||||
|               > |           </h1> | ||||||
|                 {$_("organisation")} |           <table | ||||||
|               </th> |             class="table font-semibold p-4 bg-white shadow rounded-lg w-full" | ||||||
|               <th |           > | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |             <thead> | ||||||
|               > |               <tr> | ||||||
|                 {$_("schnellste-rundenzeit")} |                 <th | ||||||
|               </th> |                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||||
|             </tr> |                 > | ||||||
|           </thead> |                   {$_("platz")} | ||||||
|           <tbody> |                 </th> | ||||||
|             {#each runners_by_laptime as r, i} |                 <th | ||||||
|               <tr class="text-gray-700"> |                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |                 > | ||||||
|                   {i + 1} |                   {$_("team")} | ||||||
|                 </td> |                 </th> | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |                 <th | ||||||
|                   {r.firstname} |                   class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" | ||||||
|                   {r.lastname} |                 > | ||||||
|                 </td> |                   {$_("kilometer")} | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |                 </th> | ||||||
|                   {r.group.name} |  | ||||||
|                 </td> |  | ||||||
|                 <td class="border p-4 dark:border-dark-5"> |  | ||||||
|                   {format_laptime(r.minLaptime)} |  | ||||||
|                 </td> |  | ||||||
|               </tr> |               </tr> | ||||||
|             {/each} |             </thead> | ||||||
|           </tbody> |             <tbody> | ||||||
|         </table> |               {#each teams as t, i} | ||||||
|       </div> |                 <tr class="text-gray-700"> | ||||||
|     {:else if current_page === "orgs_distance"} |                   <td class="border p-4 dark:border-dark-5"> | ||||||
|       <div transition:slide|local> |                     {i + 1} | ||||||
|         <h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5"> |                   </td> | ||||||
|           {$_("top-organsiationen")} |                   <td class="border p-4 dark:border-dark-5"> | ||||||
|         </h1> |                     {t.name} | ||||||
|         <table class="table p-4 bg-white shadow rounded-lg w-full"> |                   </td> | ||||||
|           <thead> |                   <td class="border p-4 dark:border-dark-5"> | ||||||
|             <tr> |                     {t.distance / 1000} km | ||||||
|               <th |                   </td> | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |                 </tr> | ||||||
|               > |               {/each} | ||||||
|                 {$_("platz")} |             </tbody> | ||||||
|               </th> |           </table> | ||||||
|               <th |         </div> | ||||||
|                 class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" |       {:else} | ||||||
|               > |         <!-- content here --> | ||||||
|                 {$_("organsiation")} |       {/if} | ||||||
|               </th> |     </div> | ||||||
|               <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-7xl font-semibold text-center text-gray-900 mb-5"> |  | ||||||
|           {$_("top-teams")} |  | ||||||
|         </h1> |  | ||||||
|         <table class="table 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> | </div> | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| <script> | <script> | ||||||
|   import { apikey, lang, api_endpoint, laptime_track } from "./store.js"; |   import { apikey, lang, api_endpoint, laptime_track, clear } from "./store.js"; | ||||||
|   import isURL from "validator/lib/isURL"; |   import isURL from "validator/lib/isURL"; | ||||||
|   import isUUID from "validator/lib/isUUID"; |   import isUUID from "validator/lib/isUUID"; | ||||||
|   import axios from "axios"; |   import axios from "axios"; | ||||||
| @@ -10,10 +10,12 @@ | |||||||
|   $: error = false; |   $: error = false; | ||||||
|   $: errormessage = ""; |   $: errormessage = ""; | ||||||
|   $: isTokenValid = |   $: isTokenValid = | ||||||
|     token?.length === 44 && |     token === "rst" || | ||||||
|     token.split(".")[0].length === 7 && |     (token?.length === 44 && | ||||||
|     isUUID(token.split(".")[1]); |       token.split(".")[0].length === 7 && | ||||||
|   $: isEndpointValid = isURL(api_endpoint_input); |       isUUID(token.split(".")[1])); | ||||||
|  |   $: isEndpointValid = | ||||||
|  |     api_endpoint_input === "rst" || isURL(api_endpoint_input); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <div class="w-full flex flex-wrap"> | <div class="w-full flex flex-wrap"> | ||||||
| @@ -62,11 +64,15 @@ | |||||||
|           </div> |           </div> | ||||||
|         {/if} |         {/if} | ||||||
|       {/if} |       {/if} | ||||||
|       {#if $api_endpoint && !$apikey} |       {#if $api_endpoint?.includes("://") && (!$apikey || $apikey == null)} | ||||||
|         <form |         <form | ||||||
|           class="flex flex-col pt-3 md:pt-8" |           class="flex flex-col pt-3 md:pt-8" | ||||||
|           onsubmit="event.preventDefault();" |           onsubmit="event.preventDefault();" | ||||||
|           on:submit={() => { |           on:submit={() => { | ||||||
|  |             if (token === "rst") { | ||||||
|  |               clear(); | ||||||
|  |               return; | ||||||
|  |             } | ||||||
|             axios |             axios | ||||||
|               .request({ |               .request({ | ||||||
|                 method: "GET", |                 method: "GET", | ||||||
| @@ -112,42 +118,19 @@ | |||||||
|             >{$_("configure")}</button |             >{$_("configure")}</button | ||||||
|           > |           > | ||||||
|         </form> |         </form> | ||||||
|       {:else if $api_endpoint && $apikey} |  | ||||||
|         <form |  | ||||||
|           class="flex flex-col pt-3 md:pt-8" |  | ||||||
|           onsubmit="event.preventDefault();" |  | ||||||
|           on:submit={() => { |  | ||||||
|             laptime_track.set(track); |  | ||||||
|           }} |  | ||||||
|         > |  | ||||||
|           <div class="flex flex-col pt-4"> |  | ||||||
|             <label for="track" class="text-lg">{$_("track_id")}</label> |  | ||||||
|             <input |  | ||||||
|               type="number" |  | ||||||
|               id="track" |  | ||||||
|               placeholder="Track" |  | ||||||
|               bind:value={track} |  | ||||||
|               class:border-red-500={!isTokenValid} |  | ||||||
|               class:border-solid={!isTokenValid} |  | ||||||
|               class:border-3={!isTokenValid} |  | ||||||
|               class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mt-1 leading-tight focus:outline-none focus:shadow-outline" |  | ||||||
|             /> |  | ||||||
|           </div> |  | ||||||
|           <button |  | ||||||
|             disabled={!track} |  | ||||||
|             class:cursor-pointer={track} |  | ||||||
|             class:opacity-50={!track} |  | ||||||
|             id="configure" |  | ||||||
|             type="submit" |  | ||||||
|             class="bg-black text-white font-bold text-lg hover:bg-gray-700 p-2 mt-8 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black" |  | ||||||
|             >{$_("configure")}</button |  | ||||||
|           > |  | ||||||
|         </form> |  | ||||||
|       {:else} |       {:else} | ||||||
|         <form |         <form | ||||||
|           class="flex flex-col pt-3 md:pt-8" |           class="flex flex-col pt-3 md:pt-8" | ||||||
|           onsubmit="event.preventDefault();" |           onsubmit="event.preventDefault();" | ||||||
|           on:submit={() => { |           on:submit={() => { | ||||||
|  |             if (api_endpoint_input === "rst") { | ||||||
|  |               clear(); | ||||||
|  |               api_endpoint_input = ""; | ||||||
|  |               return; | ||||||
|  |             } | ||||||
|  |             if (api_endpoint_input.includes("api/")) { | ||||||
|  |               api_endpoint_input = api_endpoint_input.replace("api/", ""); | ||||||
|  |             } | ||||||
|             if (api_endpoint_input.substr(-1) !== "/") { |             if (api_endpoint_input.substr(-1) !== "/") { | ||||||
|               api_endpoint_input = api_endpoint_input + "/"; |               api_endpoint_input = api_endpoint_input + "/"; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -13,14 +13,13 @@ | |||||||
|   <p class="block text-sm text-gray-700">{$api_endpoint}</p> |   <p class="block text-sm text-gray-700">{$api_endpoint}</p> | ||||||
|   <p class="block text-sm font-bold text-gray-700 mt-2">{$_("api_key")}</p> |   <p class="block text-sm font-bold text-gray-700 mt-2">{$_("api_key")}</p> | ||||||
|   <p class="block text-sm text-gray-700">{$apikey}</p> |   <p class="block text-sm text-gray-700">{$apikey}</p> | ||||||
|   <p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_id")}</p> |  | ||||||
|   <p class="block text-sm text-gray-700">{$laptime_track}</p> |  | ||||||
|   <p class="block text-sm font-bold text-gray-700 mt-2">{$_("language")}</p> |   <p class="block text-sm font-bold text-gray-700 mt-2">{$_("language")}</p> | ||||||
|   <div class="w-full"> |   <div class="w-full"> | ||||||
|     <div class="inline-block mr-2 mt-2"> |     <div class="inline-block mr-2 mt-2"> | ||||||
|       <button |       <button | ||||||
|         on:click={() => { |         on:click={() => { | ||||||
|           lang.set("de-DE"); |           lang.set("de-DE"); | ||||||
|  |           location.reload(); | ||||||
|         }} |         }} | ||||||
|         type="button" |         type="button" | ||||||
|         class:bg-blue-700={$lang === "de-DE"} |         class:bg-blue-700={$lang === "de-DE"} | ||||||
| @@ -46,6 +45,7 @@ | |||||||
|       <button |       <button | ||||||
|         on:click={() => { |         on:click={() => { | ||||||
|           lang.set("en-EN"); |           lang.set("en-EN"); | ||||||
|  |           location.reload(); | ||||||
|         }} |         }} | ||||||
|         type="button" |         type="button" | ||||||
|         class:bg-blue-700={$lang === "en-EN"} |         class:bg-blue-700={$lang === "en-EN"} | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ | |||||||
|     "the_provided_scan_station_is_disabled": "Die angegebene Scanstation ist deaktiviert.", |     "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.", |     "the_provided_scan_station_token_is_invalid": "Der angegebene Scanstation-Token ist ungültig.", | ||||||
|     "top-laeufer": "Top-Läufer", |     "top-laeufer": "Top-Läufer", | ||||||
|     "top-organsiationen": "Top-Organsiationen", |     "top-organisationen": "Top-Organisationen", | ||||||
|     "top-teams": "Top-Teams", |     "top-teams": "Top-Teams", | ||||||
|     "track_distance": "Länge des Tracks", |     "track_distance": "Länge des Tracks", | ||||||
|     "track_id": "Track ID", |     "track_id": "Track ID", | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ | |||||||
|     "the_provided_scan_station_is_disabled": "The provided scan station is disabled.", |     "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.", |     "the_provided_scan_station_token_is_invalid": "The provided scan station token is invalid.", | ||||||
|     "top-laeufer": "Top runners", |     "top-laeufer": "Top runners", | ||||||
|     "top-organsiationen": "Top organizations", |     "top-organisationen": "Top organizations", | ||||||
|     "top-teams": "Top teams", |     "top-teams": "Top teams", | ||||||
|     "track_distance": "Track Distance", |     "track_distance": "Track Distance", | ||||||
|     "track_id": "Track ID", |     "track_id": "Track ID", | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| import App from './App.svelte'; | import App from './App.svelte'; | ||||||
| import 'windi.css'; | import 'windi.css'; | ||||||
|  | import "@fontsource/athiti" | ||||||
|  |  | ||||||
| const app = new App({ | const app = new App({ | ||||||
| 	target: document.body | 	target: document.body | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								src/store.js
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/store.js
									
									
									
									
									
								
							| @@ -1,29 +1,39 @@ | |||||||
| import { writable } from 'svelte/store'; | import { writable } from 'svelte/store'; | ||||||
|  |  | ||||||
| const stored_api_endpoint = localStorage.getItem('api_endpoint')||""; | const stored_api_endpoint = localStorage.getItem('api_endpoint'); | ||||||
| export const api_endpoint = writable(stored_api_endpoint); | export const api_endpoint = writable(stored_api_endpoint); | ||||||
| api_endpoint.subscribe((value) => { | api_endpoint.subscribe((value) => { | ||||||
| 	localStorage.setItem('api_endpoint', value); | 	if (value != null) { | ||||||
|  | 		localStorage.setItem('api_endpoint', value); | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
| const stored_apikey = localStorage.getItem('apikey'); | const stored_apikey = localStorage.getItem('apikey'); | ||||||
| export const apikey = writable(stored_apikey); | export const apikey = writable(stored_apikey); | ||||||
| apikey.subscribe((value) => { | apikey.subscribe((value) => { | ||||||
| 	localStorage.setItem('apikey', value); | 	if (value != null) { | ||||||
|  | 		localStorage.setItem('apikey', value); | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
| const stored_laptime_track = localStorage.getItem('laptime_track'); | const stored_laptime_track = localStorage.getItem('laptime_track'); | ||||||
| export const laptime_track = writable(stored_laptime_track); | export const laptime_track = writable(stored_laptime_track); | ||||||
| laptime_track.subscribe((value) => { | laptime_track.subscribe((value) => { | ||||||
| 	localStorage.setItem('laptime_track', value); | 	if (value != null) { | ||||||
|  | 		localStorage.setItem('laptime_track', value); | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
| const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang'); | const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang'); | ||||||
| export const lang = writable(stored_lang); | export const lang = writable(stored_lang); | ||||||
| lang.subscribe((value) => { | lang.subscribe((value) => { | ||||||
| 	localStorage.setItem('lang', value); | 	if (value != null) { | ||||||
|  | 		localStorage.setItem('lang', value); | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
|  |  | ||||||
| export function clear(){ | export function clear() { | ||||||
| 	api_endpoint.set(null) | 	api_endpoint.set(null) | ||||||
|  | 	api_endpoint.set("") | ||||||
| 	apikey.set(null); | 	apikey.set(null); | ||||||
|  | 	apikey.set(""); | ||||||
| 	laptime_track.set(null) | 	laptime_track.set(null) | ||||||
| 	localStorage.clear(); | 	localStorage.clear(); | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user