Compare commits

..

No commits in common. "1.0.6" and "1.0.5" have entirely different histories.
1.0.6 ... 1.0.5

12 changed files with 509 additions and 522 deletions

View File

@ -1,33 +0,0 @@
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

39
.woodpecker/build.yml Normal file
View File

@ -0,0 +1,39 @@
steps:
- name: build latest
image: woodpeckerci/plugin-docker-buildx
settings:
repo: registry.odit.services/lfk/beamershow
tags:
- latest
registry: registry.odit.services
platforms: linux/amd64,linux/arm64
cache_from: registry.odit.services/lfk/beamershow:latest
username:
from_secret: odit-registry-builder-username
password:
from_secret: odit-registry-builder-password
secrets:
- source: odit-npm-cache-url
target: NPM_REGISTRY_URL
when:
branch: main
- name: build dev
image: woodpeckerci/plugin-docker-buildx
settings:
repo: registry.odit.services/lfk/beamershow
tags:
- dev
registry: registry.odit.services
platforms: linux/amd64,linux/arm64
cache_from: registry.odit.services/lfk/beamershow:dev
username:
from_secret: odit-registry-builder-username
password:
from_secret: odit-registry-builder-password
secrets:
- source: odit-npm-cache-url
target: NPM_REGISTRY_URL
when:
branch: dev
when:
event: push

View File

@ -2,25 +2,11 @@
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.6](https://git.odit.services/lfk/beamershow/compare/1.0.5...1.0.6)
- 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: 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) #### [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) - 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) - 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) - 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) - 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(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) - feat: improved background img import [`919b295`](https://git.odit.services/lfk/beamershow/commit/919b2956ab5253a3697c14ac284f6da700afda91)

View File

@ -1,9 +1,9 @@
FROM registry.odit.services/hub/library/node:23.11.0-alpine3.21 as build FROM registry.odit.services/hub/library/node:23.4.0-alpine3.20 as build
ARG NPM_REGISTRY_URL=https://registry.npmjs.org ARG NPM_REGISTRY_URL=https://registry.npmjs.org
WORKDIR /app WORKDIR /app
COPY . ./ COPY . ./
RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@10.7 && pnpm i RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@9 && pnpm i
RUN pnpm build RUN pnpm build
# final image # final image

View File

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

View File

@ -1,6 +1,6 @@
{ {
"name": "@lfk/beamershow", "name": "@lfk/beamershow",
"version": "1.0.6", "version": "1.0.5",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
@ -9,19 +9,19 @@
"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", "@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.5", "@types/html-minifier": "4.0.5",
"axios": "0.21.1", "axios": "0.21.1",
"html-minifier": "4.0.0", "html-minifier": "4.0.0",
"prettier": "3.5.3", "prettier": "3.4.2",
"prettier-plugin-svelte": "3.3.3", "prettier-plugin-svelte": "3.3.2",
"svelte": "3.36.0", "svelte": "3.36.0",
"svelte-i18n": "3.3.9", "svelte-i18n": "3.3.9",
"svelte-preprocess": "4.7.0", "svelte-preprocess": "4.7.0",
"validator": "13.15.0", "validator": "13.12.0",
"vite": "2.1.4", "vite": "2.1.4",
"vite-plugin-windicss": "1.9.4" "vite-plugin-windicss": "1.9.4"
}, },
@ -29,11 +29,11 @@
"git": { "git": {
"commit": true, "commit": true,
"requireCleanWorkingDir": false, "requireCleanWorkingDir": false,
"commitMessage": "chore: release ${version}", "commitMessage": "🚀Bumped version to ${version}",
"requireBranch": "main", "requireBranch": "main",
"push": true, "push": true,
"tag": true, "tag": true,
"tagName": "${version}", "tagName": null,
"tagAnnotation": "${version}" "tagAnnotation": "${version}"
}, },
"npm": { "npm": {
@ -44,6 +44,6 @@
} }
}, },
"dependencies": { "dependencies": {
"@fontsource/athiti": "5.2.5" "@fontsource/athiti": "5.1.0"
} }
} }

87
pnpm-lock.yaml generated
View File

