62 Commits
0.1.2 ... 1.0.7

Author SHA1 Message Date
1652e54ac6 chore: release 1.0.7
Some checks failed
Build release images / build-container (push) Failing after 11s
2025-04-04 22:28:35 +02:00
52528d31a4 chore: release 1.0.6 2025-04-04 22:27:47 +02:00
e6ff8ef80b ci: move to gitea actions 2025-04-04 22:27:16 +02:00
aa707ff0cc chore: update readme 2025-04-04 22:27:05 +02:00
dc0488b1b7 chore(deps). bump 2025-04-04 22:26:59 +02:00
4920da1df1 ci: change release message 2025-04-04 22:26:45 +02:00
f9a84f798b fix: i18n 2025-04-04 22:18:59 +02:00
c6f7210196 feat: show org names for teams_distance slide 2025-04-04 22:16:59 +02:00
c286969a9d chore(deps): pnpm@10 2025-04-04 22:15:35 +02:00
14ae9e49fb fix(login): bg image 2025-04-04 22:15:08 +02:00
4874b22796 🚀Bumped version to 1.0.5 2024-12-18 18:20:27 +01:00
72d34cbfd7 chore: remove husky 2024-12-18 18:20:08 +01:00
b10e964ad9 feat(footer): cleaned up text 2024-12-18 18:19:03 +01:00
919b2956ab feat: improved background img import 2024-12-18 18:18:46 +01:00
c4ad18cb4f chore(deps): pnpm@9 + node@23 2024-12-18 18:18:27 +01:00
ab4f82ccf1 chore(deps): bump some 2024-12-18 18:18:14 +01:00
1235776a62 feat(ci)!: Switched to woodpecker
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2023-11-06 20:04:30 +01:00
4a1e26663e 🚀Bumped version to 1.0.4
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 23:27:06 +02:00
2bdbd00189 fix: formatting of total km
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 23:26:48 +02:00
85e7b7c231 🚀Bumped version to 1.0.3
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 23:01:24 +02:00
d5f685a826 cleanup loading 2023-04-15 23:01:07 +02:00
88449174a1 drop laptime runner stats, fix runner distance page 2023-04-15 23:00:44 +02:00
d30be90102 🚀Bumped version to 1.0.2
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 22:47:58 +02:00
7e3570e923 updated release config
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 22:47:42 +02:00
3ac0a3c142 🚀Bumped version to 1.0.1
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 22:44:31 +02:00
dc588e83c0 fix bg image? 2023-04-15 22:44:11 +02:00
5d764a80a7 🚀Bumped version to 1.0.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 21:15:42 +02:00
0f32c71ef0 improved clock position on xl
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 21:14:09 +02:00
4b1a1a324b improved clock alignment 2023-04-15 21:12:42 +02:00
569296928e fix container width 2023-04-15 21:12:34 +02:00
c33157e2d4 bump windicss 2023-04-15 21:12:25 +02:00
ee9799736f formatting 2023-04-15 21:04:09 +02:00
8d38e81b78 improved footer 2023-04-15 21:04:01 +02:00
7005ec6a28 updated width 2023-04-15 21:01:32 +02:00
38b0fccb5a fix: font responsiveness 2023-04-15 20:59:28 +02:00
8a4974ffa9 fix: typo 2023-04-15 20:59:02 +02:00
9b83b38356 text responsiveness 2023-04-15 20:54:40 +02:00
047941babb formatting 2023-04-15 20:54:03 +02:00
f909575ca5 1 more empty state 2023-04-15 20:53:54 +02:00
70a6120447 update font to match lfk 2023 branding
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 20:45:28 +02:00
b483ed1e49 drop "teams_distance" screen 2023-04-15 20:39:20 +02:00
2ce93b45c7 improved empty state 2023-04-15 20:39:04 +02:00
8139a3f60b add empty state for runners_laptime
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 20:37:26 +02:00
431fc5a047 format donation total
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 20:34:29 +02:00
b287db4d0a pin clock to bottom
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 20:34:14 +02:00
b3ce711e6b fix: width of general container 2023-04-15 20:26:22 +02:00
456c0635a4 reload data every 90s
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-15 20:02:06 +02:00
b50398f6eb monospace clock 2023-04-15 20:01:55 +02:00
e04e6713bc default fallback on no data 2023-04-15 20:01:49 +02:00
de373390ba updated pnpm lock 2023-04-15 20:01:34 +02:00
5be665b65f 🚀Bumped version to 0.1.5
All checks were successful
continuous-integration/drone/push Build is passing
2023-03-29 20:09:39 +02:00
324612b5dd Switched ci over to pnpm cache
All checks were successful
continuous-integration/drone/push Build is passing
2023-03-29 20:08:19 +02:00
ca1c96b252 Docker copy all 2023-03-29 20:06:46 +02:00
d284e8184c pinned dependencies 2023-03-29 20:06:26 +02:00
701aae9ed4 Switched dockerfile over to pnpm + cache
And bumped build image to fresh node
2023-03-29 20:05:12 +02:00
7f7b743f41 🚀Bumped version to 0.1.4 2023-02-05 13:30:11 +01:00
ee6af3e069 add rst command 2023-02-05 13:29:35 +01:00
ea08127927 bullet-proof login ux 2023-02-05 13:25:22 +01:00
e0f400a800 Settings: reload on lang change 2023-02-05 13:10:53 +01:00
c485898b7d cleanup invalid track stuff (leftovers from scanclient) 2023-02-05 13:10:03 +01:00
80f5c38c36 🚀Bumped version to 0.1.3 2021-04-08 17:43:08 +02:00
205e09e2fc Fixed image name 2021-04-08 17:42:55 +02:00
20 changed files with 3612 additions and 546 deletions

