105 Commits

Author SHA1 Message Date
3fa1bc93eb 🚀Bumped version to 0.1.5 2021-04-13 18:35:53 +02:00
18845f86d1 🧹 drop emoji from ui bar 2021-04-13 18:35:36 +02:00
0a23f6a7e5 🚀Bumped version to 0.1.4 2021-04-07 19:55:15 +02:00
277269e299 Formatting 2021-04-07 19:55:01 +02:00
0cd3c6da1b Added fix for empty input 2021-04-07 19:52:51 +02:00
d443b2904e 🚀Bumped version to 0.1.3 2021-04-07 19:35:03 +02:00
1092112f7f Added release title 2021-04-07 19:34:41 +02:00
af48e920bc 🚀Bumped version to 0.1.2 2021-04-07 19:31:50 +02:00
7f44ad402b Merge branch 'feature/14-release_config' into dev
# Conflicts:
#	package.json
2021-04-07 19:31:18 +02:00
6ade51fb73 Merge pull request 'feature/13-url_validator' (#15) from feature/13-url_validator into dev
Reviewed-on: #15
2021-04-07 17:26:39 +00:00
da3e56d9dc Merge branch 'main' into feature/14-release_config 2021-04-07 17:23:27 +00:00
2f1567e802 Changed tag name scheme
ref #14
2021-04-07 19:22:39 +02:00
6ba90a7851 Merge branch 'dev' into feature/13-url_validator 2021-04-07 19:06:03 +02:00
97ef6c798e formatting
ref #13
2021-04-07 19:04:01 +02:00
0cea262ac5 added validator js
ref #13
2021-04-07 19:03:48 +02:00
d83a908db6 Updated ci token and added electron build via ci custom call
ref #14
2021-04-07 18:12:45 +02:00
96cbac2702 Revert "0.1.2"
This reverts commit 1d788671c6.
2021-04-07 17:00:54 +02:00
1d788671c6 0.1.2 2021-04-07 16:59:42 +02:00
e7458c49f0 Now also triggering electron build
ref #14
2021-04-07 16:59:35 +02:00
2ec6e1c107 Merge branch 'feature/14-release_config' of git.odit.services:lfk/scanclient into feature/14-release_config 2021-04-07 16:51:47 +02:00
3c2300c09e Updated package version to the current version
ref #14
2021-04-07 16:51:46 +02:00
69ab9893d3 Updated version to the current electron version
ref #14
2021-04-07 16:51:25 +02:00
dbff163b6b Added release-it w/ config
ref #14
2021-04-07 16:50:38 +02:00
703168081c Merge pull request 'Symbols for valid/invalid scans feature/11-valid_icons' (#12) from feature/11-valid_icons into dev
Reviewed-on: #12
2021-04-06 19:01:07 +00:00
64398cdd74 Now also showing for errors
ref #11
2021-04-06 20:53:21 +02:00
a4d749cc3f Added svg titels
ref #11
2021-04-06 18:07:13 +02:00
838127cf72 Added missing translations
ref #11
2021-04-06 18:05:04 +02:00
379999e491 Changed test sizes to fit the page on smaller screens
ref #11
2021-04-06 18:03:13 +02:00
be6974af20 Added valid/invalid svg icons
ref #11
2021-04-06 18:00:31 +02:00
c0555c0662 Added valid/invalid logic
ref #11
2021-04-06 18:00:05 +02:00
db4d63da8b Merge pull request 'feature/9-move-url-config-from-env-to-local-config' (#10) from feature/9-move-url-config-from-env-to-local-config into dev
Reviewed-on: #10
close #9
2021-03-23 17:35:48 +00:00
b80a832256 Login - add trailing slash to api_endpoint url
ref #9
2021-03-23 18:10:58 +01:00
81b2db60ec 🧹 drop old env.js
ref #9
2021-03-22 19:28:42 +01:00
5563f1fca3 new api_endpoint store + Config UI
ref #9
2021-03-22 19:26:03 +01:00
2fa6acea3a Merge branch 'dev' into main
All checks were successful
continuous-integration/drone/tag Build is passing
2021-03-19 18:49:35 +01:00
517cfddc5f CI - mkdir out 2021-03-19 18:49:26 +01:00
8809c583d0 Merge branch 'dev' into main
Some checks failed
continuous-integration/drone/tag Build is failing
2021-03-19 18:44:52 +01:00
ae0ec9d67c CI fix 2021-03-19 18:44:38 +01:00
f211e35517 Merge branch 'main' of https://git.odit.services/lfk/scanclient into main 2021-03-19 18:25:59 +01:00
cfd40d3f19 re-enable CI 2021-03-19 18:25:28 +01:00
76ccb2290e Merge pull request 'Husky pre-commit hooks 🐶' (#8) from dev into main
Reviewed-on: #8

close #4
close #5
2021-03-19 16:41:28 +00:00
5c117d6f48 Merge branch 'main' into dev 2021-03-19 16:40:32 +00:00
0296c26479 Merge branch 'feature/4-license-exporter' into dev
close #4 , close #5
2021-03-19 17:36:50 +01:00
d0facb2846 added husky formatting 🐶
ref #5
2021-03-19 17:33:23 +01:00
7deb0d26c4 added license:export script to pre-commit hook
ref #4
2021-03-19 17:32:54 +01:00
00b8a14bc3 husky 🐶 2021-03-19 17:24:39 +01:00
31ccf0758d Merge pull request 'dev' (#6) from dev into main
Reviewed-on: #6
2021-03-19 16:17:08 +00:00
116f9123e2 drop CI 2021-03-19 17:13:20 +01:00
1fd1b32d1a cleanup 🧹 2021-03-19 16:57:31 +01:00
81750dc8e1 move to client code only 2021-03-19 16:48:27 +01:00
f8e858971f Merge pull request 'feature/1-basic-scan-client' (#3) from feature/1-basic-scan-client into dev
Reviewed-on: #3

close #1
2021-03-18 17:54:40 +00:00
f7274378b8 🧹 cleanup 2021-03-18 18:43:37 +01:00
b3f7002556 🌎 all translations
ref #1
2021-03-18 18:40:36 +01:00
e087a8dc30 🌎 Login Translations done 2021-03-18 18:35:08 +01:00
0aea3c1e7c locale persistance
ref #1
2021-03-18 18:29:59 +01:00
ff99657ab3 drop husky 🐶 2021-03-18 18:19:57 +01:00
16d9a6dda8 basic i18n
ref #1
2021-03-18 18:15:54 +01:00
0ebabe239c working scans 🎉 2021-03-17 19:59:07 +01:00
c930d87900 Scanner - display total distance
ref #1
2021-03-17 19:06:53 +01:00
559842d2a6 basic Scanner working
ref #1
2021-03-17 18:55:50 +01:00
1fc0490590 scan error feedback
ref #1
2021-03-17 18:52:37 +01:00
f5537278ab display station info in settings view
ref #1
2021-03-17 18:52:17 +01:00
8a6521faa0 scanner ui + login error states
ref #1
2021-03-17 18:44:56 +01:00
82dd786210 add stationinfo persistence
ref #1
2021-03-17 18:44:10 +01:00
42b2390bd7 responsiveness of scanner component
ref #1
2021-03-16 14:39:57 +01:00
8c465e8b7d [husky 🐶] test 2021-03-16 14:34:43 +01:00
936f023886 [husky 🐶] improved hook 2021-03-16 14:34:27 +01:00
bce4b4e2b6 [husky 🐶] test 2021-03-16 14:32:59 +01:00
eb04446a43 [husky 🐶] test 2021-03-16 14:30:10 +01:00
ffcacd32f6 precommit format 2021-03-16 14:29:39 +01:00
e8e462e264 demo for husky precommit formatting 2021-03-16 14:26:31 +01:00
f40e638583 testing husky precommit hook 2021-03-16 14:25:57 +01:00
93efc326ab formatting 2021-03-16 14:19:53 +01:00
7cde92e206 added lang option to config page
ref #1
2021-03-15 15:22:44 +01:00
4e8a203c6d 👀 added basic settings page
ref #1
2021-03-15 15:21:09 +01:00
ece709954c 🧠 base ui logic
ref #1
2021-03-15 14:56:30 +01:00
0f20996ac3 input autofocus
ref #1
2021-03-15 14:56:13 +01:00
22671156a9 added live clock widget
ref #1
2021-03-15 14:55:59 +01:00
84a2ca60b7 📷 Scanner - basic language switching
ref #1
2021-03-15 14:38:45 +01:00
d0112c31e0 🚚 split into App, Login, Scanner
ref #1
2021-03-15 14:38:27 +01:00
c2f9da6e92 💾 store - added localstorage persistence
ref #1
2021-03-15 14:13:19 +01:00
df3621d086 💾 added basic svelte store
ref #1
2021-03-15 14:11:24 +01:00
e4f5a810a4 🚧 basic client token frontend validation ui logic
ref #1
2021-03-15 14:01:58 +01:00
ba07f7b55f Merge branch 'main' of https://git.odit.services/lfk/scanclient into main
# Conflicts:
#	.gitignore
#	README.md
#	main.js
#	package.json
2021-03-15 13:36:54 +01:00
a2ec9d0cb3 👷‍♂️ CI - move to main tags event + disable rpm build for now 2021-03-15 13:33:22 +01:00
3e533f5c6d CI - fixed rpm build
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build was killed
2021-03-14 22:03:04 +01:00
8f907ba597 CI - rpm release building
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:59:41 +01:00
e85a639e96 CI - only build @lfk-scanclient-linux-x64
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build was killed
2021-03-14 21:52:41 +01:00
b1c9cc7652 CI - testing full artifact zipping
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is passing
2021-03-14 21:47:50 +01:00
ab7ba528ee removed "@" from dist package
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:35:41 +01:00
bfff17c465 🚚 move to apk zip
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:28:40 +01:00
de92402a3c CI - 📁 create zip for release
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:17:05 +01:00
f4037c78ca CI - also trigger on tag events
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is failing
2021-03-14 20:57:13 +01:00
b42ff9ec3c CI Test
Some checks failed
continuous-integration/drone/push Build is failing
2021-03-14 20:54:07 +01:00
08922d3363 CI - added secret from path 2021-03-14 20:51:04 +01:00
49e9317f4a CI file 2021-03-14 20:49:34 +01:00
0189a16df0 🐳 added git as a electron dependency 2021-03-14 20:29:36 +01:00
f9c050b9f7 simple Dockerfile 2021-03-14 20:26:51 +01:00
d728ae37e6 added basic dev script + more readme 2021-03-14 20:07:11 +01:00
18ca318b18 proper scripts for electron building/webapp building 2021-03-14 20:05:00 +01:00
7377b4c9d0 demo for electron packaging 2021-03-14 19:55:21 +01:00
f14885854e 🧹 cleanups 2021-03-14 19:39:46 +01:00
bb25203104 drop yarn.lock 2021-03-14 19:27:38 +01:00
e94ce9731d basic svelte+vite+windicss app 2021-03-14 19:26:21 +01:00
560b0f4c74 tmp 2021-03-14 19:06:51 +01:00
31 changed files with 6182 additions and 403 deletions

24
.dockerignore Normal file
View File

@@ -0,0 +1,24 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/charts
**/docker-compose*
**/compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md

51
.drone.yml Normal file
View File

@@ -0,0 +1,51 @@
---
kind: secret
name: gitea_token
get:
path: odit-git-bot
name: apikey
---
kind: secret
name: ci_token
get:
path: odit-ci-bot
name: apikey
---
kind: pipeline
type: kubernetes
name: build:tag
steps:
- name: run build
image: node:15.11.0-alpine3.13
commands:
- apk add git zip -f
- yarn
- yarn build
- mkdir out
- zip -r out/dist.zip dist
- name: gitea add packages to build
image: plugins/gitea-release
settings:
api_key:
from_secret: gitea_token
base_url: https://git.odit.services
files: out/*
title: Release ${DRONE_TAG}
checksum:
- md5
- sha1
- sha256
- sha512
- adler32
- crc32
- name: trigger electron build
image: idcooldi/drone-webhook
settings:
urls: https://ci.odit.services/api/repos/lfk/scanclient-electron/builds?SOURCE_TAG=${DRONE_TAG}
bearer:
from_secret: ci_token
trigger:
event:
- tag

29
.gitignore vendored
View File

@@ -1,22 +1,9 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Dependency directories
node_modules/
jspm_packages/
# Svelte Distribution
public/build/
# Electron Distribution
dist
# Project Build Automation Directory
private
# Desktop Services Store on macOS
/node_modules/
/dist/
.DS_Store
package-lock.json
yarn.lock
/out
/yarn.lock
/app/node_modules
/app/dist

1
.husky/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
_

5
.husky/pre-commit Normal file
View File

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

View File

@@ -0,0 +1,7 @@
languageIds:
- javascript
- svelte
- html
monopoly: false
refactorTemplates:
- "{$_('$1')}"

4
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,4 @@
{
"i18n-ally.localesPaths": "src/locales",
"i18n-ally.keystyle": "nested"
}

223
CHANGELOG.md Normal file
View File

@@ -0,0 +1,223 @@
### Changelog
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [v0.1.5](https://git.odit.services/lfk/scanclient/compare/0.1.4...v0.1.5)
- 🧹 drop emoji from ui bar [`18845f8`](https://git.odit.services/lfk/scanclient/commit/18845f86d12bf82ede8170e81805bf49f37f63f5)
#### [0.1.4](https://git.odit.services/lfk/scanclient/compare/0.1.3...0.1.4)
> 7 April 2021
- 🚀Bumped version to 0.1.4 [`0a23f6a`](https://git.odit.services/lfk/scanclient/commit/0a23f6a7e5d77852c035bcd0ad49260d429d687d)
- Formatting [`277269e`](https://git.odit.services/lfk/scanclient/commit/277269e299924dbc76b39d3503aa50da43888622)
- Added fix for empty input [`0cd3c6d`](https://git.odit.services/lfk/scanclient/commit/0cd3c6da1bb885eebb132b04ec3ef8e08f4ef679)
#### [0.1.3](https://git.odit.services/lfk/scanclient/compare/0.1.2...0.1.3)
> 7 April 2021
- 🚀Bumped version to 0.1.3 [`d443b29`](https://git.odit.services/lfk/scanclient/commit/d443b2904e9f51f9e182912bba1c2571d2c9abff)
- Added release title [`1092112`](https://git.odit.services/lfk/scanclient/commit/1092112f7f75e49f9a6b9c197a29cca77d73684f)
#### [0.1.2](https://git.odit.services/lfk/scanclient/compare/0.1.1...0.1.2)
> 7 April 2021
- Merge pull request 'feature/9-move-url-config-from-env-to-local-config' (#10) from feature/9-move-url-config-from-env-to-local-config into dev [`#9`](https://git.odit.services/lfk/scanclient/issues/9)
- 🚀Bumped version to 0.1.2 [`af48e92`](https://git.odit.services/lfk/scanclient/commit/af48e920bcc3f50858c488f521978e177f06b499)
- Merge pull request 'feature/13-url_validator' (#15) from feature/13-url_validator into dev [`6ade51f`](https://git.odit.services/lfk/scanclient/commit/6ade51fb73c0a67d7fc410f5f52460297a920928)
- new api_endpoint store + Config UI [`5563f1f`](https://git.odit.services/lfk/scanclient/commit/5563f1fca386dd27b4313d4ce213ec2cb2836d4a)
- Revert "0.1.2" [`96cbac2`](https://git.odit.services/lfk/scanclient/commit/96cbac27028c81aaeeabcf9359632eda9ae21ae4)
- Added release-it w/ config [`dbff163`](https://git.odit.services/lfk/scanclient/commit/dbff163b6b20d79dc089b8a2074702230ece19f5)
- added validator js [`0cea262`](https://git.odit.services/lfk/scanclient/commit/0cea262ac5d48bdf3906593871360928eed4b446)
- Now also triggering electron build [`e7458c4`](https://git.odit.services/lfk/scanclient/commit/e7458c49f0b808b55118c7d83b488054445d4136)
- Added valid/invalid svg icons [`be6974a`](https://git.odit.services/lfk/scanclient/commit/be6974af20f1f6b3304e3066b0cd4ad71532fe70)
- Updated ci token and added electron build via ci custom call [`d83a908`](https://git.odit.services/lfk/scanclient/commit/d83a908db6372dd466656ce06706acd419a18f0f)
- Added missing translations [`838127c`](https://git.odit.services/lfk/scanclient/commit/838127cf72befe448d8bf0d6c7ed3b32c5d43fc1)
- Added valid/invalid logic [`c0555c0`](https://git.odit.services/lfk/scanclient/commit/c0555c066227711aa4e50d6eb154b211e88c00bf)
- Changed test sizes to fit the page on smaller screens [`379999e`](https://git.odit.services/lfk/scanclient/commit/379999e491093cb50e16da9b7207242d7ad333f2)
- Added svg titels [`a4d749c`](https://git.odit.services/lfk/scanclient/commit/a4d749cc3f876041b2f03a7e200c7f684144d79f)
- 🧹 drop old env.js [`81b2db6`](https://git.odit.services/lfk/scanclient/commit/81b2db60ecc3d1633ca299f772feefdc03ee976d)
- Changed tag name scheme [`2f1567e`](https://git.odit.services/lfk/scanclient/commit/2f1567e802520c74ed4f0b2f8a1137ce4bb5eeff)
- formatting [`97ef6c7`](https://git.odit.services/lfk/scanclient/commit/97ef6c798eafb4949673fd65c8fa27aa6578fb39)
- Login - add trailing slash to api_endpoint url [`b80a832`](https://git.odit.services/lfk/scanclient/commit/b80a83225621d1442685c4cae02b20147e52e75b)
- Updated package version to the current version [`3c2300c`](https://git.odit.services/lfk/scanclient/commit/3c2300c09e1d9a197433100846de180898c6e6c0)
- Updated version to the current electron version [`69ab989`](https://git.odit.services/lfk/scanclient/commit/69ab9893d3e38542697ca0cf54732d87a8e0197c)
- Merge pull request 'Symbols for valid/invalid scans feature/11-valid_icons' (#12) from feature/11-valid_icons into dev [`7031680`](https://git.odit.services/lfk/scanclient/commit/703168081cbfd6c504009e250bc4ad893a246172)
- Now also showing ❌ for errors [`64398cd`](https://git.odit.services/lfk/scanclient/commit/64398cdd74209ef9540eca9b78301057ae0cc5cb)
#### [0.1.1](https://git.odit.services/lfk/scanclient/compare/0.1.0...0.1.1)
> 19 March 2021
- Merge pull request 'Husky pre-commit hooks 🐶' (#8) from dev into main [`#4`](https://git.odit.services/lfk/scanclient/issues/4) [`#5`](https://git.odit.services/lfk/scanclient/issues/5)
- Merge branch 'feature/4-license-exporter' into dev [`#4`](https://git.odit.services/lfk/scanclient/issues/4) [`#5`](https://git.odit.services/lfk/scanclient/issues/5)
- added license:export script to pre-commit hook [`7deb0d2`](https://git.odit.services/lfk/scanclient/commit/7deb0d26c466dfa77a90ab7d213949354fd2a1b1)
- re-enable CI [`cfd40d3`](https://git.odit.services/lfk/scanclient/commit/cfd40d3f1901f64213f267596a0b699ec17726c5)
- added husky formatting 🐶 [`d0facb2`](https://git.odit.services/lfk/scanclient/commit/d0facb2846c467abfa227b400a19c1e3444dcffd)
- husky 🐶 [`00b8a14`](https://git.odit.services/lfk/scanclient/commit/00b8a14bc3e529286fcbfbecda81a349bed2138a)
- CI fix [`ae0ec9d`](https://git.odit.services/lfk/scanclient/commit/ae0ec9d67cc613937471441ff8b9c516d7a51558)
- CI - mkdir out [`517cfdd`](https://git.odit.services/lfk/scanclient/commit/517cfddc5fc00e0661e5f57d687dbd5b7aa24cef)
#### [0.1.0](https://git.odit.services/lfk/scanclient/compare/0.0.8...0.1.0)
> 19 March 2021
- Merge pull request 'feature/1-basic-scan-client' (#3) from feature/1-basic-scan-client into dev [`#1`](https://git.odit.services/lfk/scanclient/issues/1)
- Merge pull request 'dev' (#6) from dev into main [`31ccf07`](https://git.odit.services/lfk/scanclient/commit/31ccf0758df51d6db655e919999127d3d7badcf5)
- initial commit 🎉 [`913b1ef`](https://git.odit.services/lfk/scanclient/commit/913b1ef047bf405d96e102a3467d0c44bd6b0701)
- formatting [`93efc32`](https://git.odit.services/lfk/scanclient/commit/93efc326ab69a4c88f939c3e15eccdb79375b362)
- precommit format [`ffcacd3`](https://git.odit.services/lfk/scanclient/commit/ffcacd32f6fed018646a0f8839b67659a3d425a1)
- 🚚 split into App, Login, Scanner [`d0112c3`](https://git.odit.services/lfk/scanclient/commit/d0112c31e0eed96ca041216ddbb9468c3926fa8a)
- basic i18n [`16d9a6d`](https://git.odit.services/lfk/scanclient/commit/16d9a6dda87c1aabe02f0d058d44b40292f9e8c6)
- scanner ui + login error states [`8a6521f`](https://git.odit.services/lfk/scanclient/commit/8a6521faa0be7395aaafbc165ae0bdd166c20c99)
- 👀 added basic settings page [`4e8a203`](https://git.odit.services/lfk/scanclient/commit/4e8a203c6db889107392667ee968f6ae304e6da4)
- 🌎 all translations [`b3f7002`](https://git.odit.services/lfk/scanclient/commit/b3f7002556fc10c94321611e0f0e7f8dd09b53f6)
- move to client code only [`81750dc`](https://git.odit.services/lfk/scanclient/commit/81750dc8e1b01feec7976e408a162054f82bc183)
- 🌎 Login Translations done [`e087a8d`](https://git.odit.services/lfk/scanclient/commit/e087a8dc30283d7bdf7c9a9d9765641e9f25c8f4)
- 🧹 cleanup [`f727437`](https://git.odit.services/lfk/scanclient/commit/f7274378b88126f8640ca76a7285fef83c69f6a0)
- demo for husky precommit formatting [`e8e462e`](https://git.odit.services/lfk/scanclient/commit/e8e462e264f4d5cff9d1c120c9a99ebb5b6cc06e)
- added lang option to config page [`7cde92e`](https://git.odit.services/lfk/scanclient/commit/7cde92e206080158df74f06d701e385ff6c56e67)
- drop CI [`116f912`](https://git.odit.services/lfk/scanclient/commit/116f9123e27f0f4f867830f45abf5c59d6fe2484)
- cleanup 🧹 [`1fd1b32`](https://git.odit.services/lfk/scanclient/commit/1fd1b32d1abedac7c03b1e70e2a7d6df980d9dd8)
- 🚧 basic client token frontend validation ui logic [`e4f5a81`](https://git.odit.services/lfk/scanclient/commit/e4f5a810a46645c920c82617006a0c515f62324a)
- 🧠 base ui logic [`ece7099`](https://git.odit.services/lfk/scanclient/commit/ece709954c9323ba28931aa6ed42fcea3466a6cb)
- scan error feedback [`1fc0490`](https://git.odit.services/lfk/scanclient/commit/1fc04905903ed998eefec60fb466919da8354a5a)
- add stationinfo persistence [`82dd786`](https://git.odit.services/lfk/scanclient/commit/82dd78621043071749caefb9371d49efea1929e1)
- testing husky precommit hook [`f40e638`](https://git.odit.services/lfk/scanclient/commit/f40e6385837d680b0cef7baba9a256c092ec3456)
- responsiveness of scanner component [`42b2390`](https://git.odit.services/lfk/scanclient/commit/42b2390bd76ddc7597f847c3c93aaef3b50940fb)
- [husky 🐶] improved hook [`936f023`](https://git.odit.services/lfk/scanclient/commit/936f0238862bc9ebb6798015bf81a1794e2da6cf)
- display station info in settings view [`f553727`](https://git.odit.services/lfk/scanclient/commit/f5537278ab3a3b22a096e4584ee11deac3a728dc)
- [husky 🐶] test [`8c465e8`](https://git.odit.services/lfk/scanclient/commit/8c465e8b7dae72e5b6436189a282a4ce7c1a5996)
- [husky 🐶] test [`eb04446`](https://git.odit.services/lfk/scanclient/commit/eb04446a43615c33955b625ed213d4696094534d)
- working scans 🎉 [`0ebabe2`](https://git.odit.services/lfk/scanclient/commit/0ebabe239c144c16faa23f6537f4b5516c81a033)
- 📷 Scanner - basic language switching [`84a2ca6`](https://git.odit.services/lfk/scanclient/commit/84a2ca60b7f389bf4da7b008fcfe83b3ccf202dd)
- locale persistance [`0aea3c1`](https://git.odit.services/lfk/scanclient/commit/0aea3c1e7ca4f83c0277245f6fa8c7772a152a80)
- Scanner - display total distance [`c930d87`](https://git.odit.services/lfk/scanclient/commit/c930d879003d27bccb5e7118ed151e3e20487172)
- drop husky 🐶 [`ff99657`](https://git.odit.services/lfk/scanclient/commit/ff99657ab3d29ff8dee3d366db673e5b84716093)
- ⌚ added live clock widget [`2267115`](https://git.odit.services/lfk/scanclient/commit/22671156a98f6553980408e368c784ea8b84a3e4)
- basic Scanner working [`559842d`](https://git.odit.services/lfk/scanclient/commit/559842d2a6e99f872e35a574bdfc64a60b9b3757)
- [husky 🐶] test [`bce4b4e`](https://git.odit.services/lfk/scanclient/commit/bce4b4e2b6c413609ca584cf3bc20f5339f2c7cf)
- 👷‍♂️ CI - move to main tags event + disable rpm build for now [`a2ec9d0`](https://git.odit.services/lfk/scanclient/commit/a2ec9d0cb3a156729bb7caf8b41c1d601755095d)
- 💾 store - added localstorage persistence [`c2f9da6`](https://git.odit.services/lfk/scanclient/commit/c2f9da6e925bf6791bcd0082947a8c696f137cb3)
- input autofocus [`0f20996`](https://git.odit.services/lfk/scanclient/commit/0f20996ac326b07759a4f8b0a69a5b6b813d94dc)
- 💾 added basic svelte store [`df3621d`](https://git.odit.services/lfk/scanclient/commit/df3621d08685bc193e543b0c6444223d2d61bf4c)
#### [0.0.8](https://git.odit.services/lfk/scanclient/compare/0.0.7...0.0.8)
> 14 March 2021
- CI - fixed rpm build [`3e533f5`](https://git.odit.services/lfk/scanclient/commit/3e533f5c6d15bdcbe5e45373d391840e2740bd9b)
#### [0.0.7](https://git.odit.services/lfk/scanclient/compare/0.0.6...0.0.7)
> 14 March 2021
- CI - rpm release building [`8f907ba`](https://git.odit.services/lfk/scanclient/commit/8f907ba597109faff6b4900bbdd9acfcbe644085)
#### [0.0.6](https://git.odit.services/lfk/scanclient/compare/0.0.5...0.0.6)
> 14 March 2021
- CI - only build @lfk-scanclient-linux-x64 [`e85a639`](https://git.odit.services/lfk/scanclient/commit/e85a639e96db3a6f9315cb32f0580e4303318d38)
#### [0.0.5](https://git.odit.services/lfk/scanclient/compare/0.0.4...0.0.5)
> 14 March 2021
- CI - testing full artifact zipping [`b1c9cc7`](https://git.odit.services/lfk/scanclient/commit/b1c9cc7652e22981106571d514a6b6d3d2616a19)
#### [0.0.4](https://git.odit.services/lfk/scanclient/compare/0.0.3...0.0.4)
> 14 March 2021
- removed "@" from dist package [`ab7ba52`](https://git.odit.services/lfk/scanclient/commit/ab7ba528ee207cc2f1ed1e82fb78692d17c980e4)
#### [0.0.3](https://git.odit.services/lfk/scanclient/compare/0.0.2...0.0.3)
> 14 March 2021
- 🚚 move to apk zip [`bfff17c`](https://git.odit.services/lfk/scanclient/commit/bfff17c465c831670511aca15b5598898fb84f21)
#### [0.0.2](https://git.odit.services/lfk/scanclient/compare/0.0.1...0.0.2)
> 14 March 2021
- CI - 📁 create zip for release [`de92402`](https://git.odit.services/lfk/scanclient/commit/de92402a3c3bfb4c16a3d153e5ad802ad915b99d)
#### [0.0.1](https://git.odit.services/lfk/scanclient/compare/v0.0.0...0.0.1)
> 14 March 2021
#### v0.0.0
> 19 March 2021
- Merge pull request 'Husky pre-commit hooks 🐶' (#8) from dev into main [`#4`](https://git.odit.services/lfk/scanclient/issues/4) [`#5`](https://git.odit.services/lfk/scanclient/issues/5)
- Merge branch 'feature/4-license-exporter' into dev [`#4`](https://git.odit.services/lfk/scanclient/issues/4) [`#5`](https://git.odit.services/lfk/scanclient/issues/5)
- Merge pull request 'feature/1-basic-scan-client' (#3) from feature/1-basic-scan-client into dev [`#1`](https://git.odit.services/lfk/scanclient/issues/1)
- basic svelte+vite+windicss app [`e94ce97`](https://git.odit.services/lfk/scanclient/commit/e94ce9731d284be5af05fa126d60f869aebeb116)
- tmp [`560b0f4`](https://git.odit.services/lfk/scanclient/commit/560b0f4c74cb90a58d8e6b73633514d756f287fb)
- added license:export script to pre-commit hook [`7deb0d2`](https://git.odit.services/lfk/scanclient/commit/7deb0d26c466dfa77a90ab7d213949354fd2a1b1)
- drop yarn.lock [`bb25203`](https://git.odit.services/lfk/scanclient/commit/bb252031042bd321edb29fa7d34ee4a4ba73f9bc)
- initial commit 🎉 [`913b1ef`](https://git.odit.services/lfk/scanclient/commit/913b1ef047bf405d96e102a3467d0c44bd6b0701)
- formatting [`93efc32`](https://git.odit.services/lfk/scanclient/commit/93efc326ab69a4c88f939c3e15eccdb79375b362)
- Initial commit [`de211eb`](https://git.odit.services/lfk/scanclient/commit/de211eb1d3e6836110bf178690eee9a7e52c710b)
- 🧹 cleanups [`f148858`](https://git.odit.services/lfk/scanclient/commit/f14885854e1f1b06668d23fe5711fb7f9dd4e3d8)
- precommit format [`ffcacd3`](https://git.odit.services/lfk/scanclient/commit/ffcacd32f6fed018646a0f8839b67659a3d425a1)
- 🚚 split into App, Login, Scanner [`d0112c3`](https://git.odit.services/lfk/scanclient/commit/d0112c31e0eed96ca041216ddbb9468c3926fa8a)
- basic i18n [`16d9a6d`](https://git.odit.services/lfk/scanclient/commit/16d9a6dda87c1aabe02f0d058d44b40292f9e8c6)
- scanner ui + login error states [`8a6521f`](https://git.odit.services/lfk/scanclient/commit/8a6521faa0be7395aaafbc165ae0bdd166c20c99)
- demo for electron packaging [`7377b4c`](https://git.odit.services/lfk/scanclient/commit/7377b4c9d0761dbe5e97857e7b59a71f97445881)
- 👀 added basic settings page [`4e8a203`](https://git.odit.services/lfk/scanclient/commit/4e8a203c6db889107392667ee968f6ae304e6da4)
- 🌎 all translations [`b3f7002`](https://git.odit.services/lfk/scanclient/commit/b3f7002556fc10c94321611e0f0e7f8dd09b53f6)
- move to client code only [`81750dc`](https://git.odit.services/lfk/scanclient/commit/81750dc8e1b01feec7976e408a162054f82bc183)
- re-enable CI [`cfd40d3`](https://git.odit.services/lfk/scanclient/commit/cfd40d3f1901f64213f267596a0b699ec17726c5)
- 🌎 Login Translations done [`e087a8d`](https://git.odit.services/lfk/scanclient/commit/e087a8dc30283d7bdf7c9a9d9765641e9f25c8f4)
- 🧹 cleanup [`f727437`](https://git.odit.services/lfk/scanclient/commit/f7274378b88126f8640ca76a7285fef83c69f6a0)
- demo for husky precommit formatting [`e8e462e`](https://git.odit.services/lfk/scanclient/commit/e8e462e264f4d5cff9d1c120c9a99ebb5b6cc06e)
- proper scripts for electron building/webapp building [`18ca318`](https://git.odit.services/lfk/scanclient/commit/18ca318b18f9fc11b65162af6dce4230bbfb8c9f)
- added lang option to config page [`7cde92e`](https://git.odit.services/lfk/scanclient/commit/7cde92e206080158df74f06d701e385ff6c56e67)
- drop CI [`116f912`](https://git.odit.services/lfk/scanclient/commit/116f9123e27f0f4f867830f45abf5c59d6fe2484)
- cleanup 🧹 [`1fd1b32`](https://git.odit.services/lfk/scanclient/commit/1fd1b32d1abedac7c03b1e70e2a7d6df980d9dd8)
- 🚧 basic client token frontend validation ui logic [`e4f5a81`](https://git.odit.services/lfk/scanclient/commit/e4f5a810a46645c920c82617006a0c515f62324a)
- CI file [`49e9317`](https://git.odit.services/lfk/scanclient/commit/49e9317f4a540366efd31e5132c4156bfde18818)
- 🧠 base ui logic [`ece7099`](https://git.odit.services/lfk/scanclient/commit/ece709954c9323ba28931aa6ed42fcea3466a6cb)
- scan error feedback [`1fc0490`](https://git.odit.services/lfk/scanclient/commit/1fc04905903ed998eefec60fb466919da8354a5a)
- simple Dockerfile [`f9c050b`](https://git.odit.services/lfk/scanclient/commit/f9c050b9f7cf09ee94a6ebe228ec50dc039bb789)
- add stationinfo persistence [`82dd786`](https://git.odit.services/lfk/scanclient/commit/82dd78621043071749caefb9371d49efea1929e1)
- testing husky precommit hook [`f40e638`](https://git.odit.services/lfk/scanclient/commit/f40e6385837d680b0cef7baba9a256c092ec3456)
- responsiveness of scanner component [`42b2390`](https://git.odit.services/lfk/scanclient/commit/42b2390bd76ddc7597f847c3c93aaef3b50940fb)
- [husky 🐶] improved hook [`936f023`](https://git.odit.services/lfk/scanclient/commit/936f0238862bc9ebb6798015bf81a1794e2da6cf)
- display station info in settings view [`f553727`](https://git.odit.services/lfk/scanclient/commit/f5537278ab3a3b22a096e4584ee11deac3a728dc)
- [husky 🐶] test [`8c465e8`](https://git.odit.services/lfk/scanclient/commit/8c465e8b7dae72e5b6436189a282a4ce7c1a5996)
- [husky 🐶] test [`eb04446`](https://git.odit.services/lfk/scanclient/commit/eb04446a43615c33955b625ed213d4696094534d)
- working scans 🎉 [`0ebabe2`](https://git.odit.services/lfk/scanclient/commit/0ebabe239c144c16faa23f6537f4b5516c81a033)
- 📷 Scanner - basic language switching [`84a2ca6`](https://git.odit.services/lfk/scanclient/commit/84a2ca60b7f389bf4da7b008fcfe83b3ccf202dd)
- locale persistance [`0aea3c1`](https://git.odit.services/lfk/scanclient/commit/0aea3c1e7ca4f83c0277245f6fa8c7772a152a80)
- Scanner - display total distance [`c930d87`](https://git.odit.services/lfk/scanclient/commit/c930d879003d27bccb5e7118ed151e3e20487172)
- 👷‍♂️ CI - move to main tags event + disable rpm build for now [`a2ec9d0`](https://git.odit.services/lfk/scanclient/commit/a2ec9d0cb3a156729bb7caf8b41c1d601755095d)
- added basic dev script + more readme [`d728ae3`](https://git.odit.services/lfk/scanclient/commit/d728ae37e68ea87cd9757d6fce8194aaf128bf93)
- drop husky 🐶 [`ff99657`](https://git.odit.services/lfk/scanclient/commit/ff99657ab3d29ff8dee3d366db673e5b84716093)
- added husky formatting 🐶 [`d0facb2`](https://git.odit.services/lfk/scanclient/commit/d0facb2846c467abfa227b400a19c1e3444dcffd)
- husky 🐶 [`00b8a14`](https://git.odit.services/lfk/scanclient/commit/00b8a14bc3e529286fcbfbecda81a349bed2138a)
- Merge pull request 'dev' (#6) from dev into main [`31ccf07`](https://git.odit.services/lfk/scanclient/commit/31ccf0758df51d6db655e919999127d3d7badcf5)
- basic Scanner working [`559842d`](https://git.odit.services/lfk/scanclient/commit/559842d2a6e99f872e35a574bdfc64a60b9b3757)
- [husky 🐶] test [`bce4b4e`](https://git.odit.services/lfk/scanclient/commit/bce4b4e2b6c413609ca584cf3bc20f5339f2c7cf)
- removed "@" from dist package [`ab7ba52`](https://git.odit.services/lfk/scanclient/commit/ab7ba528ee207cc2f1ed1e82fb78692d17c980e4)
- ⌚ added live clock widget [`2267115`](https://git.odit.services/lfk/scanclient/commit/22671156a98f6553980408e368c784ea8b84a3e4)
- 💾 store - added localstorage persistence [`c2f9da6`](https://git.odit.services/lfk/scanclient/commit/c2f9da6e925bf6791bcd0082947a8c696f137cb3)
- CI - only build @lfk-scanclient-linux-x64 [`e85a639`](https://git.odit.services/lfk/scanclient/commit/e85a639e96db3a6f9315cb32f0580e4303318d38)
- CI - 📁 create zip for release [`de92402`](https://git.odit.services/lfk/scanclient/commit/de92402a3c3bfb4c16a3d153e5ad802ad915b99d)
- CI - also trigger on tag events [`f4037c7`](https://git.odit.services/lfk/scanclient/commit/f4037c78ca83b258056bfcce25595514756aa476)
- CI - added secret from path [`08922d3`](https://git.odit.services/lfk/scanclient/commit/08922d3363c716832c6d6a656caa4725ef7cd518)
- input autofocus [`0f20996`](https://git.odit.services/lfk/scanclient/commit/0f20996ac326b07759a4f8b0a69a5b6b813d94dc)
- 💾 added basic svelte store [`df3621d`](https://git.odit.services/lfk/scanclient/commit/df3621d08685bc193e543b0c6444223d2d61bf4c)
- CI - testing full artifact zipping [`b1c9cc7`](https://git.odit.services/lfk/scanclient/commit/b1c9cc7652e22981106571d514a6b6d3d2616a19)
- CI - rpm release building [`8f907ba`](https://git.odit.services/lfk/scanclient/commit/8f907ba597109faff6b4900bbdd9acfcbe644085)
- CI - fixed rpm build [`3e533f5`](https://git.odit.services/lfk/scanclient/commit/3e533f5c6d15bdcbe5e45373d391840e2740bd9b)
- 🚚 move to apk zip [`bfff17c`](https://git.odit.services/lfk/scanclient/commit/bfff17c465c831670511aca15b5598898fb84f21)
- CI Test [`b42ff9e`](https://git.odit.services/lfk/scanclient/commit/b42ff9ec3cdf4e7986fe4b5766ffe75a86ea9827)
- 🐳 added git as a electron dependency [`0189a16`](https://git.odit.services/lfk/scanclient/commit/0189a16df089dbcb0ca9f2d5a3a026fbc871fed5)

5
Dockerfile Normal file
View File

@@ -0,0 +1,5 @@
FROM node:15.11.0-alpine3.13
WORKDIR /app
COPY . .
RUN yarn
RUN yarn build

View File

@@ -359,4 +359,4 @@ modifications to any of its public licenses or any other arrangements, understan
or agreements concerning use of licensed material. For the avoidance of doubt,
this paragraph does not form part of the public licenses.
Creative Commons may be contacted at creativecommons.org.
Creative Commons may be contacted at creativecommons.org.

View File

@@ -1,18 +1,20 @@
# @lfk/scanclient
## ✒️ Overview
This is an API client built with `svelte`, served to clients via by `electron`.
This is an API client for [https://git.odit.services/lfk/backend](@lfk/backend)
- WebApp built with [Svelte](https://svelte.dev), [WindiCSS](https://windicss.org/) (to compile [TailwindCSS](https://tailwindcss.com/)) and [Vite](https://vitejs.dev).
## 🚀 Getting Started
```
yarn
```
# Run your app
## Development
```
yarn electron-dev
yarn dev
/
yarn dev --open
```
# Package Your App
## Build
```
yarn electron-pack
yarn build
```

14
index.html Normal file
View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>LfK!Scan</title>
<base href="./" />
<link rel="icon" type="image/png" href="./favicon.png" />
</head>
<body class="bg-white font-family-karla h-screen">
<script type="module" src="./src/main.js"></script>
</body>
</html>

5061
licenses.md Normal file

File diff suppressed because it is too large Load Diff

79
main.js
View File

@@ -1,79 +0,0 @@
// Modules to control application life and create native browser window
const { app, BrowserWindow, dialog } = require('electron');
const path = require('path');
const serve = require('electron-serve');
const loadURL = serve({ directory: 'public' });
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;
function isDev() {
return !app.isPackaged;
}
function createWindow() {
// Create the browser window.
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
},
// Use this in development mode.
icon: isDev() ? path.join(process.cwd(), 'public/favicon.png') : path.join(__dirname, 'public/favicon.png'),
// Use this in production mode.
// icon: path.join(__dirname, 'public/favicon.png'),
show: false
});
mainWindow.removeMenu();
// This block of code is intended for development purpose only.
// Delete this entire block of code when you are ready to package the application.
if (isDev()) {
mainWindow.loadURL('http://localhost:5000/');
} else {
loadURL(mainWindow);
}
// Uncomment the following line of code when app is ready to be packaged.
// loadURL(mainWindow);
// Open the DevTools and also disable Electron Security Warning.
// process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = true;
// mainWindow.webContents.openDevTools();
// Emitted when the window is closed.
mainWindow.on('closed', function() {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
mainWindow = null;
});
// Emitted when the window is ready to be shown
// This helps in showing the window gracefully.
mainWindow.once('ready-to-show', () => {
mainWindow.show();
});
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow);
// Quit when all windows are closed.
app.on('window-all-closed', function() {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') app.quit();
});
app.on('activate', function() {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) createWindow();
});
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.

16
order.js Normal file
View File

@@ -0,0 +1,16 @@
const fs = require('fs');
// get all language files
const files = fs.readdirSync('./src/locales/');
files.forEach((f) => {
// read file as object
const unordered = JSON.parse(fs.readFileSync(`src/locales/${f}`));
// order object by keys alpabetically A-Z
const ordered = Object.keys(unordered).sort().reduce((obj, key) => {
obj[key] = unordered[key];
return obj;
}, {});
// format output as json for commit diff compatibility
const out = JSON.stringify(ordered, 0, 4);
// write output file
fs.writeFileSync(`src/locales/${f}`, out);
});

View File

@@ -1,40 +1,50 @@
{
"name": "@lfk/scanclient",
"version": "0.0.1",
"description": "LfK! Scanclient",
"main": "main.js",
"build": {
"icon": "public/favicon.png",
"productName": "LfK!Scan",
"files": [ "public/**/*", "main.js" ],
"win": {},
"linux": {},
"mac": {}
},
"scripts": {
"build": "rollup -c",
"dev": "rollup -c -w",
"start": "sirv public",
"electron": "wait-on http://localhost:5000 && electron .",
"electron-dev": "concurrently \"yarn run dev\" \"yarn run electron\"",
"preelectron-pack": "yarn run build",
"electron-pack": "electron-builder"
},
"dependencies": {
"electron-serve": "^1.0.0"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^14.0.0",
"@rollup/plugin-node-resolve": "^8.0.0",
"concurrently": "^5.3.0",
"electron": "^9.2.1",
"electron-builder": "^22.8.0",
"rollup": "^2.3.4",
"rollup-plugin-livereload": "^1.0.0",
"rollup-plugin-svelte": "^5.0.3",
"rollup-plugin-terser": "^6.0.0",
"sirv-cli": "^1.0.0",
"svelte": "^3.0.0",
"wait-on": "^5.2.0"
}
}
{
"name": "@lfk/scanclient",
"version": "0.1.5",
"scripts": {
"dev": "vite",
"build": "vite build",
"format": "prettier --write --plugin-search-dir=. ./**/*.html ./**/*.svelte",
"prepare": "husky install",
"license:export": "license-exporter --markdown && git stage licenses.md",
"release": "release-it --only-version"
},
"devDependencies": {
"@odit/license-exporter": "^0.0.11",
"@svitejs/vite-plugin-svelte": "^0.11.1",
"@tsconfig/svelte": "^1.0.10",
"@types/html-minifier": "^4.0.0",
"axios": "^0.21.1",
"html-minifier": "^4.0.0",
"husky": "^5.1.3",
"prettier": "^2.2.1",
"prettier-plugin-svelte": "^2.2.0",
"release-it": "^14.5.1",
"svelte": "^3.35.0",
"svelte-i18n": "^3.3.7",
"svelte-preprocess": "^4.6.9",
"vite": "^2.1.2",
"vite-plugin-windicss": "^0.9.2"
},
"dependencies": {
"validator": "^13.5.2"
},
"release-it": {
"git": {
"commit": true,
"requireCleanWorkingDir": false,
"commitMessage": "🚀Bumped version to ${version}",
"requireBranch": "dev",
"push": false,
"tag": true,
"tagName": null,
"tagAnnotation": "${version}"
},
"npm": {
"publish": false
},
"hooks": {
"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order.js && git add src/locales"
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,20 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>LfK!Scan</title>
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="stylesheet" href="/global.css">
<link rel="stylesheet" href="/build/bundle.css">
<script defer src="/build/bundle.js"></script>
</head>
<body>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,75 +0,0 @@
import svelte from 'rollup-plugin-svelte';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import livereload from 'rollup-plugin-livereload';
import { terser } from 'rollup-plugin-terser';
const production = !process.env.ROLLUP_WATCH;
function serve() {
let server;
function toExit() {
if (server) server.kill(0);
}
return {
writeBundle() {
if (server) return;
server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
stdio: ['ignore', 'inherit', 'inherit'],
shell: true
});
process.on('SIGTERM', toExit);
process.on('exit', toExit);
}
};
}
export default {
input: 'src/main.js',
output: {
sourcemap: true,
format: 'iife',
name: 'app',
file: 'public/build/bundle.js'
},
plugins: [
svelte({
// enable run-time checks when not in production
dev: !production,
// we'll extract any component CSS out into
// a separate file - better for performance
css: css => {
css.write('public/build/bundle.css');
}
}),
// If you have external dependencies installed from
// npm, you'll most likely need these plugins. In
// some cases you'll need additional configuration -
// consult the documentation for details:
// https://github.com/rollup/plugins/tree/master/packages/commonjs
resolve({
browser: true,
dedupe: ['svelte']
}),
commonjs(),
// In dev mode, call `npm run start` once
// the bundle has been generated
!production && serve(),
// Watch the `public` directory and refresh the
// browser on changes when not in production
!production && livereload('public'),
// If we're building for production (npm run build
// instead of npm run dev), minify
production && terser()
],
watch: {
clearScreen: false
}
};

View File

@@ -1,125 +0,0 @@
// @ts-check
/** This script modifies the project to support TS code in .svelte files like:
<script lang="ts">
export let name: string;
</script>
As well as validating the code for CI.
*/
/** To work on this script:
rm -rf test-template template && git clone sveltejs/template test-template && node scripts/setupTypeScript.js test-template
*/
const fs = require("fs")
const path = require("path")
const { argv } = require("process")
const projectRoot = argv[2] || path.join(__dirname, "..")
// Add deps to pkg.json
const packageJSON = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8"))
packageJSON.devDependencies = Object.assign(packageJSON.devDependencies, {
"svelte-check": "^1.0.0",
"svelte-preprocess": "^4.0.0",
"@rollup/plugin-typescript": "^4.0.0",
"typescript": "^3.9.3",
"tslib": "^2.0.0",
"@tsconfig/svelte": "^1.0.0"
})
// Add script for checking
packageJSON.scripts = Object.assign(packageJSON.scripts, {
"validate": "svelte-check"
})
// Write the package JSON
fs.writeFileSync(path.join(projectRoot, "package.json"), JSON.stringify(packageJSON, null, " "))
// mv src/main.js to main.ts - note, we need to edit rollup.config.js for this too
const beforeMainJSPath = path.join(projectRoot, "src", "main.js")
const afterMainTSPath = path.join(projectRoot, "src", "main.ts")
fs.renameSync(beforeMainJSPath, afterMainTSPath)
// Switch the app.svelte file to use TS
const appSveltePath = path.join(projectRoot, "src", "App.svelte")
let appFile = fs.readFileSync(appSveltePath, "utf8")
appFile = appFile.replace("<script>", '<script lang="ts">')
appFile = appFile.replace("export let name;", 'export let name: string;')
fs.writeFileSync(appSveltePath, appFile)
// Edit rollup config
const rollupConfigPath = path.join(projectRoot, "rollup.config.js")
let rollupConfig = fs.readFileSync(rollupConfigPath, "utf8")
// Edit imports
rollupConfig = rollupConfig.replace(`'rollup-plugin-terser';`, `'rollup-plugin-terser';
import sveltePreprocess from 'svelte-preprocess';
import typescript from '@rollup/plugin-typescript';`)
// Replace name of entry point
rollupConfig = rollupConfig.replace(`'src/main.js'`, `'src/main.ts'`)
// Add preprocess to the svelte config, this is tricky because there's no easy signifier.
// Instead we look for `css:` then the next `}` and add the preprocessor to that
let foundCSS = false
let match
// https://regex101.com/r/OtNjwo/1
const configEditor = new RegExp(/css:.|\n*}/gmi)
while (( match = configEditor.exec(rollupConfig)) != null) {
if (foundCSS) {
const endOfCSSIndex = match.index + 1
rollupConfig = rollupConfig.slice(0, endOfCSSIndex) + ",\n preprocess: sveltePreprocess()," + rollupConfig.slice(endOfCSSIndex);
break
}
if (match[0].includes("css:")) foundCSS = true
}
// Add TypeScript
rollupConfig = rollupConfig.replace("commonjs(),", 'commonjs(),\n\t\ttypescript({ sourceMap: !production }),')
fs.writeFileSync(rollupConfigPath, rollupConfig)
// Add TSConfig
const tsconfig = `{
"extends": "@tsconfig/svelte/tsconfig.json",
"include": ["src/**/*"],
"exclude": ["node_modules/*", "__sapper__/*", "public/*"],
}`
const tsconfigPath = path.join(projectRoot, "tsconfig.json")
fs.writeFileSync(tsconfigPath, tsconfig)
// Delete this script, but not during testing
if (!argv[2]) {
// Remove the script
fs.unlinkSync(path.join(__filename))
// Check for Mac's DS_store file, and if it's the only one left remove it
const remainingFiles = fs.readdirSync(path.join(__dirname))
if (remainingFiles.length === 1 && remainingFiles[0] === '.DS_store') {
fs.unlinkSync(path.join(__dirname, '.DS_store'))
}
// Check if the scripts folder is empty
if (fs.readdirSync(path.join(__dirname)).length === 0) {
// Remove the scripts folder
fs.rmdirSync(path.join(__dirname))
}
}
// Adds the extension recommendation
fs.mkdirSync(path.join(projectRoot, ".vscode"))
fs.writeFileSync(path.join(projectRoot, ".vscode", "extensions.json"), `{
"recommendations": ["svelte.svelte-vscode"]
}
`)
console.log("Converted to TypeScript.")
if (fs.existsSync(path.join(projectRoot, "node_modules"))) {
console.log("\nYou will need to re-run your dependency manager to get started.")
}

View File

@@ -1,31 +1,29 @@
<header class="navbar">
<section class="navbar-section">
<a href="#" class="btn btn-link">Docs</a>
<a href="#" class="btn btn-link">Examples</a>
</section>
<div class="navbar-center"><img src="/favicon.png" style="height:4rem;" alt="Spectre.css"></div>
<section class="navbar-section">
<a href="#" class="btn btn-link">Twitter</a>
<a href="#" class="btn btn-link">GitHub</a>
</section>
</header>
<main>
<div class="hero hero-sm bg-dark">
<div class="hero-body">
<h1><img src="/favicon.png" alt="Logo" style="height: 5rem;vertical-align: middle;"><span style="vertical-align: middle;">LfK!Scan</span></h1>
<p>Lauf für Kaya! Scanstation</p>
</div>
</div>
<div style="padding:1rem;">
<div class="column col-12">
<h3>Configure Scanstation <a target="_blank" href="https://docs.lauf-fuer-kaya.de/"><small class="label">📃 take a look at the configuration guide</small></a></h3>
</div>
<div class="column col-6 col-xs-12">
<div class="form-group">
<label class="form-label" for="input-example-1">Token</label>
<input class="form-input" id="input-example-1" type="text" placeholder="Token">
</div>
<button class="btn btn-primary input-group-btn btn-lg">Submit</button>
</div>
</div>
</main>
<script>
import { apikey, api_endpoint, lang, page } from "./store.js";
import { addMessages, init } from "svelte-i18n";
import en from "./locales/en.json";
import de from "./locales/de.json";
addMessages("en", en);
addMessages("en-US", en);
addMessages("de", de);
addMessages("de-DE", de);
//
import Scanner from "./Scanner.svelte";
import Login from "./Login.svelte";
import Settings from "./Settings.svelte";
$: is_configured = $apikey && $apikey !== "null" && $apikey !== "";
$: settings_open = $page === "settings";
init({
fallbackLocale: "en-US",
initialLocale: $lang,
});
console.log("app started with base url " + $api_endpoint);
</script>
{#if settings_open && is_configured}
<Settings />
{:else if is_configured}
<Scanner />
{:else}
<Login />
{/if}

245
src/Login.svelte Normal file
View File

@@ -0,0 +1,245 @@
<script>
import isURL from "validator/lib/isURL";
import isUUID from "validator/lib/isUUID";
import { apikey, lang, stationinfo, api_endpoint } from "./store.js";
import axios from "axios";
import { _, locale } from "svelte-i18n";
let token;
let api_endpoint_input = "";
$: error = false;
$: errormessage = "";
$: isTokenValid =
token?.length === 44 &&
token.split(".")[0].length === 7 &&
isUUID(token.split(".")[1]);
$: isEndpointValid = isURL(api_endpoint_input);
</script>
<div class="w-full flex flex-wrap">
<!-- Login Section -->
<div class="w-full md:w-1/2 flex flex-col">
<div class="flex justify-center md:justify-start pt-12 md:pl-12 md:-mb-24">
<div class="bg-black text-white font-bold text-xl p-4">
<img src="./favicon.png" alt="" style="height: 3rem;display: inline;" />
LfK!Scan
</div>
</div>
<div
class="flex flex-col justify-center md:justify-start my-auto pt-8 md:pt-0 px-8 md:px-24 lg:px-32"
>
<p class="text-center text-3xl">{$_("configuration")}</p>
<p class="text-center">
{$_("please_provide_the_scan_client_token")}<br /><a
target="_blank"
class="underline"
href="https://docs.lauf-fuer-kaya.de/"
>{$_("see_our_configuration_guide")}</a
>
</p>
{#if error}
{#if errormessage === "invalid_token"}
<div
class="text-white px-6 py-4 border-0 rounded relative bg-red-500 mt-2"
>
<span class="inline-block align-middle">
<b class="capitalize">{$_("error")}</b><br />{$_(
"the_provided_scan_station_token_is_invalid"
)}<br />{$_("please_check_your_token_and_try_again")}
</span>
</div>
{/if}
{#if errormessage === "station_disabled"}
<div
class="text-white px-6 py-4 border-0 rounded relative bg-red-500 mt-2"
>
<span class="inline-block align-middle">
<b class="capitalize">{$_("error")}</b><br />{$_(
"the_provided_scan_station_is_disabled"
)}
</span>
</div>
{/if}
{/if}
{#if $api_endpoint}
<form
class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();"
on:submit={() => {
axios
.request({
method: "GET",
url: $api_endpoint + "api/stations/me",
headers: { Authorization: "Bearer " + token },
})
.then(function (response) {
error = false;
errormessage = "";
apikey.set(token);
stationinfo.set(JSON.stringify(response.data));
})
.catch(function (e) {
error = true;
errormessage = e.response.data.short;
});
}}
>
<div class="flex flex-col pt-4">
<label for="token" class="text-lg">{$_("client_token")}</label>
<input
type="text"
id="token"
placeholder={$_("client_token")}
bind:value={token}
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>
{#if !isTokenValid}
<span class="text-sm"
>{$_("please_provide_a_valid_client_token")}</span
>
{/if}
<button
disabled={!isTokenValid}
class:cursor-pointer={isTokenValid}
class:opacity-50={!isTokenValid}
id="configure"
type="submit"
class="bg-black text-white font-bold text-lg hover:bg-gray-700 p-2 mt-8 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
>{$_("configure")}</button
>
</form>
{:else}
<form
class="flex flex-col pt-3 md:pt-8"
onsubmit="event.preventDefault();"
on:submit={() => {
if (api_endpoint_input.substr(-1) !== "/") {
api_endpoint_input = api_endpoint_input + "/";
}
api_endpoint.set(api_endpoint_input);
}}
>
<div class="flex flex-col pt-4">
<label for="api_endpoint" class="text-lg"
>{$_("api_endpoint")}</label
>
<input
type="text"
id="api_endpoint"
placeholder={$_("api_endpoint")}
bind:value={api_endpoint_input}
class:border-red-500={!isEndpointValid}
class:border-solid={!isEndpointValid}
class:border-3={!isEndpointValid}
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>
{#if !isEndpointValid}
<span class="text-sm"
>{$_("please_provide_a_valid_client_api_endpoint")}</span
>
{/if}
<button
disabled={!isEndpointValid}
class:cursor-pointer={isEndpointValid}
class:opacity-50={!isEndpointValid}
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>
{/if}
<div class="text-center pt-12 pb-12">
<p>
<svg
style="height: 1rem;display: inline;"
xmlns="http://www.w3.org/2000/svg"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-zap"
viewBox="0 0 24 24"
>
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
</svg><span
>powered by <a
href="https://odit.services"
target="_blank"
class="underline">ODIT.Services</a
>.</span
>
</p>
</div>
</div>
<div class="w-full p-3">
<div class="inline-block mr-2 mt-2">
<button
on:click={() => {
lang.set("de-DE");
locale.set("de-DE");
}}
type="button"
class="bg-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md hover:bg-blue-700"
>Deutsch
<svg
class="h-4 inline"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
><path
d="M15.923 345.043C52.094 442.527 145.929 512 256 512s203.906-69.473 240.077-166.957L256 322.783l-240.077 22.26z"
fill="#ffda44"
/><path
d="M256 0C145.929 0 52.094 69.472 15.923 166.957L256 189.217l240.077-22.261C459.906 69.472 366.071 0 256 0z"
/><path
d="M15.923 166.957C5.633 194.69 0 224.686 0 256s5.633 61.31 15.923 89.043h480.155C506.368 317.31 512 287.314 512 256s-5.632-61.31-15.923-89.043H15.923z"
fill="#d80027"
/></svg
></button
>
</div>
<div class="inline-block mr-2 mt-2">
<button
on:click={() => {
lang.set("en-US");
locale.set("en-US");
}}
type="button"
class="bg-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md hover:bg-blue-700"
>English
<svg
class="h-4 inline"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<circle cx="256" cy="256" r="256" fill="#f0f0f0" />
<g fill="#d80027">
<path
d="M244.87 256H512c0-23.106-3.08-45.49-8.819-66.783H244.87V256zM244.87 122.435h229.556a257.35 257.35 0 00-59.07-66.783H244.87v66.783zM256 512c60.249 0 115.626-20.824 159.356-55.652H96.644C140.374 491.176 195.751 512 256 512zM37.574 389.565h436.852a254.474 254.474 0 0028.755-66.783H8.819a254.474 254.474 0 0028.755 66.783z"
/>
</g>
<path
d="M118.584 39.978h23.329l-21.7 15.765 8.289 25.509-21.699-15.765-21.699 15.765 7.16-22.037a257.407 257.407 0 00-49.652 55.337h7.475l-13.813 10.035a255.58 255.58 0 00-6.194 10.938l6.596 20.301-12.306-8.941a253.567 253.567 0 00-8.372 19.873l7.267 22.368h26.822l-21.7 15.765 8.289 25.509-21.699-15.765-12.998 9.444A258.468 258.468 0 000 256h256V0c-50.572 0-97.715 14.67-137.416 39.978zm9.918 190.422l-21.699-15.765L85.104 230.4l8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765 8.289 25.509zm-8.289-100.083l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765zM220.328 230.4l-21.699-15.765L176.93 230.4l8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765 8.289 25.509zm-8.289-100.083l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765zm0-74.574l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765z"
fill="#0052b4"
/>
</svg></button
>
</div>
</div>
</div>
<!-- Image Section -->
<div class="w-1/2 shadow-2xl">
<img
alt=""
class="object-cover w-full h-screen hidden md:block"
src="https://source.unsplash.com/IXUM4cJynP0"
/>
</div>
</div>

164
src/Scanner.svelte Normal file
View File

@@ -0,0 +1,164 @@
<script>
import axios from "axios";
import { _ } from "svelte-i18n";
import { apikey, api_endpoint, page, stationinfo } from "./store.js";
function init(el) {
el.focus();
}
let lastscan_error = "";
let lastscan_time = "";
let lastscan_laptime = "";
let lastscan_totaldistance = "";
let lastscan_valid = true;
let card = "";
// live clock at the top
let time = new Date();
$: hours = (time.getHours() + "").padStart(2, "0");
$: minutes = (time.getMinutes() + "").padStart(2, "0");
$: seconds = (time.getSeconds() + "").padStart(2, "0");
setInterval(() => {
time = new Date();
}, 1000);
</script>
<div class="min-h-screen">
<div class="bg-white shadow p-2">
<div class="flex flex-wrap -mx-1 overflow-hidden">
<div class="my-1 px-1 w-1/3 overflow-hidden text-center self-center">
<img src="/favicon.png" alt="" class="h-14 mx-auto" />
</div>
<div class="my-1 px-1 w-1/3 overflow-hidden text-center self-center">
Lauf Für Kaya! Scan
</div>
<div class="my-1 px-1 w-1/3 overflow-hidden text-center self-center">
{JSON.parse($stationinfo).track.name} - #{JSON.parse($stationinfo).track
.id} - {JSON.parse($stationinfo).track.distance}m
</div>
</div>
</div>
<h1 class="mr-6 text-7xl font-semibold text-center text-gray-900">
{hours}:{minutes}:{seconds}
</h1>
<section class="px-4 py-24 mx-auto max-w-7xl">
<div class="mx-auto space-y-5 w-full md:w-1/2">
{#if lastscan_error}
<div
class="text-white px-6 py-4 border-0 rounded relative bg-red-500 mt-2"
>
<span class="inline-block align-middle">
<b class="capitalize">Error!</b><br />{lastscan_error}
</span>
</div>
{/if}
<form
class="space-y-4"
onsubmit="event.preventDefault();"
on:submit={() => {
if (card === "cnf") {
page.set("settings");
} else {
card = parseInt(card);
lastscan_error = "";
axios
.request({
method: "POST",
url: $api_endpoint + "api/scans/trackscans",
headers: { Authorization: "Bearer " + $apikey },
data: { card },
})
.then((response) => {
const time = new Date();
const hours = (time.getHours() + "").padStart(2, "0");
const minutes = (time.getMinutes() + "").padStart(2, "0");
const seconds = (time.getSeconds() + "").padStart(2, "0");
lastscan_time = hours + ":" + minutes + ":" + seconds;
response.data.lapTime =
Math.floor(response.data.lapTime / 60) +
"min " +
(Math.floor(response.data.lapTime % 60) + "").padStart(
2,
"0"
) +
"s";
lastscan_laptime = response.data.lapTime;
lastscan_valid = response.data.valid;
lastscan_totaldistance =
Math.floor(response.data.runner.distance / 1000) +
"km " +
(
Math.floor(response.data.runner.distance % 1000) + ""
).padStart(3, "0") +
"m";
})
.catch((e) => {
lastscan_error = e.response.data.message;
});
}
card = "";
}}
>
<label class="block">
<span class="block mb-1 text-xs font-medium text-gray-700"
>{$_("runner_card")}</span
>
<input
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"
type="text"
placeholder="123456789"
required
use:init
bind:value={card}
/>
</label>
{#if lastscan_totaldistance}
{#if !lastscan_valid || lastscan_error}
<svg
xmlns="http://www.w3.org/2000/svg"
width="20rem"
height="20rem"
class="ml-auto mr-auto"
version="1.0"
title="Invalid"
viewBox="0 0 100 100"
><g fill="none" stroke="red"
><path d="M6 6l88 88" stroke-width="18.1" /><path
d="M6 94L94 6"
stroke-width="17.8"
/></g
></svg
>
{:else}
<svg
xmlns="http://www.w3.org/2000/svg"
width="20rem"
height="20rem"
class="ml-auto mr-auto"
title="Valid"
viewBox="0 0 600 600"
><path
d="M8 405s115 129 138 182h99c41-126 203-429 341-535 28-37-43-52-102-27-87 36-252 317-283 384-44 12-90-74-90-74z"
fill="#181"
/></svg
>
{/if}
<h1 class="text-2xl font-bold text-center">{$_("total-distance")}</h1>
<h1 class="text-6xl font-bold text-center">
{lastscan_totaldistance}
</h1>
<h1 class="text-2xl font-bold text-center">{$_("lap-time")}</h1>
<h1 class="text-6xl font-bold text-center">{lastscan_laptime}</h1>
<h1 class="text-2xl font-bold text-center">{$_("last-scan")}</h1>
<h1 class="text-5xl font-bold text-center">{lastscan_time}</h1>
{:else}
<h1 class="text-3xl font-bold text-center">
{$_("please_scan_a_card")}
</h1>
{/if}
<button type="submit" class="hidden">{$_("scan")}</button>
</form>
</div>
</section>
</div>

112
src/Settings.svelte Normal file
View File

@@ -0,0 +1,112 @@
<script>
import { _ } from "svelte-i18n";
import { apikey, api_endpoint, lang, page, stationinfo } from "./store.js";
</script>
<div class="p-5 min-h-screen">
<h1 class="font-bold text-3xl w-full text-center text-gray-900">
Lauf Für Kaya! Scan
</h1>
<h1 class="text-3xl w-full text-center text-gray-900">{$_("settings")}</h1>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("api_key")}</p>
<p class="block text-sm text-gray-700">{$apikey}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">
{$_("station_description")}
</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).description}
</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("station_id")}</p>
<p class="block text-sm text-gray-700">{JSON.parse($stationinfo).id}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_id")}</p>
<p class="block text-sm text-gray-700">{JSON.parse($stationinfo).track.id}</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("track_name")}</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).track.name}
</p>
<p class="block text-sm font-bold text-gray-700 mt-2">
{$_("track_distance")}
</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).track.distance}
</p>
<p class="block text-sm font-bold text-gray-700 mt-2">
{$_("minimum_lap_time")}
</p>
<p class="block text-sm text-gray-700">
{JSON.parse($stationinfo).track.minimumLapTime}s
</p>
<p class="block text-sm font-bold text-gray-700 mt-2">{$_("language")}</p>
<div class="w-full">
<div class="inline-block mr-2 mt-2">
<button
on:click={() => {
lang.set("de-DE");
}}
type="button"
class:bg-blue-700={$lang === "de-DE"}
class="bg-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md hover:bg-blue-700"
>Deutsch
<svg
class="h-4 inline"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
><path
d="M15.923 345.043C52.094 442.527 145.929 512 256 512s203.906-69.473 240.077-166.957L256 322.783l-240.077 22.26z"
fill="#ffda44"
/><path
d="M256 0C145.929 0 52.094 69.472 15.923 166.957L256 189.217l240.077-22.261C459.906 69.472 366.071 0 256 0z"
/><path
d="M15.923 166.957C5.633 194.69 0 224.686 0 256s5.633 61.31 15.923 89.043h480.155C506.368 317.31 512 287.314 512 256s-5.632-61.31-15.923-89.043H15.923z"
fill="#d80027"
/></svg
></button
>
</div>
<div class="inline-block mr-2 mt-2">
<button
on:click={() => {
lang.set("en-EN");
}}
type="button"
class:bg-blue-700={$lang === "en-EN"}
class="bg-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md hover:bg-blue-700"
>English
<svg
class="h-4 inline"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<circle cx="256" cy="256" r="256" fill="#f0f0f0" />
<g fill="#d80027">
<path
d="M244.87 256H512c0-23.106-3.08-45.49-8.819-66.783H244.87V256zM244.87 122.435h229.556a257.35 257.35 0 00-59.07-66.783H244.87v66.783zM256 512c60.249 0 115.626-20.824 159.356-55.652H96.644C140.374 491.176 195.751 512 256 512zM37.574 389.565h436.852a254.474 254.474 0 0028.755-66.783H8.819a254.474 254.474 0 0028.755 66.783z"
/>
</g>
<path
d="M118.584 39.978h23.329l-21.7 15.765 8.289 25.509-21.699-15.765-21.699 15.765 7.16-22.037a257.407 257.407 0 00-49.652 55.337h7.475l-13.813 10.035a255.58 255.58 0 00-6.194 10.938l6.596 20.301-12.306-8.941a253.567 253.567 0 00-8.372 19.873l7.267 22.368h26.822l-21.7 15.765 8.289 25.509-21.699-15.765-12.998 9.444A258.468 258.468 0 000 256h256V0c-50.572 0-97.715 14.67-137.416 39.978zm9.918 190.422l-21.699-15.765L85.104 230.4l8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765 8.289 25.509zm-8.289-100.083l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765zM220.328 230.4l-21.699-15.765L176.93 230.4l8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765 8.289 25.509zm-8.289-100.083l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765zm0-74.574l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765z"
fill="#0052b4"
/>
</svg></button
>
</div>
</div>
<br />
<button
on:click={() => {
page.set("");
}}
class="mb-3 w-full py-3 border-black border-3 text-black focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
>{$_("back_to_scanner")}</button
>
<button
on:click={() => {
apikey.set("");
api_endpoint.set("");
page.set("");
}}
class="w-full py-3 bg-black text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
>{$_("log_out_from_this_client")}</button
>
</div>

31
src/locales/de.json Normal file
View File

@@ -0,0 +1,31 @@
{
"api_endpoint": "API-Endpunkt",
"api_key": "API Key",
"back_to_scanner": "Zurück zum Scanner",
"client_token": "Client Token",
"configuration": "Konfiguration",
"configure": "Konfigurieren",
"error": "Error!",
"language": "Sprache",
"lap-time": "Rundenzeit",
"last-scan": "Letzter Scan um",
"log_out_from_this_client": "Von diesem Scanner abmelden",
"minimum_lap_time": "minimale Rundenzeit",
"please_check_your_token_and_try_again": "Bitte überprüfe den Token und versuche es erneut...",
"please_provide_a_valid_client_api_endpoint": "Bitte gebe einen gültigen API-Endpunkt an ...",
"please_provide_a_valid_client_token": "Bitte gebe einen gültigen Client-Token an ...",
"please_provide_the_scan_client_token": "Bitte gebe den Scan-Client-Token an.",
"please_scan_a_card": "Bitte scanne eine Karte ...",
"runner_card": "Läuferkarte",
"scan": "Scannen!",
"see_our_configuration_guide": "Siehe dir unsere Konfigurationsanleitung an.",
"settings": "Einstellungen",
"station_description": "Beschreibung der Scanstation",
"station_id": "Scanstations-ID",
"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.",
"total-distance": "Gesamtdistanz",
"track_distance": "Länge des Tracks",
"track_id": "Track ID",
"track_name": "Track Name"
}

31
src/locales/en.json Normal file
View File

@@ -0,0 +1,31 @@
{
"api_endpoint": "API Endpoint",
"api_key": "API Key",
"back_to_scanner": "Back to Scanner",
"client_token": "Client Token",
"configuration": "Configuration",
"configure": "Configure",
"error": "Error!",
"language": "Language",
"lap-time": "lap time",
"last-scan": "last scan",
"log_out_from_this_client": "Log Out from this Client",
"minimum_lap_time": "minimum lap time",
"please_check_your_token_and_try_again": "Please check your token and try again...",
"please_provide_a_valid_client_api_endpoint": "Please provide a valid api endpoint...",
"please_provide_a_valid_client_token": "Please provide a valid client token...",
"please_provide_the_scan_client_token": "Please provide the scan client token.",
"please_scan_a_card": "please scan a card...",
"runner_card": "Runner Card",
"scan": "Scan!",
"see_our_configuration_guide": "See our configuration guide.",
"settings": "Settings",
"station_description": "Station Description",
"station_id": "Scanstation ID",
"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.",
"total-distance": "total distance",
"track_distance": "Track Distance",
"track_id": "Track ID",
"track_name": "Track Name"
}

View File

@@ -1,10 +1,8 @@
import App from './App.svelte';
import 'windi.css';
const app = new App({
target: document.body,
props: {
appName: 'Electron-Svelte'
}
target: document.body
});
export default app;

27
src/store.js Normal file
View File

@@ -0,0 +1,27 @@
import { writable } from 'svelte/store';
const stored_api_endpoint = localStorage.getItem('api_endpoint')||"";
export const api_endpoint = writable(stored_api_endpoint);
api_endpoint.subscribe((value) => {
localStorage.setItem('api_endpoint', value);
});
const stored_apikey = localStorage.getItem('apikey');
export const apikey = writable(stored_apikey);
apikey.subscribe((value) => {
localStorage.setItem('apikey', value);
});
const stored_stationinfo = localStorage.getItem('stationinfo');
export const stationinfo = writable(stored_stationinfo);
stationinfo.subscribe((value) => {
localStorage.setItem('stationinfo', value);
});
const stored_page = localStorage.getItem('page');
export const page = writable(stored_page);
page.subscribe((value) => {
localStorage.setItem('page', value);
});
const stored_lang = localStorage.getItem('lang') === 'null' ? navigator.language : localStorage.getItem('lang');
export const lang = writable(stored_lang);
lang.subscribe((value) => {
localStorage.setItem('lang', value);
});

13
tailwind.config.js Normal file
View File

@@ -0,0 +1,13 @@
module.exports = {
theme: {
extend: {
colors: {
reepolee: {
500: "#b40000",
600: "#9c0000",
700: "#750000",
},
},
},
},
};

50
vite.config.ts Normal file
View File

@@ -0,0 +1,50 @@
import svelte from '@svitejs/vite-plugin-svelte';
import windiCSS from 'vite-plugin-windicss';
import { minify } from 'html-minifier';
import { defineConfig } from 'vite';
//
const indexReplace = () => {
return {
name: 'html-transform',
transformIndexHtml(html) {
return minify(html, {
collapseWhitespace: true
});
}
};
};
export default defineConfig(({ command, mode }) => {
const isProduction = mode === 'production';
return {
base: './',
build: {
polyfillDynamicImport: false,
cssCodeSplit: false,
minify: isProduction
},
plugins: [
windiCSS({
//@ts-ignore
verbose: true,
silent: false,
debug: true,
config: 'tailwind.config.js', // tailwind config file path (optional)
compile: false, // false: interpretation mode; true: compilation mode
prefix: 'windi-', // set compilation mode style prefix
globalPreflight: true, // set preflight style is global or scoped
globalUtility: true // set utility style is global or scoped
}),
svelte({
//@ts-ignore
hot: !isProduction,
emitCss: true,
extensions: [ '.md', '.svx', '.svelte' ],
preprocess: [
//
]
}),
indexReplace()
]
};
});