@ -9,12 +9,12 @@ importers:
.: .:
dependencies: dependencies:
'@fontsource/athiti': '@fontsource/athiti':
specifier: 5.2.5 specifier: 5.1.0
version: 5.2.5 version: 5.1.0
devDependencies: devDependencies:
'@odit/license-exporter': '@odit/license-exporter':
specifier: 0.2.0 specifier: 0.0.11
version: 0.2.0 version: 0.0.11
'@philippdormann/release-it': '@philippdormann/release-it':
specifier: 1.0.0 specifier: 1.0.0
version: 1.0.0 version: 1.0.0
@ -34,11 +34,11 @@ importers:
specifier: 4.0.0 specifier: 4.0.0
version: 4.0.0 version: 4.0.0
prettier: prettier:
specifier: 3.5.3 specifier: 3.4.2
version: 3.5.3 version: 3.4.2
prettier-plugin-svelte: prettier-plugin-svelte:
specifier: 3.3.3 specifier: 3.3.2
version: 3.3.3(prettier@3.5.3)(svelte@3.36.0) version: 3.3.2(prettier@3.4.2)(svelte@3.36.0)
svelte: svelte:
specifier: 3.36.0 specifier: 3.36.0
version: 3.36.0 version: 3.36.0
@ -49,8 +49,8 @@ importers:
specifier: 4.7.0 specifier: 4.7.0
version: 4.7.0(postcss@8.4.21)(sass@1.60.0)(svelte@3.36.0) version: 4.7.0(postcss@8.4.21)(sass@1.60.0)(svelte@3.36.0)
validator: validator:
specifier: 13.15.0 specifier: 13.12.0
version: 13.15.0 version: 13.12.0
vite: vite:
specifier: 2.1.4 specifier: 2.1.4
version: 2.1.4 version: 2.1.4
@ -75,8 +75,8 @@ packages:
resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@fontsource/athiti@5.2.5': '@fontsource/athiti@5.1.0':
resolution: {integrity: sha512-vHoAKBBw+wI4y3bGOkiogOkgcoLH7+SWtNNo/nBQ1XfhvfRPX/91xGtclEdwqUlbOJTCkNzEecdKChJQ5MsDFg==} resolution: {integrity: sha512-iQsMj7twMf8bmqW0zBOQX6S3oYdRjjgoGO9JOtLPd9T0pzQ1zxGQmp2eEc3ny/Gd5PDRSmn8E5CNwSjUVl0raA==}
'@formatjs/ecma402-abstract@1.11.4': '@formatjs/ecma402-abstract@1.11.4':
resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==}
@ -167,8 +167,8 @@ packages:
'@octokit/types@13.6.2': '@octokit/types@13.6.2':
resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==}
'@odit/license-exporter@0.2.0': '@odit/license-exporter@0.0.11':
resolution: {integrity: sha512-RRyfQzDLoyLQlGSd8ThJQ3h0fiCe4tkmm935AUvSVQWP+p88FcnI4iaktKBJJVBnIpDhkv/7sDSA5dFc/QMM5w==} resolution: {integrity: sha512-jB5XQF913xaRSF0Hjoqaei/qcTGwBEUc2IZ68OcFShwL/fLfBhI4yhlc9nm9gHgWDEKOInI7mVE8xgpHuiGasA==}
hasBin: true hasBin: true
'@philippdormann/release-it@1.0.0': '@philippdormann/release-it@1.0.0':
@ -389,9 +389,8 @@ packages:
resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
engines: {node: '>= 12'} engines: {node: '>= 12'}
cliui@8.0.1: cliui@7.0.4:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
engines: {node: '>=12'}
clone@1.0.4: clone@1.0.4:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
@ -513,8 +512,8 @@ packages:
resolution: {integrity: sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==} resolution: {integrity: sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==}
hasBin: true hasBin: true
escalade@3.2.0: escalade@3.1.1:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'} engines: {node: '>=6'}
escape-goat@4.0.0: escape-goat@4.0.0:
@ -1081,14 +1080,14 @@ packages:
resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
prettier-plugin-svelte@3.3.3: prettier-plugin-svelte@3.3.2:
resolution: {integrity: sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==} resolution: {integrity: sha512-kRPjH8wSj2iu+dO+XaUv4vD8qr5mdDmlak3IT/7AOgGIMRG86z/EHOLauFcClKEnOUf4A4nOA7sre5KrJD4Raw==}
peerDependencies: peerDependencies:
prettier: ^3.0.0 prettier: ^3.0.0
svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
prettier@3.5.3: prettier@3.4.2:
resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
@ -1430,8 +1429,8 @@ packages:
util-deprecate@1.0.2: util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
validator@13.15.0: validator@13.12.0:
resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==} resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
vite-plugin-windicss@1.9.4: vite-plugin-windicss@1.9.4:
@ -1494,13 +1493,17 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'} engines: {node: '>=10'}
yargs-parser@20.2.9:
resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
engines: {node: '>=10'}
yargs-parser@21.1.1: yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'} engines: {node: '>=12'}
yargs@17.7.2: yargs@16.2.0:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
engines: {node: '>=12'} engines: {node: '>=10'}
yoctocolors-cjs@2.1.2: yoctocolors-cjs@2.1.2:
resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
@ -1522,7 +1525,7 @@ snapshots:
chalk: 2.4.2 chalk: 2.4.2
js-tokens: 4.0.0 js-tokens: 4.0.0
'@fontsource/athiti@5.2.5': {} '@fontsource/athiti@5.1.0': {}
'@formatjs/ecma402-abstract@1.11.4': '@formatjs/ecma402-abstract@1.11.4':
dependencies: dependencies:
@ -1629,9 +1632,9 @@ snapshots:
dependencies: dependencies:
'@octokit/openapi-types': 22.2.0 '@octokit/openapi-types': 22.2.0
'@odit/license-exporter@0.2.0': '@odit/license-exporter@0.0.11':
dependencies: dependencies:
yargs: 17.7.2 yargs: 16.2.0
'@philippdormann/release-it@1.0.0': '@philippdormann/release-it@1.0.0':
dependencies: dependencies:
@ -1903,7 +1906,7 @@ snapshots:
cli-width@4.1.0: {} cli-width@4.1.0: {}
cliui@8.0.1: cliui@7.0.4:
dependencies: dependencies:
string-width: 4.2.3 string-width: 4.2.3
strip-ansi: 6.0.1 strip-ansi: 6.0.1
@ -2005,7 +2008,7 @@ snapshots:
esbuild@0.9.7: {} esbuild@0.9.7: {}
escalade@3.2.0: {} escalade@3.1.1: {}
escape-goat@4.0.0: {} escape-goat@4.0.0: {}
@ -2549,12 +2552,12 @@ snapshots:
picocolors: 1.0.0 picocolors: 1.0.0
source-map-js: 1.0.2 source-map-js: 1.0.2
prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@3.36.0): prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@3.36.0):
dependencies: dependencies:
prettier: 3.5.3 prettier: 3.4.2
svelte: 3.36.0 svelte: 3.36.0
prettier@3.5.3: {} prettier@3.4.2: {}
proto-list@1.2.4: {} proto-list@1.2.4: {}
@ -2835,7 +2838,7 @@ snapshots:
util-deprecate@1.0.2: {} util-deprecate@1.0.2: {}
validator@13.15.0: {} validator@13.12.0: {}
vite-plugin-windicss@1.9.4(vite@2.1.4): vite-plugin-windicss@1.9.4(vite@2.1.4):
dependencies: dependencies:
@ -2902,16 +2905,18 @@ snapshots:
y18n@5.0.8: {} y18n@5.0.8: {}
yargs-parser@20.2.9: {}
yargs-parser@21.1.1: {} yargs-parser@21.1.1: {}
yargs@17.7.2: yargs@16.2.0:
dependencies: dependencies:
cliui: 8.0.1 cliui: 7.0.4
escalade: 3.2.0 escalade: 3.1.1
get-caller-file: 2.0.5 get-caller-file: 2.0.5
require-directory: 2.1.1 require-directory: 2.1.1
string-width: 4.2.3 string-width: 4.2.3
y18n: 5.0.8 y18n: 5.0.8
yargs-parser: 21.1.1 yargs-parser: 20.2.9
yoctocolors-cjs@2.1.2: {} yoctocolors-cjs@2.1.2: {}