View File

@@ -1,60 +0,0 @@
---
kind: secret
name: docker_username
get:
path: odit-registry-builder
name: username
---
kind: secret
name: docker_password
get:
path: odit-registry-builder
name: password
---
kind: 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
repo: registry.odit.services/lfk/selfservice
tags:
- dev
registry: registry.odit.services
mtu: 1000
trigger:
branch:
- dev
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
repo: registry.odit.services/lfk/selfservice
tags:
- '${DRONE_TAG}'
registry: registry.odit.services
mtu: 1000
trigger:
event:
- tag

View File

@@ -0,0 +1,33 @@
name: Build release images
on:
push:
tags:
- "*.*.*"
jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 19
- run: npm i -g pnpm@10.7 && pnpm i
- run: pnpm licenses:export
- name: Login to registry
uses: docker/login-action@v3
with:
registry: registry.odit.services
username: ${{ vars.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
tags: |
${{ vars.REGISTRY }}/lfk/beamershow:${{ github.ref_name }}
platforms: linux/amd64,linux/arm64

1
.husky/.gitignore vendored
View File

@@ -1 +0,0 @@
_

View File

@@ -1,5 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
yarn format
yarn license:export

View File

@@ -2,8 +2,125 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [1.0.7](https://git.odit.services/lfk/beamershow/compare/1.0.6...1.0.7)
#### [1.0.6](https://git.odit.services/lfk/beamershow/compare/1.0.5...1.0.6)
> 4 April 2025
- feat: show org names for teams_distance slide [`c6f7210`](https://git.odit.services/lfk/beamershow/commit/c6f721019691cdc9f5492f920dbdd99e6b25ca9f)
- chore(deps). bump [`dc0488b`](https://git.odit.services/lfk/beamershow/commit/dc0488b1b7632326f4dd3bf5fff0ac8fa91fb128)
- ci: move to gitea actions [`e6ff8ef`](https://git.odit.services/lfk/beamershow/commit/e6ff8ef80b667692574319f20bebe6a4e872ca6e)
- chore: release 1.0.6 [`52528d3`](https://git.odit.services/lfk/beamershow/commit/52528d31a46f99bd44c9b7f18833159f9cd4db56)
- chore: update readme [`aa707ff`](https://git.odit.services/lfk/beamershow/commit/aa707ff0ccaa2cb4a69d3c7b396591cd40827c6d)
- chore(deps): pnpm@10 [`c286969`](https://git.odit.services/lfk/beamershow/commit/c286969a9de52519005013a6798f711cef26b465)
- ci: change release message [`4920da1`](https://git.odit.services/lfk/beamershow/commit/4920da1df1a51a071eeba44d8d2c1cb6c5f8d09c)
- fix: i18n [`f9a84f7`](https://git.odit.services/lfk/beamershow/commit/f9a84f798b1052530688aaabf654b08c2d466da5)
- fix(login): bg image [`14ae9e4`](https://git.odit.services/lfk/beamershow/commit/14ae9e49fbdc10a1c5681212713b166e333e4b4d)
#### [1.0.5](https://git.odit.services/lfk/beamershow/compare/1.0.4...1.0.5)
> 18 December 2024
- chore(deps): bump some [`ab4f82c`](https://git.odit.services/lfk/beamershow/commit/ab4f82ccf14a1569921845910e3b2a740f74aeea)
- feat(ci)!: Switched to woodpecker [`1235776`](https://git.odit.services/lfk/beamershow/commit/1235776a6255a3925f98ac6cacd3167f6e86e363)
- chore: remove husky [`72d34cb`](https://git.odit.services/lfk/beamershow/commit/72d34cbfd7f7e47f0239416469533aea772daa79)
- 🚀Bumped version to 1.0.5 [`4874b22`](https://git.odit.services/lfk/beamershow/commit/4874b227960c30b65d7bc822f987c9b957144953)
- chore(deps): pnpm@9 + node@23 [`c4ad18c`](https://git.odit.services/lfk/beamershow/commit/c4ad18cb4ff4dd13e50f4674d7b6016ed788ff63)
- feat(footer): cleaned up text [`b10e964`](https://git.odit.services/lfk/beamershow/commit/b10e964ad900fcfd2503884c248ea0f6d11a2fb9)
- feat: improved background img import [`919b295`](https://git.odit.services/lfk/beamershow/commit/919b2956ab5253a3697c14ac284f6da700afda91)
#### [1.0.4](https://git.odit.services/lfk/beamershow/compare/1.0.3...1.0.4)
> 15 April 2023
- 🚀Bumped version to 1.0.4 [`4a1e266`](https://git.odit.services/lfk/beamershow/commit/4a1e26663e29339d6373fa8c340ba2117d3ecf28)
- fix: formatting of total km [`2bdbd00`](https://git.odit.services/lfk/beamershow/commit/2bdbd001898b9dd5aa541f3cce90fc108e7e458c)
#### [1.0.3](https://git.odit.services/lfk/beamershow/compare/1.0.2...1.0.3)
> 15 April 2023
- 🚀Bumped version to 1.0.3 [`85e7b7c`](https://git.odit.services/lfk/beamershow/commit/85e7b7c231b92233b58373cd4ad56f514d6d789c)
- cleanup loading [`d5f685a`](https://git.odit.services/lfk/beamershow/commit/d5f685a8269737d148a06e0ec784c0074eac7d3f)
- drop laptime runner stats, fix runner distance page [`8844917`](https://git.odit.services/lfk/beamershow/commit/88449174a148ab7498075a15149388213a532c02)
#### [1.0.2](https://git.odit.services/lfk/beamershow/compare/1.0.1...1.0.2)
> 15 April 2023
- 🚀Bumped version to 1.0.2 [`d30be90`](https://git.odit.services/lfk/beamershow/commit/d30be90102b3065b16836adc44a686c677e3053d)
- updated release config [`7e3570e`](https://git.odit.services/lfk/beamershow/commit/7e3570e9231929f366047ff149364ec06344d2ee)
#### [1.0.1](https://git.odit.services/lfk/beamershow/compare/1.0.0...1.0.1)
> 15 April 2023
- 🚀Bumped version to 1.0.1 [`3ac0a3c`](https://git.odit.services/lfk/beamershow/commit/3ac0a3c142427adb3b3d461cd39a458685a85335)
- fix bg image? [`dc588e8`](https://git.odit.services/lfk/beamershow/commit/dc588e83c03d7e381f67c52b5fd5430fd0462742)
### [1.0.0](https://git.odit.services/lfk/beamershow/compare/0.1.5...1.0.0)
> 15 April 2023
- pin clock to bottom [`b287db4`](https://git.odit.services/lfk/beamershow/commit/b287db4d0a57e8a07d30b756ce0bea30da5ef4e3)
- update font to match lfk 2023 branding [`70a6120`](https://git.odit.services/lfk/beamershow/commit/70a61204471cea8f8d5dc17ad225c39c5cd91a43)
- bump windicss [`c33157e`](https://git.odit.services/lfk/beamershow/commit/c33157e2d4c5e4a5e9d30d96650e0bfa5ab1ab57)
- 1 more empty state [`f909575`](https://git.odit.services/lfk/beamershow/commit/f909575ca5ac862ec8e34d783831c2fcb53f2083)
- add empty state for runners_laptime [`8139a3f`](https://git.odit.services/lfk/beamershow/commit/8139a3f60b3544a8992d97b8b9d49520b28270bd)
- 🚀Bumped version to 1.0.0 [`5d764a8`](https://git.odit.services/lfk/beamershow/commit/5d764a80a7d25be7f6c2bb29a22b816875a739bf)
- updated pnpm lock [`de37339`](https://git.odit.services/lfk/beamershow/commit/de373390ba7051e22f1c4904b1ed60e1dc0e0c7a)
- text responsiveness [`9b83b38`](https://git.odit.services/lfk/beamershow/commit/9b83b38356b3faa677421a98c8655bc2357fb489)
- fix: font responsiveness [`38b0fcc`](https://git.odit.services/lfk/beamershow/commit/38b0fccb5abf762b88d5a8a3ad27cb80cf85ccb0)
- 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

View File

@@ -1,12 +1,12 @@
FROM node:15.11.0-alpine3.13
FROM registry.odit.services/hub/library/node:23.11.0-alpine3.21 as build
ARG NPM_REGISTRY_URL=https://registry.npmjs.org
WORKDIR /app
COPY . .
RUN yarn
RUN yarn build
COPY . ./
RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@10.7 && pnpm i
RUN pnpm build
# final image
FROM alpine
COPY --from=0 /app/dist /app
FROM fholzer/nginx-brotli:v1.19.1
COPY --from=1 /app /usr/share/nginx/html
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

View File

@@ -7,17 +7,17 @@ This is an API client for [https://git.odit.services/lfk/backend](@lfk/backend)
## Dev🛠
### 🚀 Getting Started
```
yarn
pnpm i
```
### Development
```
yarn dev
pnpm dev
/
yarn dev --open
pnpm dev --open
```
### Build
```
yarn build
pnpm build
```
## Use (quickstart) 🔥

View File

@@ -6,6 +6,11 @@
<title>LfK!Beamershow</title>
<base href="./" />
<link rel="icon" type="image/png" href="./favicon.png" />
<style>
* {
font-family: "Athiti", sans-serif;
}
</style>
</head>
<body class="bg-white font-family-karla h-screen">

View File

@@ -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
**Author**: ODIT.Services
**Repo**: https://git.odit.services/odit/license-exporter

View File

@@ -1,48 +1,49 @@
{
"name": "@lfk/beamershow",
"version": "0.1.2",
"scripts": {
"dev": "vite",
"build": "vite build",
"format": "prettier --write --plugin-search-dir=. ./**/*.html ./**/*.svelte",
"prepare": "husky install",
"license:export": "license-exporter --markdown && git stage licenses.md",
"release": "release-it --only-version"
},
"devDependencies": {
"@odit/license-exporter": "^0.0.11",
"@svitejs/vite-plugin-svelte": "^0.11.1",
"@tsconfig/svelte": "^1.0.10",
"@types/html-minifier": "^4.0.0",
"axios": "^0.21.1",
"html-minifier": "^4.0.0",
"husky": "^5.1.3",
"prettier": "^2.2.1",
"prettier-plugin-svelte": "^2.2.0",
"release-it": "14.5.0",
"svelte": "3.36.0",
"svelte-i18n": "3.3.9",
"svelte-preprocess": "4.7.0",
"validator": "^13.5.2",
"vite": "2.1.4",
"vite-plugin-windicss": "0.11.2"
},
"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"
}
}
}
{
"name": "@lfk/beamershow",
"version": "1.0.7",
"scripts": {
"dev": "vite",
"build": "vite build",
"format": "prettier --write --plugin-search-dir=. ./**/*.html ./**/*.svelte",
"license:export": "license-exporter --markdown && git stage licenses.md",
"release": "release-it --only-version"
},
"devDependencies": {
"@odit/license-exporter": "0.2.0",
"@philippdormann/release-it": "1.0.0",
"@svitejs/vite-plugin-svelte": "0.11.1",
"@tsconfig/svelte": "1.0.10",
"@types/html-minifier": "4.0.5",
"axios": "0.21.1",
"html-minifier": "4.0.0",
"prettier": "3.5.3",
"prettier-plugin-svelte": "3.3.3",
"svelte": "3.36.0",
"svelte-i18n": "3.3.9",
"svelte-preprocess": "4.7.0",
"validator": "13.15.0",
"vite": "2.1.4",
"vite-plugin-windicss": "1.9.4"
},
"release-it": {
"git": {
"commit": true,
"requireCleanWorkingDir": false,
"commitMessage": "chore: release ${version}",
"requireBranch": "main",
"push": true,
"tag": true,
"tagName": "${version}",
"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": "5.2.5"
}
}

2917
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

3
pnpm-workspace.yaml Normal file
View File

@@ -0,0 +1,3 @@
onlyBuiltDependencies:
- esbuild
- svelte-preprocess

View File

@@ -12,12 +12,10 @@
import Login from "./Login.svelte";
import Settings from "./Settings.svelte";
export let settings_open = false;
$: is_configured =
$apikey &&
$apikey !== "null" &&
$apikey !== "" &&
$laptime_track != 0 &&
$laptime_track != null;
$: is_configured = $apikey?.length === 44 && $api_endpoint?.includes("://");
// &&
// $laptime_track != 0 &&
// $laptime_track != null;
init({
fallbackLocale: "en-US",
initialLocale: $lang,
@@ -29,12 +27,12 @@
if (e.key === "Escape") {
modal_open = false;
}
if (e.keyCode === 13) {
if (createbtnenabled === true) {
createbtnenabled = false;
submit();
}
}
// if (e.keyCode === 13) {
// if (createbtnenabled === true) {
// createbtnenabled = false;
// submit();
// }
// }
if (command === "" && e.key === "c") {
command = "c";
} else if (command === "c" && e.key === "n") {

View File

@@ -1,367 +1,420 @@
<script>
import axios from "axios";
import { _ } from "svelte-i18n";
import { slide } from "svelte/transition";
import { apikey, api_endpoint, laptime_track } from "./store.js";
function init(el) {
el.focus();
}
$: pages = [
"general",
"runners_distance",
"runners_laptime",
"orgs_distance",
"teams_distance",
];
$: current_page = "general";
$: general = {};
$: runners = [];
$: runners_by_laptime = [];
$: orgs = [];
$: teams = [];
import axios from "axios";
import bg from "/beamershow_background.png?inline";
import { _ } from "svelte-i18n";
import { slide } from "svelte/transition";
import { apikey, api_endpoint, laptime_track } from "./store.js";
$: pages = [
"general",
"runners_distance",
// "runners_laptime",
"orgs_distance",
// "teams_distance",
];
$: current_page = "general";
$: general = {};
$: runners = [];
$: runners_by_laptime = [];
$: orgs = [];
$: teams = [];
let time = new Date();
$: hours = (time.getHours() + "").padStart(2, "0");
$: minutes = (time.getMinutes() + "").padStart(2, "0");
$: seconds = (time.getSeconds() + "").padStart(2, "0");
function format_laptime(laptime) {
if (laptime < 60) {
return `${laptime}s`;
}
if (laptime < 3600) {
return `${Math.floor(laptime / 60)}min ${
laptime - Math.floor(laptime / 60) * 60
}s`;
}
return `${Math.floor(laptime / 3600)}h ${
laptime - Math.floor(laptime / 3600) * 3600
}min ${
laptime -
Math.floor(laptime / 3600) * 3600 -
Math.floor(laptime / 60) * 60
}`;
}
function stats_general() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
general = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_runners() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/runners/distance",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
runners = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_runners_by_laptime() {
axios
.request({
method: "GET",
url:
$api_endpoint + "api/stats/runners/laptime?track=" + $laptime_track,
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
runners_by_laptime = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_orgs() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/organizations/distance",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
orgs = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_teams() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/teams/distance",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
teams = data;
})
.catch(function (e) {
console.log(e);
});
}
Array.prototype.cycle = function (str) {
const i = this.indexOf(str);
if (i === -1) return undefined;
return this[(i + 1) % this.length];
};
function fetch_all() {
stats_general();
stats_runners();
stats_runners_by_laptime();
stats_orgs();
stats_teams();
}
fetch_all();
setInterval(() => {
time = new Date();
}, 1000);
setInterval(() => {
fetch_all();
}, 15000);
setInterval(() => {
current_page = pages.cycle(current_page);
}, 20000);
let time = new Date();
$: hours = (time.getHours() + "").padStart(2, "0");
$: minutes = (time.getMinutes() + "").padStart(2, "0");
$: seconds = (time.getSeconds() + "").padStart(2, "0");
function format_laptime(laptime) {
if (laptime < 60) {
return `${laptime}s`;
}
if (laptime < 3600) {
return `${Math.floor(laptime / 60)}min ${
laptime - Math.floor(laptime / 60) * 60
}s`;
}
return `${Math.floor(laptime / 3600)}h ${
laptime - Math.floor(laptime / 3600) * 3600
}min ${
laptime -
Math.floor(laptime / 3600) * 3600 -
Math.floor(laptime / 60) * 60
}`;
}
function stats_general() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
general = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_runners() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/runners/distance",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
runners = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_runners_by_laptime() {
axios
.request({
method: "GET",
url:
$api_endpoint + "api/stats/runners/laptime?track=" + $laptime_track,
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
runners_by_laptime = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_orgs() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/organizations/distance",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
orgs = data;
})
.catch(function (e) {
console.log(e);
});
}
function stats_teams() {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stats/teams/distance",
headers: { Authorization: "Bearer " + $apikey },
})
.then(function ({ data }) {
teams = data;
})
.catch(function (e) {
console.log(e);
});
}
Array.prototype.cycle = function (str) {
const i = this.indexOf(str);
if (i === -1) return undefined;
return this[(i + 1) % this.length];
};
function fetch_all() {
stats_general();
stats_runners();
// stats_runners_by_laptime();
stats_orgs();
stats_teams();
}
fetch_all();
setInterval(() => {
time = new Date();
}, 1000);
setInterval(() => {
fetch_all();
}, 50000);
setInterval(() => {
current_page = pages.cycle(current_page);
}, 20000);
</script>
<div
class="min-h-screen flex items-center justify-center bg-gray-100"
style="background-image: url('/beamershow_background.png');background-position: center;background-size: contain;background-repeat:no-repeat;"
class="min-h-screen flex items-center justify-center bg-gray-100"
style="background-image: url({bg});background-position: center;background-size: contain;background-repeat:no-repeat;"
>
<div class="max-w-xl w-full">
{#if current_page === "general"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900">
{hours}:{minutes}:{seconds}
</h1>
<!-- -->
<div class="flex flex-wrap -mx-1 overflow-hidden mt-5">
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
<h1 class="text-5xl font-semibold text-center text-gray-900">
{general.total_runners}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("laeufer")}
</h1>
</div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
<h1 class="text-5xl font-semibold text-center text-gray-900">
{general.total_distance}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("kilometer-gesamt")}
</h1>
</div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
<h1 class="text-5xl font-semibold text-center text-gray-900">
{general.total_donation}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("spendensumme")}
</h1>
</div>
</div>
</div>
{:else if current_page === "runners_distance"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
{$_("top-laeufer")} ({$_("distanz")})
</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"
>
{$_("laeufer")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("organisation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("kilometer")}
</th>
</tr>
</thead>
<tbody>
{#each runners as r, i}
<tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5">
{i + 1}
</td>
<td class="border p-4 dark:border-dark-5">
{r.firstname}
{r.lastname}
</td>
<td class="border p-4 dark:border-dark-5">
{r.group.name}
</td>
<td class="border p-4 dark:border-dark-5">
{r.distance / 1000} km
</td>
</tr>
{/each}
</tbody>
</table>
</div>
{:else if current_page === "runners_laptime"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
{$_("top-laeufer")} ({$_("rundenzeit")})
</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"
>
{$_("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>
</div>
{:else if current_page === "orgs_distance"}
<div transition:slide|local>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
{$_("top-organsiationen")}
</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"
>
{$_("organsiation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("kilometer")}
</th>
</tr>
</thead>
<tbody>
{#each orgs as o, i}
<tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5">
{i + 1}
</td>
<td class="border p-4 dark:border-dark-5">
{o.name}
</td>
<td class="border p-4 dark:border-dark-5">
{o.distance / 1000} km
</td>
</tr>
{/each}
</tbody>
</table>
</div>
{:else if current_page === "teams_distance"}
<div transition:slide|local>
<h1 class="mr-6 text-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 class="w-full">
<div class="w-3/4 xl:w-1/2 mx-auto">
<!-- -->
{#if current_page === "general"}
<div transition:slide|local>
<h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900"
>
{$_("statistiken")}
</h1>
<!-- -->
<div class="flex flex-wrap -mx-1 overflow-hidden mt-5">
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
<h1 class="text-5xl font-bold text-center text-gray-900">
{general.total_runners || "0"}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("laeufer")}
</h1>
</div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
<h1 class="text-5xl font-bold text-center text-gray-900">
{general.total_distance / 1000 || 0}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("kilometer-gesamt")}
</h1>
</div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
<h1 class="text-5xl font-bold text-center text-gray-900">
{parseFloat(
((general.total_donation || 0) / 100).toFixed(2)
).toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}) || "0"}
</h1>
<h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("spendensumme")}
</h1>
</div>
</div>
</div>
{:else if current_page === "runners_distance"}
<div transition:slide|local>
<h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
>
{$_("top-laeufer")} ({$_("distanz")})
</h1>
{#if runners.length === 0}
<p class="w-full text-center text-3xl font-semibold">
Noch keine Daten...
</p>
{:else}
<table
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
>
<thead>
<tr>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("laeufer")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("organisation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("kilometer")}
</th>
</tr>
</thead>
<tbody>
{#each runners as r, i}
<tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5">
{i + 1}
</td>
<td class="border p-4 dark:border-dark-5">
{r.firstname}
{r.lastname}
</td>
<td class="border p-4 dark:border-dark-5">
{r.group.name}
</td>
<td class="border p-4 dark:border-dark-5">
{r.distance / 1000} km
</td>
</tr>
{/each}
</tbody>
</table>
{/if}
</div>
{:else if current_page === "runners_laptime"}
<div transition:slide|local>
<h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
>
{$_("top-laeufer")} ({$_("rundenzeit")})
</h1>
{#if runners_by_laptime.length === 0}
<p class="w-full text-center text-3xl font-semibold">
Noch keine Daten...
</p>
{:else}
<table
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
>
<thead>
<tr>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("laeufer")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("organisation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("schnellste-rundenzeit")}
</th>
</tr>
</thead>
<tbody>
{#each runners_by_laptime as r, i}
<tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5">
{i + 1}
</td>
<td class="border p-4 dark:border-dark-5">
{r.firstname}
{r.lastname}
</td>
<td class="border p-4 dark:border-dark-5">
{r.group.name}
</td>
<td class="border p-4 dark:border-dark-5">
{format_laptime(r.minLaptime)}
</td>
</tr>
{/each}
</tbody>
</table>
{/if}
</div>
{:else if current_page === "orgs_distance"}
<div transition:slide|local>
<h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
>
{$_("top-organisationen")}
</h1>
{#if orgs.length === 0}
<p class="w-full text-center text-3xl font-semibold">
Noch keine Daten...
</p>
{:else}
<table
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
>
<thead>
<tr>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("organsiation")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("kilometer")}
</th>
</tr>
</thead>
<tbody>
{#each orgs as o, i}
<tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5">
{i + 1}
</td>
<td class="border p-4 dark:border-dark-5">
{o.name}
</td>
<td class="border p-4 dark:border-dark-5">
{o.distance / 1000} km
</td>
</tr>
{/each}
</tbody>
</table>
{/if}
</div>
{:else if current_page === "teams_distance"}
<div transition:slide|local>
<h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
>
{$_("top-teams")}
</h1>
<table
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
>
<thead>
<tr>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("platz")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("team")}
</th>
<th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
>
{$_("kilometer")}
</th>
</tr>
</thead>
<tbody>
{#each teams as t, i}
<tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5">
{i + 1}
</td>
<td class="border p-4 dark:border-dark-5">
{t.parent.name}<br />
{t.name}
</td>
<td class="border p-4 dark:border-dark-5">
{t.distance / 1000} km
</td>
</tr>
{/each}
</tbody>
</table>
</div>
{:else}
<!-- content here -->
{/if}
</div>
</div>
<h1
class="text-6xl font-semibold text-right text-gray-900 font-mono top-2 w-full fixed pr-4 xl:top-6 xl:pr-8"
>
{hours}:{minutes}:{seconds}
</h1>
<h1
class="text-xl xl:text-3xl font-medium text-center text-gray-900 font-mono bottom-2 xl:bottom-4 w-full fixed"
>
<span class="text-black font-extrabold">Lauf für Kaya!</span> - powered by ODIT.Services
</h1>
</div>

View File

@@ -1,5 +1,6 @@
<script>
import { apikey, lang, api_endpoint, laptime_track } from "./store.js";
import bg from "/beamershow_background.png?inline";
import { apikey, lang, api_endpoint, laptime_track, clear } from "./store.js";
import isURL from "validator/lib/isURL";
import isUUID from "validator/lib/isUUID";
import axios from "axios";
@@ -10,10 +11,12 @@
$: error = false;
$: errormessage = "";
$: isTokenValid =
token?.length === 44 &&
token.split(".")[0].length === 7 &&
isUUID(token.split(".")[1]);
$: isEndpointValid = isURL(api_endpoint_input);
token === "rst" ||
(token?.length === 44 &&
token.split(".")[0].length === 7 &&
isUUID(token.split(".")[1]));
$: isEndpointValid =
api_endpoint_input === "rst" || isURL(api_endpoint_input);
</script>
<div class="w-full flex flex-wrap">
@@ -62,11 +65,15 @@
</div>
{/if}
{/if}
{#if $api_endpoint && !$apikey}
{#if $api_endpoint?.includes("://") && (!$apikey || $apikey == null)}
<form
class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();"
on:submit={() => {
if (token === "rst") {
clear();
return;
}
axios
.request({
method: "GET",
@@ -112,42 +119,19 @@
>{$_("configure")}</button
>
</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}
<form
class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();"
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) !== "/") {
api_endpoint_input = api_endpoint_input + "/";
}
@@ -270,7 +254,7 @@
<img
alt=""
class="object-cover w-full h-screen hidden md:block"
src="https://source.unsplash.com/IXUM4cJynP0"
src={bg}
/>
</div>
</div>

View File

@@ -13,14 +13,13 @@
<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 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>
<div class="w-full">
<div class="inline-block mr-2 mt-2">
<button
on:click={() => {
lang.set("de-DE");
location.reload();
}}
type="button"
class:bg-blue-700={$lang === "de-DE"}
@@ -46,6 +45,7 @@
<button
on:click={() => {
lang.set("en-EN");
location.reload();
}}
type="button"
class:bg-blue-700={$lang === "en-EN"}

View File

@@ -30,11 +30,12 @@
"spendensumme": "Spendensumme",
"station_description": "Beschreibung der Scanstation",
"station_id": "Scanstations-ID",
"statistiken": "Statistiken",
"team": "Team",
"the_provided_scan_station_is_disabled": "Die angegebene Scanstation ist deaktiviert.",
"the_provided_scan_station_token_is_invalid": "Der angegebene Scanstation-Token ist ungültig.",
"top-laeufer": "Top-Läufer",
"top-organsiationen": "Top-Organsiationen",
"top-organisationen": "Top-Organisationen",
"top-teams": "Top-Teams",
"track_distance": "Länge des Tracks",
"track_id": "Track ID",

View File

@@ -30,11 +30,12 @@
"spendensumme": "Donations",
"station_description": "Station Description",
"station_id": "Scanstation ID",
"statistiken": "Statistics",
"team": "Team",
"the_provided_scan_station_is_disabled": "The provided scan station is disabled.",
"the_provided_scan_station_token_is_invalid": "The provided scan station token is invalid.",
"top-laeufer": "Top runners",
"top-organsiationen": "Top organizations",
"top-organisationen": "Top organizations",
"top-teams": "Top teams",
"track_distance": "Track Distance",
"track_id": "Track ID",

View File

@@ -1,5 +1,6 @@
import App from './App.svelte';
import 'windi.css';
import "@fontsource/athiti"
const app = new App({
target: document.body

View File

@@ -1,29 +1,39 @@
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);
api_endpoint.subscribe((value) => {
localStorage.setItem('api_endpoint', value);
if (value != null) {
localStorage.setItem('api_endpoint', value);
}
});
const stored_apikey = localStorage.getItem('apikey');
export const apikey = writable(stored_apikey);
apikey.subscribe((value) => {
localStorage.setItem('apikey', value);
if (value != null) {
localStorage.setItem('apikey', value);
}
});
const stored_laptime_track = localStorage.getItem('laptime_track');
export const laptime_track = writable(stored_laptime_track);
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');
export const lang = writable(stored_lang);
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("")
apikey.set(null);
apikey.set("");
laptime_track.set(null)
localStorage.clear();
}