Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
552b9200d4
|
|||
|
5202ab013a
|
|||
|
1652e54ac6
|
|||
|
52528d31a4
|
|||
|
e6ff8ef80b
|
|||
|
aa707ff0cc
|
|||
|
dc0488b1b7
|
|||
|
4920da1df1
|
|||
|
f9a84f798b
|
|||
|
c6f7210196
|
|||
|
c286969a9d
|
|||
|
14ae9e49fb
|
|||
|
4874b22796
|
|||
|
72d34cbfd7
|
|||
|
b10e964ad9
|
|||
|
919b2956ab
|
|||
|
c4ad18cb4f
|
|||
|
ab4f82ccf1
|
|||
|
1235776a62
|
|||
|
4a1e26663e
|
|||
|
2bdbd00189
|
|||
|
85e7b7c231
|
|||
|
d5f685a826
|
|||
|
88449174a1
|
|||
|
d30be90102
|
|||
|
7e3570e923
|
|||
|
3ac0a3c142
|
|||
|
dc588e83c0
|
|||
|
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 |
60
.drone.yml
60
.drone.yml
@@ -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
|
|
||||||
33
.gitea/workflows/release.yaml
Normal file
33
.gitea/workflows/release.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: Build release images
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "*.*.*"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-container:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 19
|
||||||
|
- run: npm i -g pnpm@10.7 && pnpm i
|
||||||
|
- run: pnpm licenses:export
|
||||||
|
- name: Login to registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: registry.odit.services
|
||||||
|
username: ${{ vars.REGISTRY_USERNAME }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
${{ vars.REGISTRY }}/lfk/beamershow:${{ github.ref_name }}
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
1
.husky/.gitignore
vendored
1
.husky/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
_
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
. "$(dirname "$0")/_/husky.sh"
|
|
||||||
|
|
||||||
yarn format
|
|
||||||
yarn license:export
|
|
||||||
125
CHANGELOG.md
125
CHANGELOG.md
@@ -2,8 +2,133 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
|
#### [1.0.8](https://git.odit.services/lfk/beamershow/compare/1.0.7...1.0.8)
|
||||||
|
|
||||||
|
- ci: fix license exporter [`5202ab0`](https://git.odit.services/lfk/beamershow/commit/5202ab013a31515f5ad8eeb342fb7f4eb283f1ff)
|
||||||
|
|
||||||
|
#### [1.0.7](https://git.odit.services/lfk/beamershow/compare/1.0.6...1.0.7)
|
||||||
|
|
||||||
|
> 4 April 2025
|
||||||
|
|
||||||
|
- chore: release 1.0.7 [`1652e54`](https://git.odit.services/lfk/beamershow/commit/1652e54ac63f51c1f8e1903e22a2768967e3f90d)
|
||||||
|
|
||||||
|
#### [1.0.6](https://git.odit.services/lfk/beamershow/compare/1.0.5...1.0.6)
|
||||||
|
|
||||||
|
> 4 April 2025
|
||||||
|
|
||||||
|
- feat: show org names for teams_distance slide [`c6f7210`](https://git.odit.services/lfk/beamershow/commit/c6f721019691cdc9f5492f920dbdd99e6b25ca9f)
|
||||||
|
- chore(deps). bump [`dc0488b`](https://git.odit.services/lfk/beamershow/commit/dc0488b1b7632326f4dd3bf5fff0ac8fa91fb128)
|
||||||
|
- ci: move to gitea actions [`e6ff8ef`](https://git.odit.services/lfk/beamershow/commit/e6ff8ef80b667692574319f20bebe6a4e872ca6e)
|
||||||
|
- chore: release 1.0.6 [`52528d3`](https://git.odit.services/lfk/beamershow/commit/52528d31a46f99bd44c9b7f18833159f9cd4db56)
|
||||||
|
- chore: update readme [`aa707ff`](https://git.odit.services/lfk/beamershow/commit/aa707ff0ccaa2cb4a69d3c7b396591cd40827c6d)
|
||||||
|
- chore(deps): pnpm@10 [`c286969`](https://git.odit.services/lfk/beamershow/commit/c286969a9de52519005013a6798f711cef26b465)
|
||||||
|
- ci: change release message [`4920da1`](https://git.odit.services/lfk/beamershow/commit/4920da1df1a51a071eeba44d8d2c1cb6c5f8d09c)
|
||||||
|
- fix: i18n [`f9a84f7`](https://git.odit.services/lfk/beamershow/commit/f9a84f798b1052530688aaabf654b08c2d466da5)
|
||||||
|
- fix(login): bg image [`14ae9e4`](https://git.odit.services/lfk/beamershow/commit/14ae9e49fbdc10a1c5681212713b166e333e4b4d)
|
||||||
|
|
||||||
|
#### [1.0.5](https://git.odit.services/lfk/beamershow/compare/1.0.4...1.0.5)
|
||||||
|
|
||||||
|
> 18 December 2024
|
||||||
|
|
||||||
|
- chore(deps): bump some [`ab4f82c`](https://git.odit.services/lfk/beamershow/commit/ab4f82ccf14a1569921845910e3b2a740f74aeea)
|
||||||
|
- feat(ci)!: Switched to woodpecker [`1235776`](https://git.odit.services/lfk/beamershow/commit/1235776a6255a3925f98ac6cacd3167f6e86e363)
|
||||||
|
- chore: remove husky [`72d34cb`](https://git.odit.services/lfk/beamershow/commit/72d34cbfd7f7e47f0239416469533aea772daa79)
|
||||||
|
- 🚀Bumped version to 1.0.5 [`4874b22`](https://git.odit.services/lfk/beamershow/commit/4874b227960c30b65d7bc822f987c9b957144953)
|
||||||
|
- chore(deps): pnpm@9 + node@23 [`c4ad18c`](https://git.odit.services/lfk/beamershow/commit/c4ad18cb4ff4dd13e50f4674d7b6016ed788ff63)
|
||||||
|
- feat(footer): cleaned up text [`b10e964`](https://git.odit.services/lfk/beamershow/commit/b10e964ad900fcfd2503884c248ea0f6d11a2fb9)
|
||||||
|
- feat: improved background img import [`919b295`](https://git.odit.services/lfk/beamershow/commit/919b2956ab5253a3697c14ac284f6da700afda91)
|
||||||
|
|
||||||
|
#### [1.0.4](https://git.odit.services/lfk/beamershow/compare/1.0.3...1.0.4)
|
||||||
|
|
||||||
|
> 15 April 2023
|
||||||
|
|
||||||
|
- 🚀Bumped version to 1.0.4 [`4a1e266`](https://git.odit.services/lfk/beamershow/commit/4a1e26663e29339d6373fa8c340ba2117d3ecf28)
|
||||||
|
- fix: formatting of total km [`2bdbd00`](https://git.odit.services/lfk/beamershow/commit/2bdbd001898b9dd5aa541f3cce90fc108e7e458c)
|
||||||
|
|
||||||
|
#### [1.0.3](https://git.odit.services/lfk/beamershow/compare/1.0.2...1.0.3)
|
||||||
|
|
||||||
|
> 15 April 2023
|
||||||
|
|
||||||
|
- 🚀Bumped version to 1.0.3 [`85e7b7c`](https://git.odit.services/lfk/beamershow/commit/85e7b7c231b92233b58373cd4ad56f514d6d789c)
|
||||||
|
- cleanup loading [`d5f685a`](https://git.odit.services/lfk/beamershow/commit/d5f685a8269737d148a06e0ec784c0074eac7d3f)
|
||||||
|
- drop laptime runner stats, fix runner distance page [`8844917`](https://git.odit.services/lfk/beamershow/commit/88449174a148ab7498075a15149388213a532c02)
|
||||||
|
|
||||||
|
#### [1.0.2](https://git.odit.services/lfk/beamershow/compare/1.0.1...1.0.2)
|
||||||
|
|
||||||
|
> 15 April 2023
|
||||||
|
|
||||||
|
- 🚀Bumped version to 1.0.2 [`d30be90`](https://git.odit.services/lfk/beamershow/commit/d30be90102b3065b16836adc44a686c677e3053d)
|
||||||
|
- updated release config [`7e3570e`](https://git.odit.services/lfk/beamershow/commit/7e3570e9231929f366047ff149364ec06344d2ee)
|
||||||
|
|
||||||
|
#### [1.0.1](https://git.odit.services/lfk/beamershow/compare/1.0.0...1.0.1)
|
||||||
|
|
||||||
|
> 15 April 2023
|
||||||
|
|
||||||
|
- 🚀Bumped version to 1.0.1 [`3ac0a3c`](https://git.odit.services/lfk/beamershow/commit/3ac0a3c142427adb3b3d461cd39a458685a85335)
|
||||||
|
- fix bg image? [`dc588e8`](https://git.odit.services/lfk/beamershow/commit/dc588e83c03d7e381f67c52b5fd5430fd0462742)
|
||||||
|
|
||||||
|
### [1.0.0](https://git.odit.services/lfk/beamershow/compare/0.1.5...1.0.0)
|
||||||
|
|
||||||
|
> 15 April 2023
|
||||||
|
|
||||||
|
- pin clock to bottom [`b287db4`](https://git.odit.services/lfk/beamershow/commit/b287db4d0a57e8a07d30b756ce0bea30da5ef4e3)
|
||||||
|
- update font to match lfk 2023 branding [`70a6120`](https://git.odit.services/lfk/beamershow/commit/70a61204471cea8f8d5dc17ad225c39c5cd91a43)
|
||||||
|
- bump windicss [`c33157e`](https://git.odit.services/lfk/beamershow/commit/c33157e2d4c5e4a5e9d30d96650e0bfa5ab1ab57)
|
||||||
|
- 1 more empty state [`f909575`](https://git.odit.services/lfk/beamershow/commit/f909575ca5ac862ec8e34d783831c2fcb53f2083)
|
||||||
|
- add empty state for runners_laptime [`8139a3f`](https://git.odit.services/lfk/beamershow/commit/8139a3f60b3544a8992d97b8b9d49520b28270bd)
|
||||||
|
- 🚀Bumped version to 1.0.0 [`5d764a8`](https://git.odit.services/lfk/beamershow/commit/5d764a80a7d25be7f6c2bb29a22b816875a739bf)
|
||||||
|
- updated pnpm lock [`de37339`](https://git.odit.services/lfk/beamershow/commit/de373390ba7051e22f1c4904b1ed60e1dc0e0c7a)
|
||||||
|
- text responsiveness [`9b83b38`](https://git.odit.services/lfk/beamershow/commit/9b83b38356b3faa677421a98c8655bc2357fb489)
|
||||||
|
- fix: font responsiveness [`38b0fcc`](https://git.odit.services/lfk/beamershow/commit/38b0fccb5abf762b88d5a8a3ad27cb80cf85ccb0)
|
||||||
|
- fix: typo [`8a4974f`](https://git.odit.services/lfk/beamershow/commit/8a4974ffa95b4d45f14c14130d7b7cb584c5cb52)
|
||||||
|
- format donation total [`431fc5a`](https://git.odit.services/lfk/beamershow/commit/431fc5a0474076568e9184d4c6b9819af6cc2e3f)
|
||||||
|
- default fallback on no data [`e04e671`](https://git.odit.services/lfk/beamershow/commit/e04e6713bc282810da2a0d103484cb6043af6063)
|
||||||
|
- formatting [`047941b`](https://git.odit.services/lfk/beamershow/commit/047941babbccb1f0674347babfa1468ac51fa487)
|
||||||
|
- monospace clock [`b50398f`](https://git.odit.services/lfk/beamershow/commit/b50398f6eb4e99e4d1c0d654e2710b265186837a)
|
||||||
|
- formatting [`ee97997`](https://git.odit.services/lfk/beamershow/commit/ee9799736f912f32e37e0d5d06a5591ec6180a31)
|
||||||
|
- improved clock position on xl [`0f32c71`](https://git.odit.services/lfk/beamershow/commit/0f32c71ef0e0267b2dc271507346c60b83eaa176)
|
||||||
|
- improved clock alignment [`4b1a1a3`](https://git.odit.services/lfk/beamershow/commit/4b1a1a324b865354472e45e0ef24230678be6111)
|
||||||
|
- fix container width [`5692969`](https://git.odit.services/lfk/beamershow/commit/569296928ee0a3c21844c183d74a36d759f65150)
|
||||||
|
- improved footer [`8d38e81`](https://git.odit.services/lfk/beamershow/commit/8d38e81b782252c84163aa87ec660199a2e2b065)
|
||||||
|
- updated width [`7005ec6`](https://git.odit.services/lfk/beamershow/commit/7005ec6a28b50763a5e4ee42a8d50e9953149168)
|
||||||
|
- drop "teams_distance" screen [`b483ed1`](https://git.odit.services/lfk/beamershow/commit/b483ed1e49aebbdfb59b41df75160a8acab546b2)
|
||||||
|
- improved empty state [`2ce93b4`](https://git.odit.services/lfk/beamershow/commit/2ce93b45c772284e59d84f063069e1546434bbc3)
|
||||||
|
- fix: width of general container [`b3ce711`](https://git.odit.services/lfk/beamershow/commit/b3ce711e6b8a8497ccbe6e5eea5ff1d6cd550e91)
|
||||||
|
- reload data every 90s [`456c063`](https://git.odit.services/lfk/beamershow/commit/456c0635a4fb5e129e94d4537fb735dc94933a12)
|
||||||
|
|
||||||
|
#### [0.1.5](https://git.odit.services/lfk/beamershow/compare/0.1.4...0.1.5)
|
||||||
|
|
||||||
|
> 29 March 2023
|
||||||
|
|
||||||
|
- Switched dockerfile over to pnpm + cache [`701aae9`](https://git.odit.services/lfk/beamershow/commit/701aae9ed4af66b973e88fec384e46752fcb9ca2)
|
||||||
|
- Switched ci over to pnpm cache [`324612b`](https://git.odit.services/lfk/beamershow/commit/324612b5ddc1cf148a7750a02cdce557bef54d38)
|
||||||
|
- pinned dependencies [`d284e81`](https://git.odit.services/lfk/beamershow/commit/d284e8184c5a3c357398e3ab5a24a2e611001640)
|
||||||
|
- 🚀Bumped version to 0.1.5 [`5be665b`](https://git.odit.services/lfk/beamershow/commit/5be665b65fc021ae8ae544a965444cc29ec20e62)
|
||||||
|
- Docker copy all [`ca1c96b`](https://git.odit.services/lfk/beamershow/commit/ca1c96b252c9665b94dd9ef37c700afbb0039d46)
|
||||||
|
|
||||||
|
#### [0.1.4](https://git.odit.services/lfk/beamershow/compare/0.1.3...0.1.4)
|
||||||
|
|
||||||
|
> 5 February 2023
|
||||||
|
|
||||||
|
- cleanup invalid track stuff (leftovers from scanclient) [`c485898`](https://git.odit.services/lfk/beamershow/commit/c485898b7db7ae09f6e405e12aa6d458833f2dcf)
|
||||||
|
- bullet-proof login ux [`ea08127`](https://git.odit.services/lfk/beamershow/commit/ea08127927e2b1ebcbcd7907fbf51a66a43da421)
|
||||||
|
- add rst command [`ee6af3e`](https://git.odit.services/lfk/beamershow/commit/ee6af3e06921ef33651076b8767149c2df3a1f2d)
|
||||||
|
- 🚀Bumped version to 0.1.4 [`7f7b743`](https://git.odit.services/lfk/beamershow/commit/7f7b743f414b77902a358b6bd813412096d195b3)
|
||||||
|
- Settings: reload on lang change [`e0f400a`](https://git.odit.services/lfk/beamershow/commit/e0f400a800f2652cf3edf2ac0a5f802b65d0c460)
|
||||||
|
|
||||||
|
#### [0.1.3](https://git.odit.services/lfk/beamershow/compare/0.1.2...0.1.3)
|
||||||
|
|
||||||
|
> 8 April 2021
|
||||||
|
|
||||||
|
- 🚀Bumped version to 0.1.3 [`80f5c38`](https://git.odit.services/lfk/beamershow/commit/80f5c38c364c02d70a99f0e06ea9153e10438bfb)
|
||||||
|
- Fixed image name [`205e09e`](https://git.odit.services/lfk/beamershow/commit/205e09e2fc6a2a49251278a8ead31e1718ac7e44)
|
||||||
|
|
||||||
#### [0.1.2](https://git.odit.services/lfk/beamershow/compare/0.1.1...0.1.2)
|
#### [0.1.2](https://git.odit.services/lfk/beamershow/compare/0.1.1...0.1.2)
|
||||||
|
|
||||||
|
> 8 April 2021
|
||||||
|
|
||||||
|
- 🚀Bumped version to 0.1.2 [`9125dec`](https://git.odit.services/lfk/beamershow/commit/9125dec45b41f80445cd6cc75436f5a63de2fd98)
|
||||||
|
|
||||||
#### 0.1.1
|
#### 0.1.1
|
||||||
|
|
||||||
> 7 April 2021
|
> 7 April 2021
|
||||||
|
|||||||
16
Dockerfile
16
Dockerfile
@@ -1,12 +1,12 @@
|
|||||||
FROM node:15.11.0-alpine3.13
|
FROM registry.odit.services/hub/library/node:23.11.0-alpine3.21 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@10.7 && pnpm i
|
||||||
|
RUN pnpm build
|
||||||
|
|
||||||
# final image
|
# final image
|
||||||
FROM alpine
|
FROM registry.odit.services/library/nginx-brotli:3.15 as final
|
||||||
COPY --from=0 /app/dist /app
|
COPY --from=build /app/dist /usr/share/nginx/html
|
||||||
FROM fholzer/nginx-brotli:v1.19.1
|
|
||||||
COPY --from=1 /app /usr/share/nginx/html
|
|
||||||
COPY ./nginx.conf /etc/nginx/nginx.conf
|
COPY ./nginx.conf /etc/nginx/nginx.conf
|
||||||
@@ -7,17 +7,17 @@ This is an API client for [https://git.odit.services/lfk/backend](@lfk/backend)
|
|||||||
## Dev🛠
|
## Dev🛠
|
||||||
### 🚀 Getting Started
|
### 🚀 Getting Started
|
||||||
```
|
```
|
||||||
yarn
|
pnpm i
|
||||||
```
|
```
|
||||||
### Development
|
### Development
|
||||||
```
|
```
|
||||||
yarn dev
|
pnpm dev
|
||||||
/
|
/
|
||||||
yarn dev --open
|
pnpm dev --open
|
||||||
```
|
```
|
||||||
### Build
|
### Build
|
||||||
```
|
```
|
||||||
yarn build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
## Use (quickstart) 🔥
|
## Use (quickstart) 🔥
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
172
licenses.md
172
licenses.md
@@ -1,10 +1,111 @@
|
|||||||
|
# @fontsource/athiti
|
||||||
|
**Author**: Google Inc.
|
||||||
|
**Repo**: https://github.com/fontsource/font-files
|
||||||
|
**License**: OFL-1.1
|
||||||
|
**Description**: Self-host the Athiti font in a neatly bundled NPM package.
|
||||||
|
## License Text
|
||||||
|
Google Inc.
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
# @odit/license-exporter
|
# @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
|
||||||
**License**: MIT
|
**License**: MIT
|
||||||
**Description**: A simple license crawler for crediting open source work
|
**Description**: A simple license crawler for crediting open source work
|
||||||
## License Text
|
## License Text
|
||||||
MIT License Copyright (c) 2020 ODIT.Services (info@odit.services)
|
MIT License Copyright (c) 2020-2022 ODIT.Services (info@odit.services)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -25,6 +126,35 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
|||||||
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
# @philippdormann/release-it
|
||||||
|
**Author**: Lars Kappert
|
||||||
|
**Repo**: https://github.com/release-it/release-it
|
||||||
|
**License**: MIT
|
||||||
|
**Description**: Generic CLI tool to automate versioning and package publishing-related tasks.
|
||||||
|
## License Text
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2018 Lars Kappert
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
# @svitejs/vite-plugin-svelte
|
# @svitejs/vite-plugin-svelte
|
||||||
**Author**: dominikg
|
**Author**: dominikg
|
||||||
**Repo**: https://github.com/svitejs/svite
|
**Repo**: https://github.com/svitejs/svite
|
||||||
@@ -169,15 +299,6 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|||||||
OTHER DEALINGS IN THE SOFTWARE.
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
# husky
|
|
||||||
**Author**: Typicode <typicode@gmail.com>
|
|
||||||
**Repo**: https://github.com/typicode/husky
|
|
||||||
**License**: Parity-7.0.0 AND MIT WITH Patron-1.0.0
|
|
||||||
**Description**: Git hooks made easy
|
|
||||||
## License Text
|
|
||||||
License Zero Parity 7.0.0 (see LICENSE-PARITY file) and MIT (contributions, see LICENSE-MIT file) with exception License Zero Patron 1.0.0 (see LICENSE-PATRON file)
|
|
||||||
|
|
||||||
|
|
||||||
# prettier
|
# prettier
|
||||||
**Author**: James Long
|
**Author**: James Long
|
||||||
**Repo**: prettier/prettier
|
**Repo**: prettier/prettier
|
||||||
@@ -222,35 +343,6 @@ 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
|
||||||
@@ -298,7 +390,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
|
|
||||||
# validator
|
# validator
|
||||||
**Author**: Chris O'Hara <cohara87@gmail.com>
|
**Author**: Chris O'Hara <cohara87@gmail.com>
|
||||||
**Repo**: https://github.com/chriso/validator.js
|
**Repo**: https://github.com/validatorjs/validator.js
|
||||||
**License**: MIT
|
**License**: MIT
|
||||||
**Description**: String validation and sanitization
|
**Description**: String validation and sanitization
|
||||||
## License Text
|
## License Text
|
||||||
|
|||||||
97
package.json
97
package.json
@@ -1,48 +1,49 @@
|
|||||||
{
|
{
|
||||||
"name": "@lfk/beamershow",
|
"name": "@lfk/beamershow",
|
||||||
"version": "0.1.2",
|
"version": "1.0.8",
|
||||||
"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",
|
"licenses:export": "license-exporter --markdown && git stage licenses.md",
|
||||||
"license:export": "license-exporter --markdown && git stage licenses.md",
|
"release": "release-it --only-version"
|
||||||
"release": "release-it --only-version"
|
},
|
||||||
},
|
"devDependencies": {
|
||||||
"devDependencies": {
|
"@odit/license-exporter": "0.2.0",
|
||||||
"@odit/license-exporter": "^0.0.11",
|
"@philippdormann/release-it": "1.0.0",
|
||||||
"@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.5",
|
||||||
"axios": "^0.21.1",
|
"axios": "0.21.1",
|
||||||
"html-minifier": "^4.0.0",
|
"html-minifier": "4.0.0",
|
||||||
"husky": "^5.1.3",
|
"prettier": "3.5.3",
|
||||||
"prettier": "^2.2.1",
|
"prettier-plugin-svelte": "3.3.3",
|
||||||
"prettier-plugin-svelte": "^2.2.0",
|
"svelte": "3.36.0",
|
||||||
"release-it": "14.5.0",
|
"svelte-i18n": "3.3.9",
|
||||||
"svelte": "3.36.0",
|
"svelte-preprocess": "4.7.0",
|
||||||
"svelte-i18n": "3.3.9",
|
"validator": "13.15.0",
|
||||||
"svelte-preprocess": "4.7.0",
|
"vite": "2.1.4",
|
||||||
"validator": "^13.5.2",
|
"vite-plugin-windicss": "1.9.4"
|
||||||
"vite": "2.1.4",
|
},
|
||||||
"vite-plugin-windicss": "0.11.2"
|
"release-it": {
|
||||||
},
|
"git": {
|
||||||
"release-it": {
|
"commit": true,
|
||||||
"git": {
|
"requireCleanWorkingDir": false,
|
||||||
"commit": true,
|
"commitMessage": "chore: release ${version}",
|
||||||
"requireCleanWorkingDir": false,
|
"requireBranch": "main",
|
||||||
"commitMessage": "🚀Bumped version to ${version}",
|
"push": true,
|
||||||
"requireBranch": "main",
|
"tag": true,
|
||||||
"push": false,
|
"tagName": "${version}",
|
||||||
"tag": true,
|
"tagAnnotation": "${version}"
|
||||||
"tagName": null,
|
},
|
||||||
"tagAnnotation": "${version}"
|
"npm": {
|
||||||
},
|
"publish": false
|
||||||
"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"
|
||||||
"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
2917
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
3
pnpm-workspace.yaml
Normal file
3
pnpm-workspace.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
onlyBuiltDependencies:
|
||||||
|
- esbuild
|
||||||
|
- svelte-preprocess
|
||||||
@@ -12,12 +12,10 @@
|
|||||||
import Login from "./Login.svelte";
|
import Login from "./Login.svelte";
|
||||||
import Settings from "./Settings.svelte";
|
import Settings from "./Settings.svelte";
|
||||||
export let settings_open = false;
|
export let settings_open = false;
|
||||||
$: is_configured =
|
$: is_configured = $apikey?.length === 44 && $api_endpoint?.includes("://");
|
||||||
$apikey &&
|
// &&
|
||||||
$apikey !== "null" &&
|
// $laptime_track != 0 &&
|
||||||
$apikey !== "" &&
|
// $laptime_track != null;
|
||||||
$laptime_track != 0 &&
|
|
||||||
$laptime_track != null;
|
|
||||||
init({
|
init({
|
||||||
fallbackLocale: "en-US",
|
fallbackLocale: "en-US",
|
||||||
initialLocale: $lang,
|
initialLocale: $lang,
|
||||||
@@ -29,12 +27,12 @@
|
|||||||
if (e.key === "Escape") {
|
if (e.key === "Escape") {
|
||||||
modal_open = false;
|
modal_open = false;
|
||||||
}
|
}
|
||||||
if (e.keyCode === 13) {
|
// if (e.keyCode === 13) {
|
||||||
if (createbtnenabled === true) {
|
// if (createbtnenabled === true) {
|
||||||
createbtnenabled = false;
|
// createbtnenabled = false;
|
||||||
submit();
|
// submit();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if (command === "" && e.key === "c") {
|
if (command === "" && e.key === "c") {
|
||||||
command = "c";
|
command = "c";
|
||||||
} else if (command === "c" && e.key === "n") {
|
} else if (command === "c" && e.key === "n") {
|
||||||
|
|||||||
@@ -1,367 +1,420 @@
|
|||||||
<script>
|
<script>
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { _ } from "svelte-i18n";
|
import bg from "/beamershow_background.png?inline";
|
||||||
import { slide } from "svelte/transition";
|
import { _ } from "svelte-i18n";
|
||||||
import { apikey, api_endpoint, laptime_track } from "./store.js";
|
import { slide } from "svelte/transition";
|
||||||
function init(el) {
|
import { apikey, api_endpoint, laptime_track } from "./store.js";
|
||||||
el.focus();
|
$: pages = [
|
||||||
}
|
"general",
|
||||||
$: pages = [
|
"runners_distance",
|
||||||
"general",
|
// "runners_laptime",
|
||||||
"runners_distance",
|
"orgs_distance",
|
||||||
"runners_laptime",
|
// "teams_distance",
|
||||||
"orgs_distance",
|
];
|
||||||
"teams_distance",
|
$: current_page = "general";
|
||||||
];
|
$: general = {};
|
||||||
$: current_page = "general";
|
$: runners = [];
|
||||||
$: general = {};
|
$: runners_by_laptime = [];
|
||||||
$: runners = [];
|
$: orgs = [];
|
||||||
$: runners_by_laptime = [];
|
$: teams = [];
|
||||||
$: orgs = [];
|
|
||||||
$: teams = [];
|
|
||||||
|
|
||||||
let time = new Date();
|
let time = new Date();
|
||||||
$: 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) {
|
function format_laptime(laptime) {
|
||||||
if (laptime < 60) {
|
if (laptime < 60) {
|
||||||
return `${laptime}s`;
|
return `${laptime}s`;
|
||||||
}
|
}
|
||||||
if (laptime < 3600) {
|
if (laptime < 3600) {
|
||||||
return `${Math.floor(laptime / 60)}min ${
|
return `${Math.floor(laptime / 60)}min ${
|
||||||
laptime - Math.floor(laptime / 60) * 60
|
laptime - Math.floor(laptime / 60) * 60
|
||||||
}s`;
|
}s`;
|
||||||
}
|
}
|
||||||
return `${Math.floor(laptime / 3600)}h ${
|
return `${Math.floor(laptime / 3600)}h ${
|
||||||
laptime - Math.floor(laptime / 3600) * 3600
|
laptime - Math.floor(laptime / 3600) * 3600
|
||||||
}min ${
|
}min ${
|
||||||
laptime -
|
laptime -
|
||||||
Math.floor(laptime / 3600) * 3600 -
|
Math.floor(laptime / 3600) * 3600 -
|
||||||
Math.floor(laptime / 60) * 60
|
Math.floor(laptime / 60) * 60
|
||||||
}`;
|
}`;
|
||||||
}
|
}
|
||||||
function stats_general() {
|
function stats_general() {
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: $api_endpoint + "api/stats/",
|
url: $api_endpoint + "api/stats/",
|
||||||
headers: { Authorization: "Bearer " + $apikey },
|
headers: { Authorization: "Bearer " + $apikey },
|
||||||
})
|
})
|
||||||
.then(function ({ data }) {
|
.then(function ({ data }) {
|
||||||
general = data;
|
general = data;
|
||||||
})
|
})
|
||||||
.catch(function (e) {
|
.catch(function (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function stats_runners() {
|
function stats_runners() {
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: $api_endpoint + "api/stats/runners/distance",
|
url: $api_endpoint + "api/stats/runners/distance",
|
||||||
headers: { Authorization: "Bearer " + $apikey },
|
headers: { Authorization: "Bearer " + $apikey },
|
||||||
})
|
})
|
||||||
.then(function ({ data }) {
|
.then(function ({ data }) {
|
||||||
runners = data;
|
runners = data;
|
||||||
})
|
})
|
||||||
.catch(function (e) {
|
.catch(function (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function stats_runners_by_laptime() {
|
function stats_runners_by_laptime() {
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url:
|
url:
|
||||||
$api_endpoint + "api/stats/runners/laptime?track=" + $laptime_track,
|
$api_endpoint + "api/stats/runners/laptime?track=" + $laptime_track,
|
||||||
headers: { Authorization: "Bearer " + $apikey },
|
headers: { Authorization: "Bearer " + $apikey },
|
||||||
})
|
})
|
||||||
.then(function ({ data }) {
|
.then(function ({ data }) {
|
||||||
runners_by_laptime = data;
|
runners_by_laptime = data;
|
||||||
})
|
})
|
||||||
.catch(function (e) {
|
.catch(function (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function stats_orgs() {
|
function stats_orgs() {
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: $api_endpoint + "api/stats/organizations/distance",
|
url: $api_endpoint + "api/stats/organizations/distance",
|
||||||
headers: { Authorization: "Bearer " + $apikey },
|
headers: { Authorization: "Bearer " + $apikey },
|
||||||
})
|
})
|
||||||
.then(function ({ data }) {
|
.then(function ({ data }) {
|
||||||
orgs = data;
|
orgs = data;
|
||||||
})
|
})
|
||||||
.catch(function (e) {
|
.catch(function (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function stats_teams() {
|
function stats_teams() {
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: $api_endpoint + "api/stats/teams/distance",
|
url: $api_endpoint + "api/stats/teams/distance",
|
||||||
headers: { Authorization: "Bearer " + $apikey },
|
headers: { Authorization: "Bearer " + $apikey },
|
||||||
})
|
})
|
||||||
.then(function ({ data }) {
|
.then(function ({ data }) {
|
||||||
teams = data;
|
teams = data;
|
||||||
})
|
})
|
||||||
.catch(function (e) {
|
.catch(function (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Array.prototype.cycle = function (str) {
|
Array.prototype.cycle = function (str) {
|
||||||
const i = this.indexOf(str);
|
const i = this.indexOf(str);
|
||||||
if (i === -1) return undefined;
|
if (i === -1) return undefined;
|
||||||
return this[(i + 1) % this.length];
|
return this[(i + 1) % this.length];
|
||||||
};
|
};
|
||||||
function fetch_all() {
|
function fetch_all() {
|
||||||
stats_general();
|
stats_general();
|
||||||
stats_runners();
|
stats_runners();
|
||||||
stats_runners_by_laptime();
|
// stats_runners_by_laptime();
|
||||||
stats_orgs();
|
stats_orgs();
|
||||||
stats_teams();
|
stats_teams();
|
||||||
}
|
}
|
||||||
fetch_all();
|
fetch_all();
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
time = new Date();
|
time = new Date();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
fetch_all();
|
fetch_all();
|
||||||
}, 15000);
|
}, 50000);
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
current_page = pages.cycle(current_page);
|
current_page = pages.cycle(current_page);
|
||||||
}, 20000);
|
}, 20000);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="min-h-screen flex items-center justify-center bg-gray-100"
|
class="min-h-screen flex items-center justify-center bg-gray-100"
|
||||||
style="background-image: url('/beamershow_background.png');background-position: center;background-size: contain;background-repeat:no-repeat;"
|
style="background-image: url({bg});background-position: center;background-size: contain;background-repeat:no-repeat;"
|
||||||
>
|
>
|
||||||
<div class="max-w-xl w-full">
|
<div class="w-full">
|
||||||
{#if current_page === "general"}
|
<div class="w-3/4 xl:w-1/2 mx-auto">
|
||||||
<div transition:slide|local>
|
<!-- -->
|
||||||
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900">
|
{#if current_page === "general"}
|
||||||
{hours}:{minutes}:{seconds}
|
<div transition:slide|local>
|
||||||
</h1>
|
<h1
|
||||||
<!-- -->
|
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900"
|
||||||
<div class="flex flex-wrap -mx-1 overflow-hidden mt-5">
|
>
|
||||||
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
|
{$_("statistiken")}
|
||||||
<h1 class="text-5xl font-semibold text-center text-gray-900">
|
</h1>
|
||||||
{general.total_runners}
|
<!-- -->
|
||||||
</h1>
|
<div class="flex flex-wrap -mx-1 overflow-hidden mt-5">
|
||||||
<h1 class="text-2xl font-semibold text-center text-gray-900">
|
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
|
||||||
{$_("laeufer")}
|
<h1 class="text-5xl font-bold text-center text-gray-900">
|
||||||
</h1>
|
{general.total_runners || "0"}
|
||||||
</div>
|
</h1>
|
||||||
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
|
<h1 class="text-2xl font-semibold text-center text-gray-900">
|
||||||
<h1 class="text-5xl font-semibold text-center text-gray-900">
|
{$_("laeufer")}
|
||||||
{general.total_distance}
|
</h1>
|
||||||
</h1>
|
</div>
|
||||||
<h1 class="text-2xl font-semibold text-center text-gray-900">
|
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3">
|
||||||
{$_("kilometer-gesamt")}
|
<h1 class="text-5xl font-bold text-center text-gray-900">
|
||||||
</h1>
|
{general.total_distance / 1000 || 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(
|
||||||
</div>
|
((general.total_donation || 0) / 100).toFixed(2)
|
||||||
</div>
|
).toLocaleString(undefined, {
|
||||||
</div>
|
minimumFractionDigits: 2,
|
||||||
{:else if current_page === "runners_distance"}
|
maximumFractionDigits: 2,
|
||||||
<div transition:slide|local>
|
}) || "0"} €
|
||||||
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
|
</h1>
|
||||||
{$_("top-laeufer")} ({$_("distanz")})
|
<h1 class="text-2xl font-semibold text-center text-gray-900">
|
||||||
</h1>
|
{$_("spendensumme")}
|
||||||
<table class="table p-4 bg-white shadow rounded-lg w-full">
|
</h1>
|
||||||
<thead>
|
</div>
|
||||||
<tr>
|
</div>
|
||||||
<th
|
</div>
|
||||||
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
{:else if current_page === "runners_distance"}
|
||||||
>
|
<div transition:slide|local>
|
||||||
{$_("platz")}
|
<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-laeufer")} ({$_("distanz")})
|
||||||
>
|
</h1>
|
||||||
{$_("laeufer")}
|
{#if runners.length === 0}
|
||||||
</th>
|
<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}
|
||||||
{$_("organisation")}
|
<table
|
||||||
</th>
|
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
|
||||||
<th
|
>
|
||||||
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
<thead>
|
||||||
>
|
<tr>
|
||||||
{$_("kilometer")}
|
<th
|
||||||
</th>
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
</tr>
|
>
|
||||||
</thead>
|
{$_("platz")}
|
||||||
<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}
|
{$_("laeufer")}
|
||||||
</td>
|
</th>
|
||||||
<td class="border p-4 dark:border-dark-5">
|
<th
|
||||||
{r.firstname}
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
{r.lastname}
|
>
|
||||||
</td>
|
{$_("organisation")}
|
||||||
<td class="border p-4 dark:border-dark-5">
|
</th>
|
||||||
{r.group.name}
|
<th
|
||||||
</td>
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
<td class="border p-4 dark:border-dark-5">
|
>
|
||||||
{r.distance / 1000} km
|
{$_("kilometer")}
|
||||||
</td>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
{/each}
|
</thead>
|
||||||
</tbody>
|
<tbody>
|
||||||
</table>
|
{#each runners as r, i}
|
||||||
</div>
|
<tr class="text-gray-700">
|
||||||
{:else if current_page === "runners_laptime"}
|
<td class="border p-4 dark:border-dark-5">
|
||||||
<div transition:slide|local>
|
{i + 1}
|
||||||
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
|
</td>
|
||||||
{$_("top-laeufer")} ({$_("rundenzeit")})
|
<td class="border p-4 dark:border-dark-5">
|
||||||
</h1>
|
{r.firstname}
|
||||||
<table class="table p-4 bg-white shadow rounded-lg w-full">
|
{r.lastname}
|
||||||
<thead>
|
</td>
|
||||||
<tr>
|
<td class="border p-4 dark:border-dark-5">
|
||||||
<th
|
{r.group.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">
|
||||||
{$_("platz")}
|
{r.distance / 1000} km
|
||||||
</th>
|
</td>
|
||||||
<th
|
</tr>
|
||||||
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
{/each}
|
||||||
>
|
</tbody>
|
||||||
{$_("laeufer")}
|
</table>
|
||||||
</th>
|
{/if}
|
||||||
<th
|
</div>
|
||||||
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
{:else if current_page === "runners_laptime"}
|
||||||
>
|
<div transition:slide|local>
|
||||||
{$_("organisation")}
|
<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-laeufer")} ({$_("rundenzeit")})
|
||||||
>
|
</h1>
|
||||||
{$_("schnellste-rundenzeit")}
|
{#if runners_by_laptime.length === 0}
|
||||||
</th>
|
<p class="w-full text-center text-3xl font-semibold">
|
||||||
</tr>
|
Noch keine Daten...
|
||||||
</thead>
|
</p>
|
||||||
<tbody>
|
{:else}
|
||||||
{#each runners_by_laptime as r, i}
|
<table
|
||||||
<tr class="text-gray-700">
|
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
|
||||||
<td class="border p-4 dark:border-dark-5">
|
>
|
||||||
{i + 1}
|
<thead>
|
||||||
</td>
|
<tr>
|
||||||
<td class="border p-4 dark:border-dark-5">
|
<th
|
||||||
{r.firstname}
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
{r.lastname}
|
>
|
||||||
</td>
|
{$_("platz")}
|
||||||
<td class="border p-4 dark:border-dark-5">
|
</th>
|
||||||
{r.group.name}
|
<th
|
||||||
</td>
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
<td class="border p-4 dark:border-dark-5">
|
>
|
||||||
{format_laptime(r.minLaptime)}
|
{$_("laeufer")}
|
||||||
</td>
|
</th>
|
||||||
</tr>
|
<th
|
||||||
{/each}
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
</tbody>
|
>
|
||||||
</table>
|
{$_("organisation")}
|
||||||
</div>
|
</th>
|
||||||
{:else if current_page === "orgs_distance"}
|
<th
|
||||||
<div transition:slide|local>
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
|
>
|
||||||
{$_("top-organsiationen")}
|
{$_("schnellste-rundenzeit")}
|
||||||
</h1>
|
</th>
|
||||||
<table class="table p-4 bg-white shadow rounded-lg w-full">
|
</tr>
|
||||||
<thead>
|
</thead>
|
||||||
<tr>
|
<tbody>
|
||||||
<th
|
{#each runners_by_laptime as r, i}
|
||||||
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
<tr class="text-gray-700">
|
||||||
>
|
<td class="border p-4 dark:border-dark-5">
|
||||||
{$_("platz")}
|
{i + 1}
|
||||||
</th>
|
</td>
|
||||||
<th
|
<td class="border p-4 dark:border-dark-5">
|
||||||
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
{r.firstname}
|
||||||
>
|
{r.lastname}
|
||||||
{$_("organsiation")}
|
</td>
|
||||||
</th>
|
<td class="border p-4 dark:border-dark-5">
|
||||||
<th
|
{r.group.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">
|
||||||
{$_("kilometer")}
|
{format_laptime(r.minLaptime)}
|
||||||
</th>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
{/each}
|
||||||
<tbody>
|
</tbody>
|
||||||
{#each orgs as o, i}
|
</table>
|
||||||
<tr class="text-gray-700">
|
{/if}
|
||||||
<td class="border p-4 dark:border-dark-5">
|
</div>
|
||||||
{i + 1}
|
{:else if current_page === "orgs_distance"}
|
||||||
</td>
|
<div transition:slide|local>
|
||||||
<td class="border p-4 dark:border-dark-5">
|
<h1
|
||||||
{o.name}
|
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
|
||||||
</td>
|
>
|
||||||
<td class="border p-4 dark:border-dark-5">
|
{$_("top-organisationen")}
|
||||||
{o.distance / 1000} km
|
</h1>
|
||||||
</td>
|
{#if orgs.length === 0}
|
||||||
</tr>
|
<p class="w-full text-center text-3xl font-semibold">
|
||||||
{/each}
|
Noch keine Daten...
|
||||||
</tbody>
|
</p>
|
||||||
</table>
|
{:else}
|
||||||
</div>
|
<table
|
||||||
{:else if current_page === "teams_distance"}
|
class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
|
||||||
<div transition:slide|local>
|
>
|
||||||
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900 mb-5">
|
<thead>
|
||||||
{$_("top-teams")}
|
<tr>
|
||||||
</h1>
|
<th
|
||||||
<table class="table p-4 bg-white shadow rounded-lg w-full">
|
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
||||||
<thead>
|
>
|
||||||
<tr>
|
{$_("platz")}
|
||||||
<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>
|
{$_("organsiation")}
|
||||||
<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"
|
||||||
{$_("team")}
|
>
|
||||||
</th>
|
{$_("kilometer")}
|
||||||
<th
|
</th>
|
||||||
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
|
</tr>
|
||||||
>
|
</thead>
|
||||||
{$_("kilometer")}
|
<tbody>
|
||||||
</th>
|
{#each orgs as o, i}
|
||||||
</tr>
|
<tr class="text-gray-700">
|
||||||
</thead>
|
<td class="border p-4 dark:border-dark-5">
|
||||||
<tbody>
|
{i + 1}
|
||||||
{#each teams as t, i}
|
</td>
|
||||||
<tr class="text-gray-700">
|
<td class="border p-4 dark:border-dark-5">
|
||||||
<td class="border p-4 dark:border-dark-5">
|
{o.name}
|
||||||
{i + 1}
|
</td>
|
||||||
</td>
|
<td class="border p-4 dark:border-dark-5">
|
||||||
<td class="border p-4 dark:border-dark-5">
|
{o.distance / 1000} km
|
||||||
{t.name}
|
</td>
|
||||||
</td>
|
</tr>
|
||||||
<td class="border p-4 dark:border-dark-5">
|
{/each}
|
||||||
{t.distance / 1000} km
|
</tbody>
|
||||||
</td>
|
</table>
|
||||||
</tr>
|
{/if}
|
||||||
{/each}
|
</div>
|
||||||
</tbody>
|
{:else if current_page === "teams_distance"}
|
||||||
</table>
|
<div transition:slide|local>
|
||||||
</div>
|
<h1
|
||||||
{:else}
|
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
|
||||||
<!-- content here -->
|
>
|
||||||
{/if}
|
{$_("top-teams")}
|
||||||
</div>
|
</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>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<script>
|
<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 isURL from "validator/lib/isURL";
|
||||||
import isUUID from "validator/lib/isUUID";
|
import isUUID from "validator/lib/isUUID";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
@@ -10,10 +11,12 @@
|
|||||||
$: error = false;
|
$: error = false;
|
||||||
$: errormessage = "";
|
$: errormessage = "";
|
||||||
$: isTokenValid =
|
$: isTokenValid =
|
||||||
token?.length === 44 &&
|
token === "rst" ||
|
||||||
token.split(".")[0].length === 7 &&
|
(token?.length === 44 &&
|
||||||
isUUID(token.split(".")[1]);
|
token.split(".")[0].length === 7 &&
|
||||||
$: isEndpointValid = isURL(api_endpoint_input);
|
isUUID(token.split(".")[1]));
|
||||||
|
$: isEndpointValid =
|
||||||
|
api_endpoint_input === "rst" || isURL(api_endpoint_input);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="w-full flex flex-wrap">
|
<div class="w-full flex flex-wrap">
|
||||||
@@ -62,11 +65,15 @@
|
|||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
{#if $api_endpoint && !$apikey}
|
{#if $api_endpoint?.includes("://") && (!$apikey || $apikey == null)}
|
||||||
<form
|
<form
|
||||||
class="flex flex-col pt-3 md:pt-8"
|
class="flex flex-col pt-3 md:pt-8"
|
||||||
onsubmit="event.preventDefault();"
|
onsubmit="event.preventDefault();"
|
||||||
on:submit={() => {
|
on:submit={() => {
|
||||||
|
if (token === "rst") {
|
||||||
|
clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
axios
|
axios
|
||||||
.request({
|
.request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
@@ -112,42 +119,19 @@
|
|||||||
>{$_("configure")}</button
|
>{$_("configure")}</button
|
||||||
>
|
>
|
||||||
</form>
|
</form>
|
||||||
{:else if $api_endpoint && $apikey}
|
|
||||||
<form
|
|
||||||
class="flex flex-col pt-3 md:pt-8"
|
|
||||||
onsubmit="event.preventDefault();"
|
|
||||||
on:submit={() => {
|
|
||||||
laptime_track.set(track);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div class="flex flex-col pt-4">
|
|
||||||
<label for="track" class="text-lg">{$_("track_id")}</label>
|
|
||||||
<input
|
|
||||||
type="number"
|
|
||||||
id="track"
|
|
||||||
placeholder="Track"
|
|
||||||
bind:value={track}
|
|
||||||
class:border-red-500={!isTokenValid}
|
|
||||||
class:border-solid={!isTokenValid}
|
|
||||||
class:border-3={!isTokenValid}
|
|
||||||
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mt-1 leading-tight focus:outline-none focus:shadow-outline"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
disabled={!track}
|
|
||||||
class:cursor-pointer={track}
|
|
||||||
class:opacity-50={!track}
|
|
||||||
id="configure"
|
|
||||||
type="submit"
|
|
||||||
class="bg-black text-white font-bold text-lg hover:bg-gray-700 p-2 mt-8 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
|
|
||||||
>{$_("configure")}</button
|
|
||||||
>
|
|
||||||
</form>
|
|
||||||
{:else}
|
{:else}
|
||||||
<form
|
<form
|
||||||
class="flex flex-col pt-3 md:pt-8"
|
class="flex flex-col pt-3 md:pt-8"
|
||||||
onsubmit="event.preventDefault();"
|
onsubmit="event.preventDefault();"
|
||||||
on:submit={() => {
|
on:submit={() => {
|
||||||
|
if (api_endpoint_input === "rst") {
|
||||||
|
clear();
|
||||||
|
api_endpoint_input = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (api_endpoint_input.includes("api/")) {
|
||||||
|
api_endpoint_input = api_endpoint_input.replace("api/", "");
|
||||||
|
}
|
||||||
if (api_endpoint_input.substr(-1) !== "/") {
|
if (api_endpoint_input.substr(-1) !== "/") {
|
||||||
api_endpoint_input = api_endpoint_input + "/";
|
api_endpoint_input = api_endpoint_input + "/";
|
||||||
}
|
}
|
||||||
@@ -270,7 +254,7 @@
|
|||||||
<img
|
<img
|
||||||
alt=""
|
alt=""
|
||||||
class="object-cover w-full h-screen hidden md:block"
|
class="object-cover w-full h-screen hidden md:block"
|
||||||
src="https://source.unsplash.com/IXUM4cJynP0"
|
src={bg}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,14 +13,13 @@
|
|||||||
<p class="block text-sm text-gray-700">{$api_endpoint}</p>
|
<p class="block text-sm text-gray-700">{$api_endpoint}</p>
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("api_key")}</p>
|
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("api_key")}</p>
|
||||||
<p class="block text-sm text-gray-700">{$apikey}</p>
|
<p class="block text-sm text-gray-700">{$apikey}</p>
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_id")}</p>
|
|
||||||
<p class="block text-sm text-gray-700">{$laptime_track}</p>
|
|
||||||
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("language")}</p>
|
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("language")}</p>
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<div class="inline-block mr-2 mt-2">
|
<div class="inline-block mr-2 mt-2">
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
lang.set("de-DE");
|
lang.set("de-DE");
|
||||||
|
location.reload();
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class:bg-blue-700={$lang === "de-DE"}
|
class:bg-blue-700={$lang === "de-DE"}
|
||||||
@@ -46,6 +45,7 @@
|
|||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
lang.set("en-EN");
|
lang.set("en-EN");
|
||||||
|
location.reload();
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class:bg-blue-700={$lang === "en-EN"}
|
class:bg-blue-700={$lang === "en-EN"}
|
||||||
|
|||||||
@@ -30,11 +30,12 @@
|
|||||||
"spendensumme": "Spendensumme",
|
"spendensumme": "Spendensumme",
|
||||||
"station_description": "Beschreibung der Scanstation",
|
"station_description": "Beschreibung der Scanstation",
|
||||||
"station_id": "Scanstations-ID",
|
"station_id": "Scanstations-ID",
|
||||||
|
"statistiken": "Statistiken",
|
||||||
"team": "Team",
|
"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-laeufer": "Top-Läufer",
|
||||||
"top-organsiationen": "Top-Organsiationen",
|
"top-organisationen": "Top-Organisationen",
|
||||||
"top-teams": "Top-Teams",
|
"top-teams": "Top-Teams",
|
||||||
"track_distance": "Länge des Tracks",
|
"track_distance": "Länge des Tracks",
|
||||||
"track_id": "Track ID",
|
"track_id": "Track ID",
|
||||||
|
|||||||
@@ -30,11 +30,12 @@
|
|||||||
"spendensumme": "Donations",
|
"spendensumme": "Donations",
|
||||||
"station_description": "Station Description",
|
"station_description": "Station Description",
|
||||||
"station_id": "Scanstation ID",
|
"station_id": "Scanstation ID",
|
||||||
|
"statistiken": "Statistics",
|
||||||
"team": "Team",
|
"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-laeufer": "Top runners",
|
||||||
"top-organsiationen": "Top organizations",
|
"top-organisationen": "Top organizations",
|
||||||
"top-teams": "Top teams",
|
"top-teams": "Top teams",
|
||||||
"track_distance": "Track Distance",
|
"track_distance": "Track Distance",
|
||||||
"track_id": "Track ID",
|
"track_id": "Track ID",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import App from './App.svelte';
|
import App from './App.svelte';
|
||||||
import 'windi.css';
|
import 'windi.css';
|
||||||
|
import "@fontsource/athiti"
|
||||||
|
|
||||||
const app = new App({
|
const app = new App({
|
||||||
target: document.body
|
target: document.body
|
||||||
|
|||||||
22
src/store.js
22
src/store.js
@@ -1,29 +1,39 @@
|
|||||||
import { writable } from 'svelte/store';
|
import { writable } from 'svelte/store';
|
||||||
|
|
||||||
const stored_api_endpoint = localStorage.getItem('api_endpoint')||"";
|
const stored_api_endpoint = localStorage.getItem('api_endpoint');
|
||||||
export const api_endpoint = writable(stored_api_endpoint);
|
export const api_endpoint = writable(stored_api_endpoint);
|
||||||
api_endpoint.subscribe((value) => {
|
api_endpoint.subscribe((value) => {
|
||||||
localStorage.setItem('api_endpoint', value);
|
if (value != null) {
|
||||||
|
localStorage.setItem('api_endpoint', value);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
const stored_apikey = localStorage.getItem('apikey');
|
const stored_apikey = localStorage.getItem('apikey');
|
||||||
export const apikey = writable(stored_apikey);
|
export const apikey = writable(stored_apikey);
|
||||||
apikey.subscribe((value) => {
|
apikey.subscribe((value) => {
|
||||||
localStorage.setItem('apikey', value);
|
if (value != null) {
|
||||||
|
localStorage.setItem('apikey', value);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
const stored_laptime_track = localStorage.getItem('laptime_track');
|
const stored_laptime_track = localStorage.getItem('laptime_track');
|
||||||
export const laptime_track = writable(stored_laptime_track);
|
export const laptime_track = writable(stored_laptime_track);
|
||||||
laptime_track.subscribe((value) => {
|
laptime_track.subscribe((value) => {
|
||||||
localStorage.setItem('laptime_track', value);
|
if (value != null) {
|
||||||
|
localStorage.setItem('laptime_track', value);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang');
|
const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang');
|
||||||
export const lang = writable(stored_lang);
|
export const lang = writable(stored_lang);
|
||||||
lang.subscribe((value) => {
|
lang.subscribe((value) => {
|
||||||
localStorage.setItem('lang', value);
|
if (value != null) {
|
||||||
|
localStorage.setItem('lang', value);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
export function clear(){
|
export function clear() {
|
||||||
api_endpoint.set(null)
|
api_endpoint.set(null)
|
||||||
|
api_endpoint.set("")
|
||||||
apikey.set(null);
|
apikey.set(null);
|
||||||
|
apikey.set("");
|
||||||
laptime_track.set(null)
|
laptime_track.set(null)
|
||||||
localStorage.clear();
|
localStorage.clear();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user