View File

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

View File

@ -1,420 +1,416 @@
<script> <script>
import axios from "axios"; import axios from "axios";
import bg from "/beamershow_background.png?inline"; import bg from "/beamershow_background.png?import";
import { _ } from "svelte-i18n"; import { _ } from "svelte-i18n";
import { slide } from "svelte/transition"; import { slide } from "svelte/transition";
import { apikey, api_endpoint, laptime_track } from "./store.js"; import { apikey, api_endpoint, laptime_track } from "./store.js";
$: pages = [ function init(el) {
"general", el.focus();
"runners_distance", }
// "runners_laptime", $: pages = [
"orgs_distance", "general",
// "teams_distance", "runners_distance",
]; // "runners_laptime",
$: current_page = "general"; "orgs_distance",
$: general = {}; // "teams_distance",
$: runners = []; ];
$: runners_by_laptime = []; $: current_page = "general";
$: orgs = []; $: general = {};
$: teams = []; $: runners = [];
$: runners_by_laptime = [];
$: 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();
}, 50000); }, 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({bg});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="w-full"> <div class="w-full">
<div class="w-3/4 xl:w-1/2 mx-auto"> <div class="w-3/4 xl:w-1/2 mx-auto">
<!-- --> <!-- -->
{#if current_page === "general"} {#if current_page === "general"}
<div transition:slide|local> <div transition:slide|local>
<h1 <h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900" class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900"
> >
{$_("statistiken")} Statistiken
</h1> </h1>
<!-- --> <!-- -->
<div class="flex flex-wrap -mx-1 overflow-hidden mt-5"> <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"> <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"> <h1 class="text-5xl font-bold text-center text-gray-900">
{general.total_runners || "0"} {general.total_runners || "0"}
</h1> </h1>
<h1 class="text-2xl font-semibold text-center text-gray-900"> <h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("laeufer")} {$_("laeufer")}
</h1> </h1>
</div> </div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> <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"> <h1 class="text-5xl font-bold text-center text-gray-900">
{general.total_distance / 1000 || 0} {general.total_distance / 1000 || 0}
</h1> </h1>
<h1 class="text-2xl font-semibold text-center text-gray-900"> <h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("kilometer-gesamt")} {$_("kilometer-gesamt")}
</h1> </h1>
</div> </div>
<div class="my-1 px-1 w-full overflow-hidden sm:w-1/2 md:w-1/3"> <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"> <h1 class="text-5xl font-bold text-center text-gray-900">
{parseFloat( {parseFloat(
((general.total_donation || 0) / 100).toFixed(2) ((general.total_donation || 0) / 100).toFixed(2)
).toLocaleString(undefined, { ).toLocaleString(undefined, {
minimumFractionDigits: 2, minimumFractionDigits: 2,
maximumFractionDigits: 2, maximumFractionDigits: 2,
}) || "0"} € }) || "0"} €
</h1> </h1>
<h1 class="text-2xl font-semibold text-center text-gray-900"> <h1 class="text-2xl font-semibold text-center text-gray-900">
{$_("spendensumme")} {$_("spendensumme")}
</h1> </h1>
</div> </div>
</div> </div>
</div> </div>
{:else if current_page === "runners_distance"} {:else if current_page === "runners_distance"}
<div transition:slide|local> <div transition:slide|local>
<h1 <h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
> >
{$_("top-laeufer")} ({$_("distanz")}) {$_("top-laeufer")} ({$_("distanz")})
</h1> </h1>
{#if runners.length === 0} {#if runners.length === 0}
<p class="w-full text-center text-3xl font-semibold"> <p class="w-full text-center text-3xl font-semibold">
Noch keine Daten... Noch keine Daten...
</p> </p>
{:else} {:else}
<table <table
class="table font-semibold p-4 bg-white shadow rounded-lg w-full" class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
> >
<thead> <thead>
<tr> <tr>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("platz")} {$_("platz")}
</th> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("laeufer")} {$_("laeufer")}
</th> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("organisation")} {$_("organisation")}
</th> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("kilometer")} {$_("kilometer")}
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{#each runners as r, i} {#each runners as r, i}
<tr class="text-gray-700"> <tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{i + 1} {i + 1}
</td> </td>
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{r.firstname} {r.firstname}
{r.lastname} {r.lastname}
</td> </td>
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{r.group.name} {r.group.name}
</td> </td>
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{r.distance / 1000} km {r.distance / 1000} km
</td> </td>
</tr> </tr>
{/each} {/each}
</tbody> </tbody>
</table> </table>
{/if} {/if}
</div> </div>
{:else if current_page === "runners_laptime"} {:else if current_page === "runners_laptime"}
<div transition:slide|local> <div transition:slide|local>
<h1 <h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
> >
{$_("top-laeufer")} ({$_("rundenzeit")}) {$_("top-laeufer")} ({$_("rundenzeit")})
</h1> </h1>
{#if runners_by_laptime.length === 0} {#if runners_by_laptime.length === 0}
<p class="w-full text-center text-3xl font-semibold"> <p class="w-full text-center text-3xl font-semibold">
Noch keine Daten... Noch keine Daten...
</p> </p>
{:else} {:else}
<table <table
class="table font-semibold p-4 bg-white shadow rounded-lg w-full" class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
> >
<thead> <thead>
<tr> <tr>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("platz")} {$_("platz")}
</th> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("laeufer")} {$_("laeufer")}
</th> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("organisation")} {$_("organisation")}
</th> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("schnellste-rundenzeit")} {$_("schnellste-rundenzeit")}
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{#each runners_by_laptime as r, i} {#each runners_by_laptime as r, i}
<tr class="text-gray-700"> <tr class="text-gray-700">
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{i + 1} {i + 1}
</td> </td>
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{r.firstname} {r.firstname}
{r.lastname} {r.lastname}
</td> </td>
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{r.group.name} {r.group.name}
</td> </td>
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{format_laptime(r.minLaptime)} {format_laptime(r.minLaptime)}
</td> </td>
</tr> </tr>
{/each} {/each}
</tbody> </tbody>
</table> </table>
{/if} {/if}
</div> </div>
{:else if current_page === "orgs_distance"} {:else if current_page === "orgs_distance"}
<div transition:slide|local> <div transition:slide|local>
<h1 <h1
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
> >
{$_("top-organisationen")} {$_("top-organisationen")}
</h1> </h1>
{#if orgs.length === 0} <table
<p class="w-full text-center text-3xl font-semibold"> class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
Noch keine Daten... >
</p> <thead>
{:else} <tr>
<table <th
class="table font-semibold 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> {$_("platz")}
<tr> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("platz")} {$_("organsiation")}
</th> </th>
<th <th
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
> >
{$_("organsiation")} {$_("kilometer")}
</th> </th>
<th </tr>
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" </thead>
> <tbody>
{$_("kilometer")} {#each orgs as o, i}
</th> <tr class="text-gray-700">
</tr> <td class="border p-4 dark:border-dark-5">
</thead> {i + 1}
<tbody> </td>
{#each orgs as o, i} <td class="border p-4 dark:border-dark-5">
<tr class="text-gray-700"> {o.name}
<td class="border p-4 dark:border-dark-5"> </td>
{i + 1} <td class="border p-4 dark:border-dark-5">
</td> {o.distance / 1000} km
<td class="border p-4 dark:border-dark-5"> </td>
{o.name} </tr>
</td> {/each}
<td class="border p-4 dark:border-dark-5"> </tbody>
{o.distance / 1000} km </table>
</td> </div>
</tr> {:else if current_page === "teams_distance"}
{/each} <div transition:slide|local>
</tbody> <h1
</table> class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3"
{/if} >
</div> {$_("top-teams")}
{:else if current_page === "teams_distance"} </h1>
<div transition:slide|local> <table
<h1 class="table font-semibold p-4 bg-white shadow rounded-lg w-full"
class="mr-6 text-5xl xl:text-7xl font-bold text-center text-gray-900 mb-3" >
> <thead>
{$_("top-teams")} <tr>
</h1> <th
<table class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
class="table font-semibold p-4 bg-white shadow rounded-lg w-full" >
> {$_("platz")}
<thead> </th>
<tr> <th
<th class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" >
> {$_("team")}
{$_("platz")} </th>
</th> <th
<th class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900"
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" >
> {$_("kilometer")}
{$_("team")} </th>
</th> </tr>
<th </thead>
class="border p-4 dark:border-dark-5 whitespace-nowrap font-normal text-gray-900" <tbody>
> {#each teams as t, i}
{$_("kilometer")} <tr class="text-gray-700">
</th> <td class="border p-4 dark:border-dark-5">
</tr> {i + 1}
</thead> </td>
<tbody> <td class="border p-4 dark:border-dark-5">
{#each teams as t, i} {t.name}
<tr class="text-gray-700"> </td>
<td class="border p-4 dark:border-dark-5"> <td class="border p-4 dark:border-dark-5">
{i + 1} {t.distance / 1000} km
</td> </td>
<td class="border p-4 dark:border-dark-5"> </tr>
{t.parent.name}<br /> {/each}
{t.name} </tbody>
</td> </table>
<td class="border p-4 dark:border-dark-5"> </div>
{t.distance / 1000} km {:else}
</td> <!-- content here -->
</tr> {/if}
{/each} </div>
</tbody> </div>
</table> <h1
</div> 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"
{:else} >
<!-- content here --> {hours}:{minutes}:{seconds}
{/if} </h1>
</div> <h1
</div> class="text-xl xl:text-3xl font-medium text-center text-gray-900 font-mono bottom-2 xl:bottom-4 w-full fixed"
<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" <span class="text-black font-extrabold">Lauf für Kaya!</span> - powered by ODIT.Services
> </h1>
{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>

View File

@ -1,5 +1,4 @@
<script> <script>
import bg from "/beamershow_background.png?inline";
import { apikey, lang, api_endpoint, laptime_track, clear } from "./store.js"; import { apikey, lang, api_endpoint, laptime_track, clear } from "./store.js";
import isURL from "validator/lib/isURL"; import isURL from "validator/lib/isURL";
import isUUID from "validator/lib/isUUID"; import isUUID from "validator/lib/isUUID";
@ -254,7 +253,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={bg} src="https://source.unsplash.com/IXUM4cJynP0"
/> />
</div> </div>
</div> </div>

View File

@ -30,7 +30,6 @@
"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.",

View File

@ -30,7 +30,6 @@
"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.",