Compare commits
66 Commits
662e31b366
...
1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
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 | |||
| 9125dec45b | |||
| 94ceca9454 | |||
| 2119e9b231 | |||
| cfd64c2f19 | |||
| a7e84c7d42 | |||
| 70bfbfcd53 | |||
| c5e4facffa | |||
| b36764869b | |||
| de7e96cd01 | |||
| d5ce648a53 | |||
| fca7a99689 | |||
| cb559da57c | |||
| abdc510305 | |||
| fe0cba9058 | |||
| 64ce42d8a0 | |||
| fdabe4b79c | |||
| 70e5f172a6 | |||
| fa35ac8254 | |||
| 7f6134d0ef | |||
| ca48959581 | |||
| e5c51b956e | |||
| d809dcba79 | |||
| b42684f7fc | |||
| b3b06bc30e | |||
| c83ff39677 | |||
| 85b40c10bf | |||
| 10b862d43a | |||
| 3275ae2609 | |||
| 7184210ea4 | |||
| 3e7b1201e2 |
101
.drone.yml
Normal file
101
.drone.yml
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
"i18n-ally.localesPaths": "src/locales",
|
"i18n-ally.localesPaths": "src/locales",
|
||||||
"i18n-ally.keystyle": "nested"
|
"i18n-ally.keystyle": "nested",
|
||||||
|
"i18n-ally.sourceLanguage": "de"
|
||||||
}
|
}
|
||||||
100
CHANGELOG.md
Normal file
100
CHANGELOG.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
### Changelog
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
- 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)
|
||||||
|
- 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)
|
||||||
|
|
||||||
|
> 8 April 2021
|
||||||
|
|
||||||
|
- 🚀Bumped version to 0.1.2 [`9125dec`](https://git.odit.services/lfk/beamershow/commit/9125dec45b41f80445cd6cc75436f5a63de2fd98)
|
||||||
|
|
||||||
|
#### 0.1.1
|
||||||
|
|
||||||
|
> 7 April 2021
|
||||||
|
|
||||||
|
- Sorted translations 🌍 [`#1`](https://git.odit.services/lfk/beamershow/issues/1)
|
||||||
|
- 🎉 initial commit [`b902b08`](https://git.odit.services/lfk/beamershow/commit/b902b081d7e2e80fdf167657f3c2fda79b888985)
|
||||||
|
- formatting... [`866436f`](https://git.odit.services/lfk/beamershow/commit/866436fa82882dffe6f2f45bd303effc67d92a37)
|
||||||
|
- Added/updated settings translations [`b367648`](https://git.odit.services/lfk/beamershow/commit/b36764869bf1e302713d457b3ba3ec804c5d38f7)
|
||||||
|
- 🚀Bumped version to 0.1.1 [`94ceca9`](https://git.odit.services/lfk/beamershow/commit/94ceca9454da77d29f975cf894d2304dcc60c481)
|
||||||
|
- i18n run [`c5e4fac`](https://git.odit.services/lfk/beamershow/commit/c5e4facffa19578db95315d53bd0befc936016e4)
|
||||||
|
- Added drone file for dev and tag build [`d809dcb`](https://git.odit.services/lfk/beamershow/commit/d809dcba799a94c6ed5a6cfac551d14c1a2cbadd)
|
||||||
|
- You can now go back to config by typeing cnf [`9135090`](https://git.odit.services/lfk/beamershow/commit/9135090e73ff6fc021b4f7f80b3780b3ff73ad02)
|
||||||
|
- Added top teams by distance page [`d78e896`](https://git.odit.services/lfk/beamershow/commit/d78e896fecf5f7975267f3a1c3faf8b5c8728c25)
|
||||||
|
- Added nginx conf for dockerfile [`b3b06bc`](https://git.odit.services/lfk/beamershow/commit/b3b06bc30e4043d3f7b874e939a090f85841a516)
|
||||||
|
- Implemented fix for url crashing [`7f6134d`](https://git.odit.services/lfk/beamershow/commit/7f6134d0efd1a6a1161acc2c8bc8c4496c529ffe)
|
||||||
|
- Added html/template for the top runenry by laptime [`3275ae2`](https://git.odit.services/lfk/beamershow/commit/3275ae2609ef966183ca66a0234ff7f570eaef81)
|
||||||
|
- Added release comand and config [`ca48959`](https://git.odit.services/lfk/beamershow/commit/ca489595812da8756629a498d673e3206cb66a2f)
|
||||||
|
- Added track to config [`abdc510`](https://git.odit.services/lfk/beamershow/commit/abdc5103055844da73438e8dfbb0eea2b41105d1)
|
||||||
|
- removed unused stuff from the store [`cb559da`](https://git.odit.services/lfk/beamershow/commit/cb559da57c58a1998f54beb83bee837e0a8b71e7)
|
||||||
|
- Implemented settings dialog [`de7e96c`](https://git.odit.services/lfk/beamershow/commit/de7e96cd01f70bfff80f42e7c709e67d44681920)
|
||||||
|
- Added js part of runners by laptime [`10b862d`](https://git.odit.services/lfk/beamershow/commit/10b862d43ac35122c1cc4eaed30e7ac8228d294f)
|
||||||
|
- User quickstart docs README [`19cc7d0`](https://git.odit.services/lfk/beamershow/commit/19cc7d0c28ff56481fc37cc98b341259566a39ed)
|
||||||
|
- Removed license export from drone pipelines [`e5c51b9`](https://git.odit.services/lfk/beamershow/commit/e5c51b956e210f3f4652f020edefb0de5bb789d9)
|
||||||
|
- Formatting [`fca7a99`](https://git.odit.services/lfk/beamershow/commit/fca7a99689469f8a8b281f643346b3281036ee40)
|
||||||
|
- added svelte transitions [`1f95b8b`](https://git.odit.services/lfk/beamershow/commit/1f95b8ba53e3152517d730ad6b3b39dc472bb386)
|
||||||
|
- Added 2-staged dockerfile [`c83ff39`](https://git.odit.services/lfk/beamershow/commit/c83ff39677c4575346a0b7eced95796de90d6fee)
|
||||||
|
- Precommit hooks doing their best to not die [`85b40c1`](https://git.odit.services/lfk/beamershow/commit/85b40c10bffa15ad381e51fee348bb014780d5d8)
|
||||||
|
- Renamed Firma -> Organsiation [`3e7b120`](https://git.odit.services/lfk/beamershow/commit/3e7b1201e25da7dcc2f6be2b4b826b90d616dd67)
|
||||||
|
- Added beamershow docker-compose [`b42684f`](https://git.odit.services/lfk/beamershow/commit/b42684f7fc8e40740a6511d895af03f7f110e2a4)
|
||||||
|
- Updated release-it config [`cfd64c2`](https://git.odit.services/lfk/beamershow/commit/cfd64c2f19dabd8aa758aefd02342935c54e20de)
|
||||||
|
- Renamed Firma -Y Organsiation [`662e31b`](https://git.odit.services/lfk/beamershow/commit/662e31b36674f66696a4a4bc3ca4abae3efd93bb)
|
||||||
|
- CNF now opens settings [`d5ce648`](https://git.odit.services/lfk/beamershow/commit/d5ce648a53bb70a1c4ad7f2b12c334e328e36448)
|
||||||
|
- Added missing let [`70e5f17`](https://git.odit.services/lfk/beamershow/commit/70e5f172a66dcad64353f8469ebb845a1b4895bb)
|
||||||
|
- Added missing let [`fa35ac8`](https://git.odit.services/lfk/beamershow/commit/fa35ac8254028570bd3e425276a008fe83887f09)
|
||||||
|
- Updated release-it config [`a7e84c7`](https://git.odit.services/lfk/beamershow/commit/a7e84c7d426525a5041f0ec260cd57dcfd107afb)
|
||||||
|
- Added url validation fix [`64ce42d`](https://git.odit.services/lfk/beamershow/commit/64ce42d8a04cc4b149db7f75be5ff0d9fbfb3a75)
|
||||||
|
- removed useless console log [`fe0cba9`](https://git.odit.services/lfk/beamershow/commit/fe0cba9058a1874058618ef3b697093fcfc78a99)
|
||||||
15
Dockerfile
15
Dockerfile
@@ -1,5 +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
|
||||||
|
FROM registry.odit.services/library/nginx-brotli:3.15 as final
|
||||||
|
COPY --from=build /app/dist /usr/share/nginx/html
|
||||||
|
COPY ./nginx.conf /etc/nginx/nginx.conf
|
||||||
7
docker-compose.yml
Normal file
7
docker-compose.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
httpd:
|
||||||
|
build: .
|
||||||
|
#image: registry.odit.services/lfk/beamershow:latest
|
||||||
|
ports:
|
||||||
|
- 4052:80
|
||||||
@@ -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">
|
||||||
|
|||||||
65
licenses.md
65
licenses.md
@@ -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
|
||||||
@@ -222,6 +230,35 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||||||
SOFTWARE.
|
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
|
# svelte
|
||||||
**Author**: Rich Harris
|
**Author**: Rich Harris
|
||||||
**Repo**: https://github.com/sveltejs/svelte
|
**Repo**: https://github.com/sveltejs/svelte
|
||||||
@@ -267,6 +304,34 @@ The above copyright notice and this permission notice shall be included in all c
|
|||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
# validator
|
||||||
|
**Author**: Chris O'Hara <cohara87@gmail.com>
|
||||||
|
**Repo**: https://github.com/chriso/validator.js
|
||||||
|
**License**: MIT
|
||||||
|
**Description**: String validation and sanitization
|
||||||
|
## License Text
|
||||||
|
Copyright (c) 2018 Chris O'Hara <cohara87@gmail.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
# vite
|
# vite
|
||||||
**Author**: Evan You
|
**Author**: Evan You
|
||||||
**Repo**: https://github.com/vitejs/vite
|
**Repo**: https://github.com/vitejs/vite
|
||||||
|
|||||||
60
nginx.conf
Normal file
60
nginx.conf
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
events {
|
||||||
|
}
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
sendfile on;
|
||||||
|
server {
|
||||||
|
error_page 404 /index.html;
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
location = /index.html {
|
||||||
|
add_header Cache-Control 'no-store';
|
||||||
|
}
|
||||||
|
location = / {
|
||||||
|
add_header Cache-Control 'no-store';
|
||||||
|
}
|
||||||
|
location = /env.js {
|
||||||
|
add_header Cache-Control 'no-store';
|
||||||
|
}
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
location ~* \.(?:ico|css|gif|jpe?g|png)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Pragma public;
|
||||||
|
add_header Cache-Control "public";
|
||||||
|
}
|
||||||
|
# --- Brotli
|
||||||
|
brotli on;
|
||||||
|
brotli_comp_level 6;
|
||||||
|
brotli_static on;
|
||||||
|
brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
|
||||||
|
# --- GZIP
|
||||||
|
gzip on;
|
||||||
|
gzip_disable "msie6";
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_buffers 16 8k;
|
||||||
|
gzip_http_version 1.1;
|
||||||
|
gzip_types application/javascript
|
||||||
|
application/rss+xml
|
||||||
|
application/vnd.ms-fontobject
|
||||||
|
application/x-font
|
||||||
|
application/x-font-opentype
|
||||||
|
application/x-font-otf
|
||||||
|
application/x-font-truetype
|
||||||
|
application/x-font-ttf
|
||||||
|
application/x-javascript
|
||||||
|
application/xhtml+xml
|
||||||
|
application/xml
|
||||||
|
font/opentype
|
||||||
|
font/otf
|
||||||
|
font/ttf
|
||||||
|
image/svg+xml
|
||||||
|
image/x-icon
|
||||||
|
text/css
|
||||||
|
text/javascript
|
||||||
|
text/plain
|
||||||
|
text/xml;
|
||||||
|
}
|
||||||
|
}
|
||||||
48
package.json
48
package.json
@@ -1,27 +1,51 @@
|
|||||||
{
|
{
|
||||||
"name": "@lfk/beamershow",
|
"name": "@lfk/beamershow",
|
||||||
"version": "0.0.0",
|
"version": "1.0.0",
|
||||||
"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"
|
||||||
},
|
},
|
||||||
"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",
|
||||||
"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",
|
||||||
"vite": "2.1.4",
|
"vite": "2.1.4",
|
||||||
"vite-plugin-windicss": "0.11.2"
|
"vite-plugin-windicss": "1.8.10"
|
||||||
|
},
|
||||||
|
"release-it": {
|
||||||
|
"git": {
|
||||||
|
"commit": true,
|
||||||
|
"requireCleanWorkingDir": false,
|
||||||
|
"commitMessage": "🚀Bumped version to ${version}",
|
||||||
|
"requireBranch": "main",
|
||||||
|
"push": false,
|
||||||
|
"tag": true,
|
||||||
|
"tagName": null,
|
||||||
|
"tagAnnotation": "${version}"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"publish": false
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"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
@@ -1,5 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import { apikey, api_endpoint, lang, page, clear } from "./store.js";
|
import { apikey, api_endpoint, lang, clear, laptime_track } from "./store.js";
|
||||||
import { addMessages, init } from "svelte-i18n";
|
import { addMessages, init } from "svelte-i18n";
|
||||||
import en from "./locales/en.json";
|
import en from "./locales/en.json";
|
||||||
import de from "./locales/de.json";
|
import de from "./locales/de.json";
|
||||||
@@ -11,8 +11,11 @@
|
|||||||
import Beamershow from "./Beamershow.svelte";
|
import Beamershow from "./Beamershow.svelte";
|
||||||
import Login from "./Login.svelte";
|
import Login from "./Login.svelte";
|
||||||
import Settings from "./Settings.svelte";
|
import Settings from "./Settings.svelte";
|
||||||
$: is_configured = $apikey && $apikey !== "null" && $apikey !== "";
|
export let settings_open = false;
|
||||||
$: settings_open = $page === "settings";
|
$: is_configured = $apikey?.length === 44 && $api_endpoint?.includes("://");
|
||||||
|
// &&
|
||||||
|
// $laptime_track != 0 &&
|
||||||
|
// $laptime_track != null;
|
||||||
init({
|
init({
|
||||||
fallbackLocale: "en-US",
|
fallbackLocale: "en-US",
|
||||||
initialLocale: $lang,
|
initialLocale: $lang,
|
||||||
@@ -24,20 +27,18 @@
|
|||||||
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") {
|
||||||
command += "n";
|
command += "n";
|
||||||
} else if (command === "cn" && e.key === "f") {
|
} else if (command === "cn" && e.key === "f") {
|
||||||
clear();
|
|
||||||
settings_open = true;
|
settings_open = true;
|
||||||
is_configured = true;
|
|
||||||
command = "";
|
command = "";
|
||||||
} else {
|
} else {
|
||||||
command = "";
|
command = "";
|
||||||
@@ -48,7 +49,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if settings_open && is_configured}
|
{#if settings_open && is_configured}
|
||||||
<Settings />
|
<Settings bind:settings_open />
|
||||||
{:else if is_configured}
|
{:else if is_configured}
|
||||||
<Beamershow />
|
<Beamershow />
|
||||||
{:else}
|
{:else}
|
||||||
|
|||||||
@@ -1,15 +1,22 @@
|
|||||||
<script>
|
<script>
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { fade, slide } from "svelte/transition";
|
import { slide } from "svelte/transition";
|
||||||
import { apikey, api_endpoint, page, stationinfo } from "./store.js";
|
import { apikey, api_endpoint, laptime_track } from "./store.js";
|
||||||
function init(el) {
|
function init(el) {
|
||||||
el.focus();
|
el.focus();
|
||||||
}
|
}
|
||||||
$: pages = ["general", "runners_distance", "orgs_distance", "teams_distance"];
|
$: pages = [
|
||||||
|
"general",
|
||||||
|
"runners_distance",
|
||||||
|
"runners_laptime",
|
||||||
|
"orgs_distance",
|
||||||
|
// "teams_distance",
|
||||||
|
];
|
||||||
$: current_page = "general";
|
$: current_page = "general";
|
||||||
$: general = {};
|
$: general = {};
|
||||||
$: runners = [];
|
$: runners = [];
|
||||||
|
$: runners_by_laptime = [];
|
||||||
$: orgs = [];
|
$: orgs = [];
|
||||||
$: teams = [];
|
$: teams = [];
|
||||||
|
|
||||||
@@ -17,6 +24,23 @@
|
|||||||
$: hours = (time.getHours() + "").padStart(2, "0");
|
$: hours = (time.getHours() + "").padStart(2, "0");
|
||||||
$: minutes = (time.getMinutes() + "").padStart(2, "0");
|
$: minutes = (time.getMinutes() + "").padStart(2, "0");
|
||||||
$: seconds = (time.getSeconds() + "").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() {
|
function stats_general() {
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
@@ -45,6 +69,21 @@
|
|||||||
console.log(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() {
|
function stats_orgs() {
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
@@ -81,6 +120,7 @@
|
|||||||
function fetch_all() {
|
function fetch_all() {
|
||||||
stats_general();
|
stats_general();
|
||||||
stats_runners();
|
stats_runners();
|
||||||
|
stats_runners_by_laptime();
|
||||||
stats_orgs();
|
stats_orgs();
|
||||||
stats_teams();
|
stats_teams();
|
||||||
}
|
}
|
||||||
@@ -90,7 +130,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);
|
||||||
@@ -100,177 +140,277 @@
|
|||||||
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('/beamershow_background.png');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">
|
||||||
Läufer
|
<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-Läufer
|
>
|
||||||
</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>
|
||||||
Läufer
|
<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>
|
||||||
Firma
|
<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 === "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>
|
{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>
|
||||||
Organsiation
|
<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>
|
||||||
Kilometer
|
<table
|
||||||
</th>
|
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
|
||||||
</tr>
|
>
|
||||||
</thead>
|
<thead>
|
||||||
<tbody>
|
<tr>
|
||||||
{#each orgs as o, 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}
|
{$_("platz")}
|
||||||
</td>
|
</th>
|
||||||
<td class="border p-4 dark:border-dark-5">
|
<th
|
||||||
{o.name}
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
</td>
|
>
|
||||||
<td class="border p-4 dark:border-dark-5">
|
{$_("team")}
|
||||||
{o.distance / 1000} km
|
</th>
|
||||||
</td>
|
<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 teams as t, i}
|
||||||
</div>
|
<tr class="text-gray-700">
|
||||||
{:else if current_page === "teams_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-Teams
|
<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 -->
|
||||||
Team
|
{/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 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,39 +1,21 @@
|
|||||||
<script>
|
<script>
|
||||||
import { apikey, lang, stationinfo, api_endpoint } from "./store.js";
|
import { apikey, lang, api_endpoint, laptime_track, clear } from "./store.js";
|
||||||
|
import isURL from "validator/lib/isURL";
|
||||||
|
import isUUID from "validator/lib/isUUID";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { _, locale } from "svelte-i18n";
|
import { _, locale } from "svelte-i18n";
|
||||||
let token;
|
let token;
|
||||||
let api_endpoint_input;
|
let api_endpoint_input = "";
|
||||||
|
let track;
|
||||||
$: 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 = validURL(api_endpoint_input);
|
isUUID(token.split(".")[1]));
|
||||||
function validURL(str) {
|
$: isEndpointValid =
|
||||||
var pattern = new RegExp(
|
api_endpoint_input === "rst" || isURL(api_endpoint_input);
|
||||||
"^(https?:\\/\\/)?" + // protocol
|
|
||||||
"((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name
|
|
||||||
"((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address
|
|
||||||
"(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path
|
|
||||||
"(\\?[;&a-z\\d%_.~+=-]*)?" + // query string
|
|
||||||
"(\\#[-a-z\\d_]*)?$",
|
|
||||||
"i"
|
|
||||||
); // fragment locator
|
|
||||||
return !!pattern.test(str);
|
|
||||||
}
|
|
||||||
function isUUID(uuid) {
|
|
||||||
let s = "" + uuid;
|
|
||||||
|
|
||||||
s = s.match(
|
|
||||||
"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
|
|
||||||
);
|
|
||||||
if (s === null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="w-full flex flex-wrap">
|
<div class="w-full flex flex-wrap">
|
||||||
@@ -82,13 +64,15 @@
|
|||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
{#if $api_endpoint}
|
{#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={() => {
|
||||||
console.log({ token });
|
if (token === "rst") {
|
||||||
// return
|
clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
@@ -99,7 +83,6 @@
|
|||||||
error = false;
|
error = false;
|
||||||
errormessage = "";
|
errormessage = "";
|
||||||
apikey.set(token);
|
apikey.set(token);
|
||||||
stationinfo.set(JSON.stringify(response.data));
|
|
||||||
})
|
})
|
||||||
.catch(function (e) {
|
.catch(function (e) {
|
||||||
error = true;
|
error = true;
|
||||||
@@ -140,6 +123,14 @@
|
|||||||
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 + "/";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
|
import { apikey, api_endpoint, lang, laptime_track, clear } from "./store.js";
|
||||||
import { apikey, api_endpoint, lang, page, stationinfo } from "./store.js";
|
export let settings_open = false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="p-5 min-h-screen">
|
<div class="p-5 min-h-screen">
|
||||||
@@ -9,40 +9,17 @@
|
|||||||
Lauf Für Kaya! Beamershow
|
Lauf Für Kaya! Beamershow
|
||||||
</h1>
|
</h1>
|
||||||
<h1 class="text-3xl w-full text-center text-gray-900">{$_("settings")}</h1>
|
<h1 class="text-3xl w-full text-center text-gray-900">{$_("settings")}</h1>
|
||||||
|
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("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">
|
|
||||||
{$_("station_description")}
|
|
||||||
</p>
|
|
||||||
<p class="block text-sm text-gray-700">
|
|
||||||
{JSON.parse($stationinfo).description}
|
|
||||||
</p>
|
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("station_id")}</p>
|
|
||||||
<p class="block text-sm text-gray-700">{JSON.parse($stationinfo).id}</p>
|
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_id")}</p>
|
|
||||||
<p class="block text-sm text-gray-700">{JSON.parse($stationinfo).track.id}</p>
|
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_name")}</p>
|
|
||||||
<p class="block text-sm text-gray-700">
|
|
||||||
{JSON.parse($stationinfo).track.name}
|
|
||||||
</p>
|
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">
|
|
||||||
{$_("track_distance")}
|
|
||||||
</p>
|
|
||||||
<p class="block text-sm text-gray-700">
|
|
||||||
{JSON.parse($stationinfo).track.distance}
|
|
||||||
</p>
|
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">
|
|
||||||
{$_("minimum_lap_time")}
|
|
||||||
</p>
|
|
||||||
<p class="block text-sm text-gray-700">
|
|
||||||
{JSON.parse($stationinfo).track.minimumLapTime}s
|
|
||||||
</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"}
|
||||||
@@ -68,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"}
|
||||||
@@ -95,16 +73,15 @@
|
|||||||
<br />
|
<br />
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
page.set("");
|
settings_open = false;
|
||||||
}}
|
}}
|
||||||
class="mb-3 w-full py-3 border-black border-3 text-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
|
class="mb-3 w-full py-3 border-black border-3 text-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
|
||||||
>{$_("back_to_scanner")}</button
|
>{$_("back_to_scanner")}</button
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
apikey.set("");
|
clear();
|
||||||
api_endpoint.set("");
|
settings_open = false;
|
||||||
page.set("");
|
|
||||||
}}
|
}}
|
||||||
class="w-full py-3 bg-black text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
|
class="w-full py-3 bg-black text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
|
||||||
>{$_("log_out_from_this_client")}</button
|
>{$_("log_out_from_this_client")}</button
|
||||||
|
|||||||
@@ -1,27 +1,41 @@
|
|||||||
{
|
{
|
||||||
"api_endpoint": "API-Endpunkt",
|
"api_endpoint": "API-Endpunkt",
|
||||||
"api_key": "API Key",
|
"api_key": "API Key",
|
||||||
"back_to_scanner": "Zurück zum Scanner",
|
"back_to_scanner": "Zurück zur Beamershow",
|
||||||
"client_token": "Client Token",
|
"client_token": "Client Token",
|
||||||
"configuration": "Konfiguration",
|
"configuration": "Konfiguration",
|
||||||
"configure": "Konfigurieren",
|
"configure": "Konfigurieren",
|
||||||
|
"distanz": "Distanz",
|
||||||
"error": "Error!",
|
"error": "Error!",
|
||||||
|
"kilometer": "Kilometer",
|
||||||
|
"kilometer-gesamt": "Kilometer gesamt",
|
||||||
|
"laeufer": "Läufer",
|
||||||
"language": "Sprache",
|
"language": "Sprache",
|
||||||
"log_out_from_this_client": "Von diesem Scanner abmelden",
|
"log_out_from_this_client": "Von dieser Beamershow abmelden",
|
||||||
"minimum_lap_time": "minimale Rundenzeit",
|
"minimum_lap_time": "minimale Rundenzeit",
|
||||||
|
"organisation": "Organisation",
|
||||||
|
"organsiation": "Organsiation",
|
||||||
|
"platz": "Platz",
|
||||||
"please_check_your_token_and_try_again": "Bitte überprüfe den Token und versuche es erneut...",
|
"please_check_your_token_and_try_again": "Bitte überprüfe den Token und versuche es erneut...",
|
||||||
"please_provide_a_valid_client_api_endpoint": "Bitte gebe einen gültigen API-Endpunkt an ...",
|
"please_provide_a_valid_client_api_endpoint": "Bitte gebe einen gültigen API-Endpunkt an ...",
|
||||||
"please_provide_a_valid_client_token": "Bitte gebe einen gültigen Client-Token an ...",
|
"please_provide_a_valid_client_token": "Bitte gebe einen gültigen Client-Token an ...",
|
||||||
"please_provide_the_scan_client_token": "Bitte gebe den Beamershow-Client-Token an.",
|
"please_provide_the_scan_client_token": "Bitte gebe den Beamershow-Client-Token an.",
|
||||||
"please_scan_a_card": "Bitte scanne eine Karte ...",
|
"please_scan_a_card": "Bitte scanne eine Karte ...",
|
||||||
|
"rundenzeit": "Rundenzeit",
|
||||||
"runner_card": "Läuferkarte",
|
"runner_card": "Läuferkarte",
|
||||||
"scan": "Scannen!",
|
"scan": "Scannen!",
|
||||||
|
"schnellste-rundenzeit": "Schnellste Rundenzeit",
|
||||||
"see_our_configuration_guide": "Siehe dir unsere Konfigurationsanleitung an.",
|
"see_our_configuration_guide": "Siehe dir unsere Konfigurationsanleitung an.",
|
||||||
"settings": "Einstellungen",
|
"settings": "Einstellungen",
|
||||||
|
"spendensumme": "Spendensumme",
|
||||||
"station_description": "Beschreibung der Scanstation",
|
"station_description": "Beschreibung der Scanstation",
|
||||||
"station_id": "Scanstations-ID",
|
"station_id": "Scanstations-ID",
|
||||||
|
"team": "Team",
|
||||||
"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-organisationen": "Top-Organisationen",
|
||||||
|
"top-teams": "Top-Teams",
|
||||||
"track_distance": "Länge des Tracks",
|
"track_distance": "Länge des Tracks",
|
||||||
"track_id": "Track ID",
|
"track_id": "Track ID",
|
||||||
"track_name": "Track Name"
|
"track_name": "Track Name"
|
||||||
|
|||||||
@@ -1,27 +1,41 @@
|
|||||||
{
|
{
|
||||||
"api_endpoint": "API Endpoint",
|
"api_endpoint": "API Endpoint",
|
||||||
"api_key": "API Key",
|
"api_key": "API Key",
|
||||||
"back_to_scanner": "Back to Scanner",
|
"back_to_scanner": "Back to Beamershow",
|
||||||
"client_token": "Client Token",
|
"client_token": "Client Token",
|
||||||
"configuration": "Configuration",
|
"configuration": "Configuration",
|
||||||
"configure": "Configure",
|
"configure": "Configure",
|
||||||
|
"distanz": "distance",
|
||||||
"error": "Error!",
|
"error": "Error!",
|
||||||
|
"kilometer": "Kilometers",
|
||||||
|
"kilometer-gesamt": "Kilometers total",
|
||||||
|
"laeufer": "Runners",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"log_out_from_this_client": "Log Out from this Client",
|
"log_out_from_this_client": "Log Out from this Client",
|
||||||
"minimum_lap_time": "minimum lap time",
|
"minimum_lap_time": "minimum lap time",
|
||||||
|
"organisation": "Organization",
|
||||||
|
"organsiation": "Organization",
|
||||||
|
"platz": "Place",
|
||||||
"please_check_your_token_and_try_again": "Please check your token and try again...",
|
"please_check_your_token_and_try_again": "Please check your token and try again...",
|
||||||
"please_provide_a_valid_client_api_endpoint": "Please provide a valid api endpoint...",
|
"please_provide_a_valid_client_api_endpoint": "Please provide a valid api endpoint...",
|
||||||
"please_provide_a_valid_client_token": "Please provide a valid client token...",
|
"please_provide_a_valid_client_token": "Please provide a valid client token...",
|
||||||
"please_provide_the_scan_client_token": "Please provide the scan client token.",
|
"please_provide_the_scan_client_token": "Please provide the scan client token.",
|
||||||
"please_scan_a_card": "please scan a card...",
|
"please_scan_a_card": "please scan a card...",
|
||||||
|
"rundenzeit": "fastetst lap",
|
||||||
"runner_card": "Runner Card",
|
"runner_card": "Runner Card",
|
||||||
"scan": "Scan!",
|
"scan": "Scan!",
|
||||||
|
"schnellste-rundenzeit": "Fastest lap",
|
||||||
"see_our_configuration_guide": "See our configuration guide.",
|
"see_our_configuration_guide": "See our configuration guide.",
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
|
"spendensumme": "Donations",
|
||||||
"station_description": "Station Description",
|
"station_description": "Station Description",
|
||||||
"station_id": "Scanstation ID",
|
"station_id": "Scanstation ID",
|
||||||
|
"team": "Team",
|
||||||
"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-organisationen": "Top organizations",
|
||||||
|
"top-teams": "Top teams",
|
||||||
"track_distance": "Track Distance",
|
"track_distance": "Track Distance",
|
||||||
"track_id": "Track ID",
|
"track_id": "Track ID",
|
||||||
"track_name": "Track Name"
|
"track_name": "Track Name"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
34
src/store.js
34
src/store.js
@@ -1,33 +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_stationinfo = localStorage.getItem('stationinfo');
|
const stored_laptime_track = localStorage.getItem('laptime_track');
|
||||||
export const stationinfo = writable(stored_stationinfo);
|
export const laptime_track = writable(stored_laptime_track);
|
||||||
stationinfo.subscribe((value) => {
|
laptime_track.subscribe((value) => {
|
||||||
localStorage.setItem('stationinfo', value);
|
if (value != null) {
|
||||||
});
|
localStorage.setItem('laptime_track', value);
|
||||||
const stored_page = localStorage.getItem('page');
|
}
|
||||||
export const page = writable(stored_page);
|
|
||||||
page.subscribe((value) => {
|
|
||||||
localStorage.setItem('page', 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)
|
||||||
localStorage.clear();
|
localStorage.clear();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user