Compare commits

...

163 Commits

Author SHA1 Message Date
c9e3b613e1 🚀Bumped version to v1.3.0
All checks were successful
Build release images / build-container (push) Successful in 51s
Build Latest image / build-container (push) Successful in 1m4s
2025-03-28 18:33:01 +01:00
f0c668c1c3 feat: only show international phone number thing if + is missing
All checks were successful
Build Latest image / build-container (push) Successful in 45s
2025-03-28 18:29:29 +01:00
e418d2a2b7 feat: improved Register UI
All checks were successful
Build Latest image / build-container (push) Successful in 45s
2025-03-28 17:47:12 +01:00
e14a6d6329 feat: improve phone number registration 2025-03-28 17:38:13 +01:00
e1a87eda4a 🚀Bumped version to v1.2.7
All checks were successful
Build Latest image / build-container (push) Successful in 1m3s
Build release images / build-container (push) Successful in 1m6s
2025-03-23 19:55:05 +01:00
0e557ef408 footer: cleanup imprint & privacy url
Some checks failed
Build Latest image / build-container (push) Has been cancelled
2025-03-23 19:54:47 +01:00
0af73525bc footer padding
All checks were successful
Build Latest image / build-container (push) Successful in 52s
2025-03-23 19:53:48 +01:00
422df7c3f8 fix: footer
Some checks failed
Build Latest image / build-container (push) Has been cancelled
2025-03-23 19:53:35 +01:00
bab145d78c chore: clean up .dockerignore by removing Gatsby references
All checks were successful
Build Latest image / build-container (push) Successful in 44s
2025-03-22 23:03:20 +01:00
a862593c53 refactor(ci): Switch to actions 2025-03-22 23:02:14 +01:00
63fc5ec747 🚀Bumped version to v1.2.6 2025-03-18 22:59:20 +01:00
c98a65d918 fix(profile): font sizes 2025-03-18 22:59:01 +01:00
b1ab04fa53 🚀Bumped version to v1.2.5 2025-03-18 21:32:48 +01:00
9af9c897f1 feat: improved icons 2025-03-18 21:32:32 +01:00
51b66eb85b feat: improved tabs 2025-03-18 21:29:13 +01:00
b3197dd3f9 feat: cleanup 2025-03-18 21:15:52 +01:00
50fbfe05f1 refactor: simplify imprint + privacy 2025-03-18 21:12:23 +01:00
0ff6df68d6 feat: cleanup 2025-03-18 21:06:39 +01:00
03532cc365 feat: profile cleanup 2025-03-18 21:05:13 +01:00
d50719c0da feat: profile cleanup 2025-03-18 20:58:42 +01:00
865058c8bb refactor: move to new lfk ts client 2025-03-18 00:05:04 +01:00
d503061604 register: drop middlename 2025-03-18 00:01:05 +01:00
d5eefbb5e2 fix(register): phone number verification 2025-03-18 00:00:51 +01:00
f1d552ce64 🚀Bumped version to v1.2.4 2025-03-17 22:35:58 +01:00
2939911c99 feat: loading screen 2025-03-17 22:35:12 +01:00
e7b9c6e203 🚀Bumped version to v1.2.3 2025-03-17 22:22:39 +01:00
3641d2a783 no selfservice sponsor add for now 2025-03-17 22:21:17 +01:00
ccea9d6197 shareSponsorLink function 2025-03-17 22:20:54 +01:00
c94f9e550e i18n 2025-03-17 22:15:00 +01:00
0848209d49 feat: disable darkmode for now, also is better for visibility on day of run... 2025-03-17 22:06:51 +01:00
1202f2ebca feat: profile cleanup 2025-03-17 22:06:32 +01:00
4714b81465 wip 2025-03-17 22:00:31 +01:00
7f2e6b9160 cleanup 2025-03-17 21:54:06 +01:00
0366f95951 feat: cleanup profile 2025-03-17 21:52:44 +01:00
382757aa66 feat: wip: sponsoring add 2025-03-17 21:43:47 +01:00
34e63cf690 feat: improve profile 2025-03-17 21:32:02 +01:00
846d10f0b9 feat: improve profile 2025-03-17 21:29:13 +01:00
86ec22aa43 feat: cleanup profile 2025-03-17 21:16:57 +01:00
f6f46f41bf feat(footer): 2024 2025-03-17 20:32:32 +01:00
64bb2d157d chore(deps): bump 2025-03-17 20:32:23 +01:00
c8ceae5cf0 🚀Bumped version to v1.2.2
Some checks failed
ci/woodpecker/push/build Pipeline failed
ci/woodpecker/tag/release Pipeline was successful
2024-12-16 17:10:39 +01:00
1d7cd601ee feat(profile): add cursor pointer
Some checks failed
ci/woodpecker/push/build Pipeline failed
2024-12-16 17:10:27 +01:00
9ddb188ef6 🚀Bumped version to v1.2.1
All checks were successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/release Pipeline was successful
2024-12-16 17:03:30 +01:00
4996b8c526 Merge branch 'dev' of https://git.odit.services/lfk/selfservice into dev 2024-12-16 17:03:06 +01:00
7d2a29c0d8 🚀Bumped version to v1.2.0
All checks were successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/release Pipeline was successful
2024-12-16 16:56:10 +01:00
721892c315 refacor(documents): Switch to new document-server 2024-12-16 16:55:26 +01:00
d5641312ca feat(profile): updated tab alignment 2024-12-16 16:55:16 +01:00
c34a8a7fcc refactor(profile): replace styles with tailwindcss 2024-12-16 16:55:01 +01:00
55abb9ed22 feat(profile): show total distance 2024-12-16 16:54:06 +01:00
1d55445c1b 🚀Bumped version to v1.1.2
Some checks failed
ci/woodpecker/push/build Pipeline failed
ci/woodpecker/tag/release Pipeline was successful
2024-12-11 23:08:38 +01:00
762454a086 fix(profile): migrate to code128 2024-12-11 23:08:27 +01:00
25c2a170bc chore(deps): bump all 2024-12-11 22:45:30 +01:00
b21ad636ad refactor: drop postbuild step 2024-12-11 22:45:20 +01:00
4771bf1359 🚀Bumped version to v1.1.1
All checks were successful
ci/woodpecker/tag/release Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
2024-12-11 22:43:36 +01:00
dbe707b062 fix(profile): passed id is a jwt 2024-12-11 22:43:02 +01:00
dee1b7a6ea 🚀Bumped version to v1.1.0
All checks were successful
ci/woodpecker/tag/release Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
2024-12-02 16:50:31 +01:00
4bcbc67436 refactor: drop sub-directory routing 2024-12-02 16:48:15 +01:00
595735ad00 🚀Bumped version to v1.0.1
All checks were successful
ci/woodpecker/tag/release Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
2024-12-02 15:53:04 +01:00
7fcb6a9fc3 fix(container): Add dockeringore 2024-12-02 15:51:25 +01:00
2285ea5070 🚀Bumped version to v1.0.0
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2024-12-02 15:32:47 +01:00
4af5c4545b refactor
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2024-12-02 13:16:45 +01:00
f296cbc1a0 i18n 2024-12-02 13:08:55 +01:00
4fcc38c374 updated profile page 2024-12-02 13:08:08 +01:00
90c085db28 footer update 2024-12-02 13:07:57 +01:00
1a3ab98412 improved style in registered view 2024-12-02 12:58:09 +01:00
048edfba89 i18n 2024-12-02 12:56:43 +01:00
0acda07eb5 add i18n ally snake case config 2024-12-02 12:42:00 +01:00
afffde8fa0 registration brand font + more translations 2024-12-02 12:34:42 +01:00
1eab535381 wip: general updates 2024-12-02 11:54:05 +01:00
196b386d6d refactor: translations 2024-12-02 11:31:24 +01:00
548148e898 fix: translations 2024-12-02 11:29:05 +01:00
6376dcb5fe feat(Footer): ref lfk 2024-12-02 11:25:11 +01:00
75b61d991b feat(Home): improve ui 2024-12-02 11:24:04 +01:00
af9a168f58 feat: lfk font 2024-12-02 11:12:00 +01:00
f71b01c39a chore(deps): node@23.3.0 2024-12-02 11:06:26 +01:00
3e289d83f9 feat(Home): improve background.jpg import
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2024-12-02 11:00:07 +01:00
ec6d252928 refactor: code cleanup 2024-12-02 10:55:06 +01:00
4a11fef0e0 chore(deps): update all
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2024-12-02 10:40:06 +01:00
b85c3958c2 chore: pnpm v9
Some checks are pending
ci/woodpecker/push/build Pipeline is running
2024-12-02 10:16:59 +01:00
780bc54604 refactor(ci): Make ready for new woodpecker
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2024-11-26 19:23:40 +01:00
cb2f8eeab1 chore: 2025 2024-11-21 10:49:46 +01:00
c36db2c18f Pin pnpm
All checks were successful
ci/woodpecker/push/build Pipeline was successful
2023-11-06 20:27:30 +01:00
decc80fcc1 Merge branch 'dev' of git.odit.services:lfk/selfservice into dev
Some checks failed
ci/woodpecker/push/build Pipeline failed
2023-11-06 20:25:28 +01:00
9a3d307dfa feat(ci)!: Switch to woodpecker 2023-11-06 20:25:26 +01:00
240f44df60 🚀Bumped version to v0.11.3
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-07 15:17:49 +02:00
677e65f44a chore(deps): pnpm@8.1.1 2023-04-07 15:17:27 +02:00
772eca64bb fix(Footer): darkmode colors in lightmode
Some checks failed
continuous-integration/drone/push Build is failing
2023-04-07 15:15:26 +02:00
25d25401df fix: registration code white bg
close #50
2023-04-07 15:13:44 +02:00
cac5103d52 switched drone to kaniko with cache
All checks were successful
continuous-integration/drone/push Build is passing
2023-03-29 20:20:06 +02:00
6aca13f0cb Pinned pnpm and lockfile 2023-03-29 20:17:33 +02:00
78fea1ea04 Switched dockerfile to pnpm with cache 2023-03-29 20:17:18 +02:00
fa51b31fe4 🚀Bumped version to v0.11.2
All checks were successful
continuous-integration/drone/push Build is passing
2023-03-15 19:27:59 +01:00
b9624aa5ad Added footer to every page 2023-03-15 19:27:40 +01:00
09e48e771f Accept tos to accept privacy_policy 2023-03-15 19:22:35 +01:00
8364321a7c 🚀Bumped version to v0.11.1
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-18 17:27:22 +01:00
659fa77dca Profile: add "---" if no data set
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-18 17:26:54 +01:00
10c9127256 🚀Bumped version to v0.11.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 17:24:42 +01:00
a3a1e89aa1 pnpm migration
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 17:24:25 +01:00
5587175534 🚀Bumped version to v0.10.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 17:19:08 +01:00
8e2b355466 updated nginx config for cache busting
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 17:18:57 +01:00
eccce0795b text cleanups + footer
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 17:14:01 +01:00
54540be6e1 improved profile page padding + full width registration code for easier scanning
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 17:04:25 +01:00
3392a2e68e 🚀Bumped version to v0.9.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 16:52:50 +01:00
8928f841dc wip: registration confirmation ui
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 16:52:38 +01:00
9ac14e8a5d wip: error registration ui feedback
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 16:48:14 +01:00
4a5b9d2569 🚀Bumped version to v0.8.3
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 16:44:43 +01:00
123509d0a6 fix: registration code (broke in merge)
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 16:44:10 +01:00
51f8d0fb42 wip: fix registration code
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 16:41:42 +01:00
f4d1c7b053 🚀Bumped version to v0.8.2
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 13:51:54 +01:00
ab9b400fff /profile/ dont instantly show mail format error
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 13:51:23 +01:00
ac75828309 /profile/ move from anchor tag to button
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 13:51:09 +01:00
c7f3a893af /profile/ toast styles
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 13:50:54 +01:00
30fd7ead08 /profile/ autocomplete mail
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 13:50:40 +01:00
64e6ef8cec /profile/ text cleanups
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 13:50:27 +01:00
c35f943957 move /registered/ to props
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-03 13:46:18 +01:00
292e44057a 🚀Bumped version to v0.8.1
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-02 15:54:17 +01:00
20fca6794d Adjusted button text 2023-02-02 15:53:58 +01:00
8139d63715 Switched request login link api path to login (backend v13.0.0) 2023-02-02 15:52:33 +01:00
7051909bf9 🚀Bumped version to v0.8.0
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-02 00:16:29 +01:00
f7a0682c33 Merge pull request 'dont autologin on register -> require mail link' (#47) from feature/46-dont-autologin-on-register-require-mail-link into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #47
2023-02-01 23:16:11 +00:00
c63adf557b 🚀Bumped version to v0.7.11
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-02 00:15:58 +01:00
077b33f031 Profile: improved mobile responsiveness/ design + toast clear
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-02 00:15:12 +01:00
52a6b3dc77 fix: registration code download button style
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-02 00:10:48 +01:00
eb20b547e7 add /registered/?mail route
ref #46
2023-02-02 00:08:14 +01:00
8b5e1cac13 🚀Bumped version to v0.7.10
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 17:50:46 +01:00
20c6a420e9 Merge branch 'dev' of git.odit.services:lfk/selfservice into dev
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 17:48:52 +01:00
53800b4fa3 Added download for registration code 2023-02-01 17:42:58 +01:00
debbd9219c 🚀Bumped version to v0.7.9
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 17:40:23 +01:00
9b261bf200 fix codeconfig.height
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 17:40:09 +01:00
713dd15312 drop jsbarcode
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 17:39:59 +01:00
64382880c4 Pinned version 2023-02-01 17:39:15 +01:00
9e06c46411 Configureable barcode format via bwp-js 2023-02-01 17:39:03 +01:00
8cfddb5029 migrate to bwip-js
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 17:36:22 +01:00
e5a01bcd76 🚀Bumped version to v0.7.8
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 14:50:04 +01:00
851190e6a7 add barcode to profile
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 14:48:06 +01:00
1603a097f7 certificate generation: success toast styling
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-01 14:47:38 +01:00
c2b615294e 🚀Bumped version to v0.7.7
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-31 13:47:39 +01:00
c64762831f fix: registration w/o phone
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-31 13:47:32 +01:00
9b446abc1f 🚀Bumped version to v0.7.6
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-31 13:47:19 +01:00
5d974e562e update release script
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-31 13:45:45 +01:00
a030f6b738 update texts of pdf generation status toasts
All checks were successful
continuous-integration/drone/push Build is passing
close #44
2023-01-31 13:45:28 +01:00
1249248a9d 🚀Bumped version to v0.7.5
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-30 18:19:53 +01:00
0bd6d543bf update nginx base
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-30 18:18:26 +01:00
92d7bfd594 updated base node image
Some checks failed
continuous-integration/drone/push Build is failing
2023-01-30 18:16:25 +01:00
917cb6be34 fix: relativ links
Some checks failed
continuous-integration/drone/push Build is failing
2023-01-30 18:13:50 +01:00
d159cb59be AGB link 2023-01-30 18:13:43 +01:00
9812d79d4d 2023
Some checks failed
continuous-integration/drone/push Build is failing
2023-01-30 18:12:50 +01:00
4663214ede 🚀Bumped version to v0.7.4
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-21 15:58:49 +02:00
9c9ceaa666 Updated dronefile
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-21 15:57:45 +02:00
602d80bd14 🚀Bumped version to v0.7.3
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-21 15:38:27 +02:00
45ee4ab812 Merge pull request 'Button fixes bugfix/42-button_links' (#43) from bugfix/42-button_links into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #43
2021-04-21 13:38:10 +00:00
020c310865 Fixed register button link
ref #42
2021-04-21 12:33:16 +02:00
1102d29c0e Removed useless register now button
ref #42
2021-04-21 12:31:46 +02:00
1a3af200dd 🚀Bumped version to v0.7.2
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-14 12:19:43 +02:00
71f419ffb4 Merge branch 'dev' of git.odit.services:lfk/selfservice into dev
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-14 12:18:09 +02:00
b74bea0340 Document generation hotfix 🐞 2021-04-14 12:18:02 +02:00
b0172c500b 🚀Bumped version to v0.7.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-13 18:08:19 +02:00
75b4dac0fe Merge pull request 'bugfix/31-env-js-linking-ci' (#41) from bugfix/31-env-js-linking-ci into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #41
close #31
2021-04-13 16:02:44 +00:00
51d058bf96 added 'yarn postbuild' script for fixing env.js in dist/index.html
ref #31
2021-04-13 17:58:43 +02:00
ad13bae068 dependency bump 2021-04-13 17:57:41 +02:00
152e74190d 🚀Bumped version to v0.7.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-06 21:28:02 +02:00
4c83e2e738 Merge pull request 'Donation list feature/39-donation_list' (#40) from feature/39-donation_list into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #40
2021-04-06 19:27:30 +00:00
cb1b9d330b Sorted translations 🌍
ref #39
2021-04-06 21:25:36 +02:00
40 changed files with 6264 additions and 1612 deletions

185
.dockerignore Normal file
View File

@@ -0,0 +1,185 @@
# ---> Node
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# ---> Windows
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# ---> macOS
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# ---> Vue
# gitignore template for Vue.js projects
#
# Recommended template: Node.gitignore
# TODO: where does this rule come from?
docs/_book
# TODO: where does this rule come from?
test/
/package-lock.json
/yarn.lock
/public/env.js

View File

@@ -1,134 +0,0 @@
---
kind: secret
name: docker_username
get:
path: odit-registry-builder
name: username
---
kind: secret
name: docker_password
get:
path: odit-registry-builder
name: password
---
kind: secret
name: git_ssh
get:
path: odit-git-bot
name: sshkey
---
kind: pipeline
type: kubernetes
name: build:dev
steps:
# - name: run full license export
# depends_on: ["clone"]
# image: node:alpine
# commands:
# - yarn
# - yarn licenses:export
# - name: push new licenses file to repo
# depends_on: ["run full license export"]
# image: appleboy/drone-git-push
# settings:
# branch: dev
# commit: true
# commit_message: new license file version [CI SKIP]
# author_email: bot@odit.services
# remote: git@git.odit.services:lfk/selfservice.git
# ssh_key:
# from_secret: git_ssh
- name: build dev
image: plugins/docker
depends_on: [clone]
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: registry.odit.services/lfk/selfservice
tags:
- dev
registry: registry.odit.services
mtu: 1000
trigger:
branch:
- dev
event:
- push
---
kind: pipeline
type: kubernetes
name: build:testing
steps:
- name: build testing
image: plugins/docker
depends_on: [clone]
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: registry.odit.services/lfk/selfservice
tags:
- testing
registry: registry.odit.services
mtu: 1000
trigger:
branch:
- bugfix/31-env_linking
event:
- push
---
kind: pipeline
type: kubernetes
name: build:latest
steps:
- name: build latest
image: plugins/docker
depends_on: [clone]
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: registry.odit.services/lfk/selfservice
tags:
- latest
registry: registry.odit.services
mtu: 1000
trigger:
branch:
- main
event:
- push
---
kind: pipeline
type: kubernetes
name: build:tags
steps:
- name: build $DRONE_TAG
image: plugins/docker
depends_on: [clone]
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: registry.odit.services/lfk/selfservice
tags:
- '${DRONE_TAG}'
registry: registry.odit.services
mtu: 1000
trigger:
event:
- tag

27
.gitea/workflows/dev.yaml Normal file
View File

@@ -0,0 +1,27 @@
name: Build Latest image
on:
push:
branches:
- dev
jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- 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/selfservice:dev
platforms: linux/amd64,linux/arm64

View File

@@ -0,0 +1,27 @@
name: Build Latest image
on:
push:
branches:
- main
jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- 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/selfservice:latest
platforms: linux/amd64,linux/arm64

View File

@@ -0,0 +1,27 @@
name: Build release images
on:
push:
tags:
- "*.*.*"
jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- 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/selfservice:${{ github.ref_name }}
platforms: linux/amd64,linux/arm64

View File

@@ -2,5 +2,9 @@
"i18n-ally.localesPaths": [ "i18n-ally.localesPaths": [
"src/locales" "src/locales"
], ],
"i18n-ally.keystyle": "nested" "i18n-ally.keystyle": "nested",
"i18n-ally.extract.keygenStyle": "snake_case",
"i18n-ally.enabledFrameworks": [
"vue"
]
} }

View File

@@ -2,8 +2,354 @@
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.3.0](https://git.odit.services/lfk/selfservice/compare/1.2.7...1.3.0)
- feat: improve phone number registration [`e14a6d6`](https://git.odit.services/lfk/selfservice/commit/e14a6d6329d547d3086abe59d00f0d054688b6f4)
- feat: improved Register UI [`e418d2a`](https://git.odit.services/lfk/selfservice/commit/e418d2a2b74553f614520ac8c0f0377d141daa8d)
- feat: only show international phone number thing if + is missing [`f0c668c`](https://git.odit.services/lfk/selfservice/commit/f0c668c1c3d1a5c27d78617e5ca34ca68603ce14)
#### [1.2.7](https://git.odit.services/lfk/selfservice/compare/1.2.6...1.2.7)
> 23 March 2025
- refactor(ci): Switch to actions [`a862593`](https://git.odit.services/lfk/selfservice/commit/a862593c5315043577699d1a6fd50854dd1bca00)
- 🚀Bumped version to v1.2.7 [`e1a87ed`](https://git.odit.services/lfk/selfservice/commit/e1a87eda4a0c9b9be47bcfe4ddb0e93696d037f4)
- footer: cleanup imprint & privacy url [`0e557ef`](https://git.odit.services/lfk/selfservice/commit/0e557ef4080e997b06adcbbadf3e82f12152281b)
- fix: footer [`422df7c`](https://git.odit.services/lfk/selfservice/commit/422df7c3f832dc29721e783dc4a86ee55e9d8ccc)
- footer padding [`0af7352`](https://git.odit.services/lfk/selfservice/commit/0af73525bc154ba730351d7a4970e9737edaa4db)
- chore: clean up .dockerignore by removing Gatsby references [`bab145d`](https://git.odit.services/lfk/selfservice/commit/bab145d78c16dd7c56136a274d051cf408935e3e)
#### [1.2.6](https://git.odit.services/lfk/selfservice/compare/1.2.5...1.2.6)
> 18 March 2025
- 🚀Bumped version to v1.2.6 [`63fc5ec`](https://git.odit.services/lfk/selfservice/commit/63fc5ec7474f65c743db9c281829fef31b623af6)
- fix(profile): font sizes [`c98a65d`](https://git.odit.services/lfk/selfservice/commit/c98a65d918e5d652ee98044b4d5333c7000e1c87)
#### [1.2.5](https://git.odit.services/lfk/selfservice/compare/1.2.4...1.2.5)
> 18 March 2025
- refactor: move to new lfk ts client [`865058c`](https://git.odit.services/lfk/selfservice/commit/865058c8bb7eec03278bf1f4a7b708429d0b5b20)
- feat: cleanup [`b3197dd`](https://git.odit.services/lfk/selfservice/commit/b3197dd3f95cd7d222f1ea168e9826f7ad7ef903)
- refactor: simplify imprint + privacy [`50fbfe0`](https://git.odit.services/lfk/selfservice/commit/50fbfe05f1ba830ea19f9e86b7a2fdce588f1a31)
- feat: improved tabs [`51b66eb`](https://git.odit.services/lfk/selfservice/commit/51b66eb85b3003996ac2414757ae62ee7ba80ce5)
- fix(register): phone number verification [`d5eefbb`](https://git.odit.services/lfk/selfservice/commit/d5eefbb5e22f4cc7b50e1f0c469779d3b7e310f5)
- feat: improved icons [`9af9c89`](https://git.odit.services/lfk/selfservice/commit/9af9c897f17b8a1be12f47dc271382629fc298ff)
- feat: profile cleanup [`d50719c`](https://git.odit.services/lfk/selfservice/commit/d50719c0dad4e3fbf008fb240edff80c4ea6ab4c)
- 🚀Bumped version to v1.2.5 [`b1ab04f`](https://git.odit.services/lfk/selfservice/commit/b1ab04fa53817178e016d7c2c387db12c0f6a987)
- register: drop middlename [`d503061`](https://git.odit.services/lfk/selfservice/commit/d5030616043fb9fa4eccc7894ee3ada92928d102)
- feat: profile cleanup [`03532cc`](https://git.odit.services/lfk/selfservice/commit/03532cc365e38d7313ff2e8571ae15975d8a53e5)
- feat: cleanup [`0ff6df6`](https://git.odit.services/lfk/selfservice/commit/0ff6df68d61404c7be7a1e9b88a354fb12ce0907)
#### [1.2.4](https://git.odit.services/lfk/selfservice/compare/1.2.3...1.2.4)
> 17 March 2025
- feat: loading screen [`2939911`](https://git.odit.services/lfk/selfservice/commit/2939911c993c3817d841d4cb4660aa940e478cc0)
- 🚀Bumped version to v1.2.4 [`f1d552c`](https://git.odit.services/lfk/selfservice/commit/f1d552ce64557b5da0dea91e114d3ebf2f8f0199)
#### [1.2.3](https://git.odit.services/lfk/selfservice/compare/1.2.2...1.2.3)
> 17 March 2025
- chore(deps): bump [`64bb2d1`](https://git.odit.services/lfk/selfservice/commit/64bb2d157daab257b6e0e7c4e6ed04f4b3772740)
- feat: cleanup profile [`86ec22a`](https://git.odit.services/lfk/selfservice/commit/86ec22aa435d9138ae3cde6387ce7ead14f3c964)
- feat: improve profile [`846d10f`](https://git.odit.services/lfk/selfservice/commit/846d10f0b95dad460a068bdaf3ca489d96c0b723)
- feat: profile cleanup [`1202f2e`](https://git.odit.services/lfk/selfservice/commit/1202f2ebca5fbc0baea145dda6f99668d8c47e92)
- feat: improve profile [`34e63cf`](https://git.odit.services/lfk/selfservice/commit/34e63cf690431da973a969376b493d8b34f5c7c0)
- i18n [`c94f9e5`](https://git.odit.services/lfk/selfservice/commit/c94f9e550e1cbe4626242423deb6d9ab994eea63)
- feat: wip: sponsoring add [`382757a`](https://git.odit.services/lfk/selfservice/commit/382757aa66cd79a6a8081ff4b21f6efe46a3ccfd)
- feat: cleanup profile [`0366f95`](https://git.odit.services/lfk/selfservice/commit/0366f95951d1415b300b174699d93e4bf17f3e18)
- 🚀Bumped version to v1.2.3 [`e7b9c6e`](https://git.odit.services/lfk/selfservice/commit/e7b9c6e2036addd18e109e3ab040e69dee2f658d)
- shareSponsorLink function [`ccea9d6`](https://git.odit.services/lfk/selfservice/commit/ccea9d61975bfa54928d557735cd3ce79d671435)
- no selfservice sponsor add for now [`3641d2a`](https://git.odit.services/lfk/selfservice/commit/3641d2a78341b91a26a9d4cc31c40707096768b1)
- feat: disable darkmode for now, also is better for visibility on day of run... [`0848209`](https://git.odit.services/lfk/selfservice/commit/0848209d49e4445881bf9536d87fe18ea2a6c924)
- wip [`4714b81`](https://git.odit.services/lfk/selfservice/commit/4714b814650d4138d8522dd57b5ee59a8c96a0ac)
- feat(footer): 2024 [`f6f46f4`](https://git.odit.services/lfk/selfservice/commit/f6f46f41bf2c6fcf75dbd79a28f6dd14114445e3)
- cleanup [`7f2e6b9`](https://git.odit.services/lfk/selfservice/commit/7f2e6b916076874cfb2e787ae174320b50d2d7e0)
#### [1.2.2](https://git.odit.services/lfk/selfservice/compare/1.2.1...1.2.2)
> 16 December 2024
- feat(profile): add cursor pointer [`1d7cd60`](https://git.odit.services/lfk/selfservice/commit/1d7cd601ee027dd7df0405079e208d03078210bb)
- 🚀Bumped version to v1.2.2 [`c8ceae5`](https://git.odit.services/lfk/selfservice/commit/c8ceae5cf016341af1bc903fb219e544bb2f0d58)
#### [1.2.1](https://git.odit.services/lfk/selfservice/compare/1.2.0...1.2.1)
> 16 December 2024
- feat(profile): show total distance [`55abb9e`](https://git.odit.services/lfk/selfservice/commit/55abb9ed22e4c66c05536897ba33b12915eea226)
- refactor(profile): replace styles with tailwindcss [`c34a8a7`](https://git.odit.services/lfk/selfservice/commit/c34a8a7fcc77a0fa27280365ebf2382fbffc1e61)
- 🚀Bumped version to v1.2.1 [`9ddb188`](https://git.odit.services/lfk/selfservice/commit/9ddb188ef659742018f00d786e030f80a0d9bbc5)
- feat(profile): updated tab alignment [`d564131`](https://git.odit.services/lfk/selfservice/commit/d5641312ca0b35a5c5ab9b7b19ed3a40971ac4fd)
#### [1.2.0](https://git.odit.services/lfk/selfservice/compare/1.1.2...1.2.0)
> 16 December 2024
- refacor(documents): Switch to new document-server [`721892c`](https://git.odit.services/lfk/selfservice/commit/721892c315de9c2c1158d0f728dc2ef387a5d8c2)
- 🚀Bumped version to v1.2.0 [`7d2a29c`](https://git.odit.services/lfk/selfservice/commit/7d2a29c0d834fbe783e59308af89bb8fb46a8015)
#### [1.1.2](https://git.odit.services/lfk/selfservice/compare/1.1.1...1.1.2)
> 11 December 2024
- chore(deps): bump all [`25c2a17`](https://git.odit.services/lfk/selfservice/commit/25c2a170bc9cde66498ae3d7f966201f2b28b679)
- 🚀Bumped version to v1.1.2 [`1d55445`](https://git.odit.services/lfk/selfservice/commit/1d55445c1b67ec2e1be73172d8e451f038451f59)
- refactor: drop postbuild step [`b21ad63`](https://git.odit.services/lfk/selfservice/commit/b21ad636ad69886878d5bd0f441f4187e4f22a5c)
- fix(profile): migrate to code128 [`762454a`](https://git.odit.services/lfk/selfservice/commit/762454a08674303881063337ddf86da564b191f1)
#### [1.1.1](https://git.odit.services/lfk/selfservice/compare/1.1.0...1.1.1)
> 11 December 2024
- 🚀Bumped version to v1.1.1 [`4771bf1`](https://git.odit.services/lfk/selfservice/commit/4771bf135986f90f344757083236539b9d590e83)
- fix(profile): passed id is a jwt [`dbe707b`](https://git.odit.services/lfk/selfservice/commit/dbe707b062ced048428b8c1f62a0ab047ab0051b)
#### [1.1.0](https://git.odit.services/lfk/selfservice/compare/1.0.1...1.1.0)
> 2 December 2024
- refactor: drop sub-directory routing [`4bcbc67`](https://git.odit.services/lfk/selfservice/commit/4bcbc67436e6c0b0905e3ef2613894854d659091)
- 🚀Bumped version to v1.1.0 [`dee1b7a`](https://git.odit.services/lfk/selfservice/commit/dee1b7a6eab11689bae8914e74bea7cb364475e2)
#### [1.0.1](https://git.odit.services/lfk/selfservice/compare/1.0.0...1.0.1)
> 2 December 2024
- fix(container): Add dockeringore [`7fcb6a9`](https://git.odit.services/lfk/selfservice/commit/7fcb6a9fc3f98772990790f6385200732f8bce7c)
- 🚀Bumped version to v1.0.1 [`595735a`](https://git.odit.services/lfk/selfservice/commit/595735ad003b849521e6e5f2b24da4880f768dff)
### [1.0.0](https://git.odit.services/lfk/selfservice/compare/0.11.3...1.0.0)
> 2 December 2024
- chore(deps): update all [`4a11fef`](https://git.odit.services/lfk/selfservice/commit/4a11fef0e0ad0940535fd1d6a1a57a829dc2b50d)
- chore: pnpm v9 [`b85c395`](https://git.odit.services/lfk/selfservice/commit/b85c3958c288293bb98df2326f73dfad1684e3cb)
- wip: general updates [`1eab535`](https://git.odit.services/lfk/selfservice/commit/1eab5353810a0a351cfc72b493c5156f55a4c9d2)
- refactor [`4af5c45`](https://git.odit.services/lfk/selfservice/commit/4af5c4545bfaad21d71bcbf91d2cd8ea53847b62)
- fix: translations [`548148e`](https://git.odit.services/lfk/selfservice/commit/548148e8982d7d146182af9f2a69de87f0b3529e)
- refactor: translations [`196b386`](https://git.odit.services/lfk/selfservice/commit/196b386d6d57e91fbb4f46091a59ba04bb6e6984)
- feat(ci)!: Switch to woodpecker [`9a3d307`](https://git.odit.services/lfk/selfservice/commit/9a3d307dfae0851eb842ad3f1c34460bca13bff1)
- i18n [`048edfb`](https://git.odit.services/lfk/selfservice/commit/048edfba89a69efd3362dd8df8b89f8780f5f3fe)
- registration brand font + more translations [`afffde8`](https://git.odit.services/lfk/selfservice/commit/afffde8fa04df88d0a8bff05d0a28550414ce385)
- feat: lfk font [`af9a168`](https://git.odit.services/lfk/selfservice/commit/af9a168f587768d8b1af8990729e743481ba687d)
- updated profile page [`4fcc38c`](https://git.odit.services/lfk/selfservice/commit/4fcc38c374553b22f92a734903df1b7a032348fa)
- 🚀Bumped version to v1.0.0 [`2285ea5`](https://git.odit.services/lfk/selfservice/commit/2285ea507069cf362baa950e7337aec72a37d4e3)
- i18n [`f296cbc`](https://git.odit.services/lfk/selfservice/commit/f296cbc1a0c9035db6546c85781be71b152264d7)
- feat(Footer): ref lfk [`6376dcb`](https://git.odit.services/lfk/selfservice/commit/6376dcb5fe7e3b1e1e639e41bc1b682036d838a0)
- feat(Home): improve ui [`75b61d9`](https://git.odit.services/lfk/selfservice/commit/75b61d991bd483aaf00871c12c9268fc6e21435b)
- refactor(ci): Make ready for new woodpecker [`780bc54`](https://git.odit.services/lfk/selfservice/commit/780bc54604998abd275f3b7d50a3849002eb243d)
- refactor: code cleanup [`ec6d252`](https://git.odit.services/lfk/selfservice/commit/ec6d252928fb84248041a3675590b85293c96133)
- chore: 2025 [`cb2f8ee`](https://git.odit.services/lfk/selfservice/commit/cb2f8eeab1a7e260df938b8aa94fa31f8e1b5efe)
- footer update [`90c085d`](https://git.odit.services/lfk/selfservice/commit/90c085db28798bbcac24eb9700285221a9bcad92)
- improved style in registered view [`1a3ab98`](https://git.odit.services/lfk/selfservice/commit/1a3ab98412b82eeb1f0dea8ea642f5fc6435c09d)
- add i18n ally snake case config [`0acda07`](https://git.odit.services/lfk/selfservice/commit/0acda07eb53a85f7b2e87a3e26d90b7cdf1fe012)
- feat(Home): improve background.jpg import [`3e289d8`](https://git.odit.services/lfk/selfservice/commit/3e289d83f9db98641f0f7f732b622dab9955f3a1)
- chore(deps): node@23.3.0 [`f71b01c`](https://git.odit.services/lfk/selfservice/commit/f71b01c39a62ef4402004e2fbcfacb37bc92ea39)
- Pin pnpm [`c36db2c`](https://git.odit.services/lfk/selfservice/commit/c36db2c18fc5f7cfd7bf5d295f3faf3931df736b)
#### [0.11.3](https://git.odit.services/lfk/selfservice/compare/0.11.2...0.11.3)
> 7 April 2023
- fix: registration code white bg [`#50`](https://git.odit.services/lfk/selfservice/issues/50)
- Pinned pnpm and lockfile [`6aca13f`](https://git.odit.services/lfk/selfservice/commit/6aca13f0cb1bc8fa43f0f09c554cec0758acd7a1)
- switched drone to kaniko with cache [`cac5103`](https://git.odit.services/lfk/selfservice/commit/cac5103d52427e777e4c3624ebb253ad7bd393d6)
- Switched dockerfile to pnpm with cache [`78fea1e`](https://git.odit.services/lfk/selfservice/commit/78fea1ea045a7281fe0a2841fc4d5f1505dcb3cf)
- 🚀Bumped version to v0.11.3 [`240f44d`](https://git.odit.services/lfk/selfservice/commit/240f44df60184c492f6cff3d864c1f9f2563ff80)
- chore(deps): pnpm@8.1.1 [`677e65f`](https://git.odit.services/lfk/selfservice/commit/677e65f44ae4bcc6f9af4732d813f337da0c51d2)
- fix(Footer): darkmode colors in lightmode [`772eca6`](https://git.odit.services/lfk/selfservice/commit/772eca64bb38ce1cf1ea1b58859dd744588a88e1)
#### [0.11.2](https://git.odit.services/lfk/selfservice/compare/0.11.1...0.11.2)
> 15 March 2023
- Added footer to every page [`b9624aa`](https://git.odit.services/lfk/selfservice/commit/b9624aa5ad57002852c84081fc710c2e977251bd)
- 🚀Bumped version to v0.11.2 [`fa51b31`](https://git.odit.services/lfk/selfservice/commit/fa51b31fe41d41b3ec9becad07ddab4cf73be051)
- Accept tos to accept privacy_policy [`09e48e7`](https://git.odit.services/lfk/selfservice/commit/09e48e771f4c0db4a7dbb898b05b347f1aad2292)
#### [0.11.1](https://git.odit.services/lfk/selfservice/compare/0.11.0...0.11.1)
> 18 February 2023
- Profile: add "---" if no data set [`659fa77`](https://git.odit.services/lfk/selfservice/commit/659fa77dca3b527d896d752386e91a167a1b8f4f)
- 🚀Bumped version to v0.11.1 [`8364321`](https://git.odit.services/lfk/selfservice/commit/8364321a7cb6a0037ee0c5055b028c4cf883fb10)
#### [0.11.0](https://git.odit.services/lfk/selfservice/compare/0.10.0...0.11.0)
> 3 February 2023
- pnpm migration [`a3a1e89`](https://git.odit.services/lfk/selfservice/commit/a3a1e89aa14798e1d180697f91809e282a229f23)
- 🚀Bumped version to v0.11.0 [`10c9127`](https://git.odit.services/lfk/selfservice/commit/10c9127256edf2cbad1dc6690d5f4e87c32f6396)
#### [0.10.0](https://git.odit.services/lfk/selfservice/compare/0.9.0...0.10.0)
> 3 February 2023
- text cleanups + footer [`eccce07`](https://git.odit.services/lfk/selfservice/commit/eccce0795b6960aa3a2e9368de5ae4bdf80997d7)
- updated nginx config for cache busting [`8e2b355`](https://git.odit.services/lfk/selfservice/commit/8e2b355466e9a37510be8bf03311d6b28e1a0d9f)
- improved profile page padding + full width registration code for easier scanning [`54540be`](https://git.odit.services/lfk/selfservice/commit/54540be6e12ed85afc96061b8548cd4ec6700eec)
- 🚀Bumped version to v0.10.0 [`5587175`](https://git.odit.services/lfk/selfservice/commit/5587175534188e05ab43d0eed9745484e01edb63)
#### [0.9.0](https://git.odit.services/lfk/selfservice/compare/0.8.3...0.9.0)
> 3 February 2023
- wip: error registration ui feedback [`9ac14e8`](https://git.odit.services/lfk/selfservice/commit/9ac14e8a5d740fb4cd87645e69b2cfde73e4acc7)
- wip: registration confirmation ui [`8928f84`](https://git.odit.services/lfk/selfservice/commit/8928f841dcd370daf28416adbf1adbe16fa4d76f)
- 🚀Bumped version to v0.9.0 [`3392a2e`](https://git.odit.services/lfk/selfservice/commit/3392a2e68edb8fcf2aa6dd4b962abbf6ac27a414)
#### [0.8.3](https://git.odit.services/lfk/selfservice/compare/0.8.2...0.8.3)
> 3 February 2023
- fix: registration code (broke in merge) [`123509d`](https://git.odit.services/lfk/selfservice/commit/123509d0a6d15fe254e28f7a316bd6c260fe7bd2)
- 🚀Bumped version to v0.8.3 [`4a5b9d2`](https://git.odit.services/lfk/selfservice/commit/4a5b9d25698931158a602b2159b4e6c4fa129e8e)
- wip: fix registration code [`51f8d0f`](https://git.odit.services/lfk/selfservice/commit/51f8d0fb42d0dbba268799eb9385686d22fd2284)
#### [0.8.2](https://git.odit.services/lfk/selfservice/compare/0.8.1...0.8.2)
> 3 February 2023
- move /registered/ to props [`c35f943`](https://git.odit.services/lfk/selfservice/commit/c35f943957e5ba84361a437c1d945331248746d1)
- 🚀Bumped version to v0.8.2 [`f4d1c7b`](https://git.odit.services/lfk/selfservice/commit/f4d1c7b053d1e7210911772bde1b2d80a30ab225)
- /profile/ text cleanups [`64e6ef8`](https://git.odit.services/lfk/selfservice/commit/64e6ef8cec38a8193c4fb28c5f1b26ee0e4d5063)
- /profile/ move from anchor tag to button [`ac75828`](https://git.odit.services/lfk/selfservice/commit/ac75828309043532c6ab8aad63e0c40edf450459)
- /profile/ toast styles [`c7f3a89`](https://git.odit.services/lfk/selfservice/commit/c7f3a893af8705af12f2e7ae7e40197ca4c28666)
- /profile/ dont instantly show mail format error [`ab9b400`](https://git.odit.services/lfk/selfservice/commit/ab9b400fff1b421a41dd27479a81fb5e3740b9ef)
- /profile/ autocomplete mail [`30fd7ea`](https://git.odit.services/lfk/selfservice/commit/30fd7ead0833b0b3ab4e5509608aa92112151380)
#### [0.8.1](https://git.odit.services/lfk/selfservice/compare/0.8.0...0.8.1)
> 2 February 2023
- 🚀Bumped version to v0.8.1 [`292e440`](https://git.odit.services/lfk/selfservice/commit/292e44057aee9ef57a51aa9fa0372c3678b81de0)
- Adjusted button text [`20fca67`](https://git.odit.services/lfk/selfservice/commit/20fca6794dd7e0c714cd09c80a68b1d3592ab09c)
- Switched request login link api path to login (backend v13.0.0) [`8139d63`](https://git.odit.services/lfk/selfservice/commit/8139d637151c8c0184e4a98f151991b429d0a70c)
#### [0.8.0](https://git.odit.services/lfk/selfservice/compare/0.7.11...0.8.0)
> 2 February 2023
- 🚀Bumped version to v0.8.0 [`7051909`](https://git.odit.services/lfk/selfservice/commit/7051909bf960fb44b43e979ac4d304dff9ef2ec4)
- Merge pull request 'dont autologin on register -> require mail link' (#47) from feature/46-dont-autologin-on-register-require-mail-link into dev [`f7a0682`](https://git.odit.services/lfk/selfservice/commit/f7a0682c3392b8882be4a676882c8a49d55bd5fe)
- add /registered/?mail route [`eb20b54`](https://git.odit.services/lfk/selfservice/commit/eb20b547e79d352f3b7cd1b5ce7b7dbfcf8c19f7)
#### [0.7.11](https://git.odit.services/lfk/selfservice/compare/0.7.10...0.7.11)
> 2 February 2023
- Profile: improved mobile responsiveness/ design + toast clear [`077b33f`](https://git.odit.services/lfk/selfservice/commit/077b33f03180d0bd6c45becaaa63d3408c645deb)
- 🚀Bumped version to v0.7.11 [`c63adf5`](https://git.odit.services/lfk/selfservice/commit/c63adf557bcb29c8eccc05d5a83d476c75380d95)
- fix: registration code download button style [`52a6b3d`](https://git.odit.services/lfk/selfservice/commit/52a6b3dc776b806eaa8fee058a1c381ab63a8ea5)
#### [0.7.10](https://git.odit.services/lfk/selfservice/compare/0.7.9...0.7.10)
> 1 February 2023
- Configureable barcode format via bwp-js [`9e06c46`](https://git.odit.services/lfk/selfservice/commit/9e06c464118c5b5d0cd78c8b8379523bf3bfdbd4)
- Added download for registration code [`53800b4`](https://git.odit.services/lfk/selfservice/commit/53800b4fa355bb972e51e71b5b1f98772deed114)
- 🚀Bumped version to v0.7.10 [`8b5e1ca`](https://git.odit.services/lfk/selfservice/commit/8b5e1cac1353373b13cf9d570deb7cadcd437247)
- Pinned version [`6438288`](https://git.odit.services/lfk/selfservice/commit/64382880c40ba5c1e3c9004ce7fc65099849cd44)
#### [0.7.9](https://git.odit.services/lfk/selfservice/compare/0.7.8...0.7.9)
> 1 February 2023
- migrate to bwip-js [`8cfddb5`](https://git.odit.services/lfk/selfservice/commit/8cfddb502964be7edf45cdc524344ea2f7f20142)
- fix codeconfig.height [`9b261bf`](https://git.odit.services/lfk/selfservice/commit/9b261bf20023561a7c9691dff33c9a6d2b5c0cac)
- 🚀Bumped version to v0.7.9 [`debbd92`](https://git.odit.services/lfk/selfservice/commit/debbd9219cb53dbd48cf0cb7bee329b765ce4647)
- drop jsbarcode [`713dd15`](https://git.odit.services/lfk/selfservice/commit/713dd153126851e8cf1045bf5ba3ca702a39c738)
#### [0.7.8](https://git.odit.services/lfk/selfservice/compare/0.7.7...0.7.8)
> 1 February 2023
- add barcode to profile [`851190e`](https://git.odit.services/lfk/selfservice/commit/851190e6a7f8b9cccbf05e60f9b50b96c196959c)
- 🚀Bumped version to v0.7.8 [`e5a01bc`](https://git.odit.services/lfk/selfservice/commit/e5a01bcd7629164655cacd10dd1f014260c67c4b)
- certificate generation: success toast styling [`1603a09`](https://git.odit.services/lfk/selfservice/commit/1603a097f71ed85c901baf8da04cb06b86474649)
#### [0.7.7](https://git.odit.services/lfk/selfservice/compare/0.7.6...0.7.7)
> 31 January 2023
- 🚀Bumped version to v0.7.7 [`c2b6152`](https://git.odit.services/lfk/selfservice/commit/c2b615294e605db37695b13cec1158f535986911)
- fix: registration w/o phone [`c647628`](https://git.odit.services/lfk/selfservice/commit/c64762831f1e6dffc9cbc3f531e23435b455a5a9)
#### [0.7.6](https://git.odit.services/lfk/selfservice/compare/0.7.5...0.7.6)
> 31 January 2023
- update texts of pdf generation status toasts [`#44`](https://git.odit.services/lfk/selfservice/issues/44)
- 🚀Bumped version to v0.7.6 [`9b446ab`](https://git.odit.services/lfk/selfservice/commit/9b446abc1fa231bb1f5a78c545400c617eaa4af5)
- update release script [`5d974e5`](https://git.odit.services/lfk/selfservice/commit/5d974e562ed1ed5aeac579afe000c2dca945ff71)
#### [0.7.5](https://git.odit.services/lfk/selfservice/compare/0.7.4...0.7.5)
> 30 January 2023
- fix: relativ links [`917cb6b`](https://git.odit.services/lfk/selfservice/commit/917cb6be340844bcc2318bf73cec37c3c831fd5d)
- 🚀Bumped version to v0.7.5 [`1249248`](https://git.odit.services/lfk/selfservice/commit/1249248a9d3e0d72665bca6871a651f2491a4039)
- 2023 [`9812d79`](https://git.odit.services/lfk/selfservice/commit/9812d79d4de820ce791f69634c5861f4f04ad7f1)
- update nginx base [`0bd6d54`](https://git.odit.services/lfk/selfservice/commit/0bd6d543bf60b7a333b96d5d319269d4bf50db96)
- updated base node image [`92d7bfd`](https://git.odit.services/lfk/selfservice/commit/92d7bfd59407273f86809b53ffc9f67fb8ba0ec7)
- AGB link [`d159cb5`](https://git.odit.services/lfk/selfservice/commit/d159cb59be35f963abc89c42732ba6110d27830c)
#### [0.7.4](https://git.odit.services/lfk/selfservice/compare/0.7.3...0.7.4)
> 21 April 2021
- Updated dronefile [`9c9ceaa`](https://git.odit.services/lfk/selfservice/commit/9c9ceaa6664f6ea21a536a12f04e552156e81da4)
- 🚀Bumped version to v0.7.4 [`4663214`](https://git.odit.services/lfk/selfservice/commit/4663214ede3880386b5389885e32c953571290e6)
#### [0.7.3](https://git.odit.services/lfk/selfservice/compare/0.7.2...0.7.3)
> 21 April 2021
- 🚀Bumped version to v0.7.3 [`602d80b`](https://git.odit.services/lfk/selfservice/commit/602d80bd14c4bd00a24b746be1e74d9e41af0445)
- Merge pull request 'Button fixes bugfix/42-button_links' (#43) from bugfix/42-button_links into dev [`45ee4ab`](https://git.odit.services/lfk/selfservice/commit/45ee4ab81260adf5b938d9f5359d256cce879acb)
- Removed useless register now button [`1102d29`](https://git.odit.services/lfk/selfservice/commit/1102d29c0e174b7a34fc4d3e6fe32d2dfb276765)
- Fixed register button link [`020c310`](https://git.odit.services/lfk/selfservice/commit/020c310865912b8f0752069e1c7e2adf71ab9835)
#### [0.7.2](https://git.odit.services/lfk/selfservice/compare/0.7.1...0.7.2)
> 14 April 2021
- 🚀Bumped version to v0.7.2 [`1a3af20`](https://git.odit.services/lfk/selfservice/commit/1a3af200dd41c8cc4271690ed72bef911901ce54)
- Document generation hotfix 🐞 [`b74bea0`](https://git.odit.services/lfk/selfservice/commit/b74bea03401c672ae774aaddc6da5beb67e2890e)
#### [0.7.1](https://git.odit.services/lfk/selfservice/compare/0.7.0...0.7.1)
> 13 April 2021
- Merge pull request 'bugfix/31-env-js-linking-ci' (#41) from bugfix/31-env-js-linking-ci into dev [`#31`](https://git.odit.services/lfk/selfservice/issues/31)
- ⏫ dependency bump [`ad13bae`](https://git.odit.services/lfk/selfservice/commit/ad13bae068416bed10d00e6887a05d580a836482)
- 🚀Bumped version to v0.7.1 [`b0172c5`](https://git.odit.services/lfk/selfservice/commit/b0172c500b0613209ac44e61023043065b3854b0)
- added 'yarn postbuild' script for fixing env.js in dist/index.html [`51d058b`](https://git.odit.services/lfk/selfservice/commit/51d058bf966c3dcb064562e6bf696a748d0cd148)
#### [0.7.0](https://git.odit.services/lfk/selfservice/compare/0.6.1...0.7.0)
> 6 April 2021
- 🚀Bumped version to v0.7.0 [`152e741`](https://git.odit.services/lfk/selfservice/commit/152e74190d13d30110d494a9062f868390ca19b3)
- Merge pull request 'Donation list feature/39-donation_list' (#40) from feature/39-donation_list into dev [`4c83e2e`](https://git.odit.services/lfk/selfservice/commit/4c83e2e738a075354383dca4d500808f761247d2)
- Added total to bottom of page [`89820d4`](https://git.odit.services/lfk/selfservice/commit/89820d44501793365248b8e778522cdc188afa70)
- Sorted translations 🌍 [`cb1b9d3`](https://git.odit.services/lfk/selfservice/commit/cb1b9d330b28f11cceed9691aee4ccee5246d346)
- Added basic sponsoring table [`f141130`](https://git.odit.services/lfk/selfservice/commit/f141130db5ede60a623747f4e324f66259e5bc75)
- Added translations 🌍 [`d713fbe`](https://git.odit.services/lfk/selfservice/commit/d713fbef94e75fbbc62254ea8f0ca50dc4e93d79)
- Now w/ formatted currency amount [`815a36f`](https://git.odit.services/lfk/selfservice/commit/815a36f20271f47f49c3814b001c3404d43113cd)
- Fixed spaces in name [`baa6da3`](https://git.odit.services/lfk/selfservice/commit/baa6da3dd06c493fccc61945b9bcbd9b2e79d910)
- Updated env description [`5a123b0`](https://git.odit.services/lfk/selfservice/commit/5a123b0cf89f49d450becbbc03b28c5bb6416b7c)
- added distance formatting [`121022c`](https://git.odit.services/lfk/selfservice/commit/121022c8434484a363a3f2ea68aba4d8ef7cad2d)
#### [0.6.1](https://git.odit.services/lfk/selfservice/compare/0.6.0...0.6.1) #### [0.6.1](https://git.odit.services/lfk/selfservice/compare/0.6.0...0.6.1)
> 6 April 2021
- 🚀Bumped version to v0.6.1 [`f5ae214`](https://git.odit.services/lfk/selfservice/commit/f5ae2145df07413329f60c229d9571fd1de2ca79)
- Fixed imprint/privacy default links [`96c0e56`](https://git.odit.services/lfk/selfservice/commit/96c0e5698697361e65c5aa80c9a0aada5c3d5f30) - Fixed imprint/privacy default links [`96c0e56`](https://git.odit.services/lfk/selfservice/commit/96c0e5698697361e65c5aa80c9a0aada5c3d5f30)
#### [0.6.0](https://git.odit.services/lfk/selfservice/compare/0.5.1...0.6.0) #### [0.6.0](https://git.odit.services/lfk/selfservice/compare/0.5.1...0.6.0)

View File

@@ -1,9 +1,14 @@
FROM node:15.9.0-alpine3.13 FROM node:23.4.0-alpine3.20 AS build
# FROM registry.odit.services/hub/library/node:23.3.0-alpine3.20 AS build
# ARG NPM_REGISTRY_URL=https://registry.npmjs.org
WORKDIR /app WORKDIR /app
COPY . . COPY . .
RUN yarn # RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@9
RUN yarn build RUN npm i -g pnpm@9
RUN pnpm i --frozen-lockfile
RUN pnpm build
# final image # final image
FROM fholzer/nginx-brotli:v1.19.1 FROM registry.odit.services/library/nginx-brotli:3.15 AS final
COPY --from=0 /app/dist /usr/share/nginx/html COPY --from=build /app/dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./nginx.conf /etc/nginx/nginx.conf

View File

@@ -2,29 +2,8 @@
runner selfservice portal runner selfservice portal
## ⚡ Development
### Requirements
- Node.js v14.16.0 or newer
- yarn package manager >= v1.22.10 < 2
### Recommended Extensions
- will be automatically recommended via `./vscode/extensions.json`
- we also provide a config for i18n-ally in the `./vscode/` folder
### Fastest Dev Environment
- You can install the [Remote - Containers](https://github.com/Microsoft/vscode-remote-release) extension and use all recommended extensions and editor settings via the provided `./devcontainer/` config
### Manual Dev Environment
```
yarn && yarn dev --open
```
## 🔨 Environment config ## 🔨 Environment config
- copy the `/public/env.sample.js` file to `/public/env.js` - copy the `/public/env.sample.js` file to `/public/env.js`
- set the required environment variables - set the required environment variables
- `documentserver_key`: url to the [document server](https://git.odit.services/lfk/document-server) instance - `documentserver_key`: url to the [document server](https://git.odit.services/lfk/document-server) instance
- `baseurl`: url to the main lfk instance - WITH TRAILING SLASH - `baseurl`: url to the main lfk instance - WITH TRAILING SLASH
- see [@lfk/deployment](https://git.odit.services/lfk/deployment) for a complete deployment guide
- `baseurl_selfservice`: location of the selfservice instance - WITH TRAILING SLASH
- e.g. path: `/selfservice/`
- e.g. url: `https://example.com/selfservice/`

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon-lfk.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lauf für Kaya! - Selfservice</title> <title>Lauf für Kaya! - Selfservice</title>
</head> </head>

View File

@@ -7,15 +7,21 @@ http {
error_page 404 /index.html; error_page 404 /index.html;
root /usr/share/nginx/html; root /usr/share/nginx/html;
location / { location / {
rewrite /register/(.*) /$1 break; rewrite /register/(.*) /$1 break;
rewrite /profile/(.*) /$1 break; rewrite /profile/(.*) /$1 break;
try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html;
add_header Last-Modified $date_gmt;
add_header Cache-Control 'private no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
} }
location ~* \.(?:ico|css|gif|jpe?g|png)$ { location ~* \.(?:ico|css|gif|jpe?g|png)$ {
rewrite /register/(.*) /$1 break; rewrite /register/(.*) /$1 break;
rewrite /profile/(.*) /$1 break; rewrite /profile/(.*) /$1 break;
expires 1y; expires 1y;
add_header Pragma public; add_header Pragma public;
@@ -35,24 +41,24 @@ http {
gzip_buffers 16 8k; gzip_buffers 16 8k;
gzip_http_version 1.1; gzip_http_version 1.1;
gzip_types application/javascript gzip_types application/javascript
application/rss+xml application/rss+xml
application/vnd.ms-fontobject application/vnd.ms-fontobject
application/x-font application/x-font
application/x-font-opentype application/x-font-opentype
application/x-font-otf application/x-font-otf
application/x-font-truetype application/x-font-truetype
application/x-font-ttf application/x-font-ttf
application/x-javascript application/x-javascript
application/xhtml+xml application/xhtml+xml
application/xml application/xml
font/opentype font/opentype
font/otf font/otf
font/ttf font/ttf
image/svg+xml image/svg+xml
image/x-icon image/x-icon
text/css text/css
text/javascript text/javascript
text/plain text/plain
text/xml; text/xml;
} }
} }

View File

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

View File

@@ -1,50 +1,50 @@
{ {
"name": "@odit/lfk-selfservice", "name": "@odit/lfk-selfservice",
"version": "0.6.1", "version": "1.3.0",
"scripts": { "type": "module",
"dev": "vite", "scripts": {
"build": "vite build", "dev": "vite",
"release": "release-it --only-version" "build": "vite build",
}, "release": "release-it"
"dependencies": { },
"marked": "2.0.1", "dependencies": {
"redaxios": "0.4.1", "@fontsource/athiti": "5.2.5",
"toastify-js": "1.10.0", "@odit/lfk-client": "^0.0.1",
"validator": "13.5.2", "@tailwindcss/vite": "4.0.14",
"vue-i18n": "9.0.0", "bwip-js": "4.5.2",
"vue-toastification": "2.0.0-rc.1", "marked": "15.0.7",
"vue": "3.0.9", "redaxios": "0.5.1",
"vue-router": "4.0.5" "tailwindcss": "4.0.14",
}, "toastify-js": "1.12.0",
"devDependencies": { "validator": "13.12.0",
"@tailwindcss/jit": "0.1.18", "vue": "3.5.13",
"@tailwindcss/aspect-ratio": "0.2.0", "vue-i18n": "10.0.5",
"@tailwindcss/forms": "0.3.2", "vue-router": "4.5.0",
"@tailwindcss/line-clamp": "0.2.0", "vue-toastification": "2.0.0-rc.1"
"@tailwindcss/typography": "0.4.0", },
"@vitejs/plugin-vue": "1.2.1", "devDependencies": {
"@vue/compiler-sfc": "3.0.10", "@vitejs/plugin-vue": "5.2.3",
"autoprefixer": "10.2.5", "autoprefixer": "10.4.21",
"tailwindcss": "2.0.4", "release-it": "18.1.2",
"release-it": "14.5.0", "vite": "6.2.2",
"vite": "2.1.5" "vite-plugin-vue-devtools": "7.7.2"
}, },
"release-it": { "release-it": {
"git": { "git": {
"commit": true, "commit": true,
"requireCleanWorkingDir": false, "requireCleanWorkingDir": false,
"commitMessage": "🚀Bumped version to v${version}", "commitMessage": "🚀Bumped version to v${version}",
"requireBranch": "dev", "requireBranch": "dev",
"push": false, "push": true,
"tag": true, "tag": true,
"tagName": null, "tagName": null,
"tagAnnotation": "v${version}" "tagAnnotation": "v${version}"
}, },
"npm": { "npm": {
"publish": false "publish": false
}, },
"hooks": { "hooks": {
"after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order_i18n.js && git add src/locales" "after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order_i18n.js && git add src/locales"
} }
} }
} }

4148
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +0,0 @@
module.exports = {
plugins: {
'@tailwindcss/jit': {},
autoprefixer: {},
},
}

View File

@@ -1,12 +1,14 @@
const config = { const config = {
// required // required
documentserver_key: '', documentserver_key: "",
// required, with trailing slash // required, with trailing slash
baseurl: '', baseurl: "",
// optional, will fallback to /selfservice/ // optional, full url, will fallback to https://lauf-fuer-kaya.de/impressum
baseurl_selfservice: '/selfservice/', url_imprint: "",
// optional, will fallback to baseurl_selfservice/imprint // optional, full url, will fallback to https://lauf-fuer-kaya.de/datenschutz
url_imprint: '', url_privacy: "",
// optional, will fallback to baseurl_selfservice/privacy // full url (including fqdn)
url_privacy: '' baseurl_documentserver: "http://localhost:3000",
// optional, will fallback to code128
code_format: "ean13",
}; };

View File

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -1 +0,0 @@
TODO:

View File

@@ -1 +0,0 @@
TODO:

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -1,29 +0,0 @@
<template>
<section class="container px-4 py-32 mx-auto">
<div class="w-full mx-auto lg:w-1/3">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="h-20 feather feather-alert-triangle"
viewBox="0 0 24 24"
>
<path
d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0zM12 9v4M12 17h.01"
/>
</svg>
<p
class="mt-5 mb-3 text-xl font-bold text-black dark:text-gray-50 md:text-2xl"
>{{ $t('configuration_error') }}</p>
<p class="mb-3 text-base font-medium text-gray-700 dark:text-gray-400">
{{ $t('the_system_is_not_properly_configured_please_contact_the_system_administrator_for_help') }}
<br />
<br />
{{ $t('if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance') }}
</p>
</div>
</section>
</template>

View File

@@ -1,38 +1,21 @@
<template> <template>
<footer class="text-gray-400 bg-gray-900 body-font"> <footer class="p-8">
<div class="container px-5 py-8 mx-auto flex items-center sm:flex-row flex-col"> <p class="text-sm sm:py-2 sm:mt-0 mt-4 text-center md:text-left">
<p class="text-sm text-gray-400 sm:ml-4 sm:pl-4 sm:py-2 sm:mt-0 mt-4"> Lauf für Kaya! Selfservice<br>Copyright © 2025<br>proudly powered by
Lauf für Kaya! Selfservice - Copyright © 2021 + proudly powered by <a class="underline" target="_blank" rel="noopener,noreferrer"
<a href="https://odit.services?ref=lfk">ODIT.Services</a><br>
class="underline" <a target="_blank" rel="noopener,noreferrer" :href="[[imprint_url]]" class="underline">{{
target="_blank" $t('imprint') }}</a> <a target="_blank" rel="noopener,noreferrer" :href="[[privacy_url]]" class="underline">{{
rel="noopener,noreferrer" $t('privacy_policy') }}</a>
href="https://odit.services"
>ODIT.Services</a>
</p> </p>
<span class="inline-flex sm:ml-auto sm:mt-0 mt-4 justify-center sm:justify-start">
<a
target="_blank"
rel="noopener,noreferrer"
:href="[[imprint_url]]"
class="ml-3 text-gray-400 underline"
>Impressum</a>
<a
target="_blank"
rel="noopener,noreferrer"
:href="[[privacy_url]]"
class="ml-3 text-gray-400 underline"
>Datenschutzerklärung</a>
</span>
</div>
</footer> </footer>
</template> </template>
<script> <script>
export default { export default {
data() { data() {
return { return {
imprint_url: config.url_imprint || config.baseurl_selfservice + "imprint" imprint_url: config.url_imprint || "https://lauf-fuer-kaya.de/impressum"
, privacy_url: config.url_privacy || config.baseurl_selfservice + "privacy" , privacy_url: config.url_privacy || "https://lauf-fuer-kaya.de/datenschutz"
} }
}, },
} }

View File

@@ -1,30 +0,0 @@
<template>
<h1>{{ msg }}</h1>
<p>
<a href="https://vitejs.dev/guide/features.html" target="_blank">Vite Documentation</a> |
<a href="https://v3.vuejs.org/" target="_blank">Vue 3 Documentation</a>
</p>
<button @click="state.count++">count is: {{ state.count }}</button>
<p>
Edit
<code>components/HelloWorld.vue</code> to test hot module replacement.
</p>
</template>
<script setup>
import { defineProps, reactive } from 'vue'
defineProps({
msg: String
})
const state = reactive({ count: 0 })
</script>
<style scoped>
a {
color: #42b983;
}
</style>

View File

@@ -1,109 +0,0 @@
<template>
<div class="min-h-screen flex items-center justify-center">
<div class="max-w-md w-full py-12 px-6">
<img class="mx-auto h-24 w-auto" src="/favicon.png" alt="" />
<h1 class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center">Lauf für Kaya! - Registrieren</h1>
<p
class="mx-auto leading-relaxed text-base text-center"
>Bitte anmelden...</p>
<div class="mt-5">
<div class="rounded-md shadow-sm">
<div>
<input
aria-label="E-Mail Adresse"
name="email"
type="email"
required
class="border-gray-300 placeholder-gray-500 appearance-none rounded-none relative block w-full px-3 py-2 border text-gray-900 rounded-t-md focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm"
placeholder="E-Mail Adresse"
v-model="mail"
/>
</div>
<div class="-mt-px relative">
<input
aria-label="Passwort"
name="password"
type="password"
required
class="border-gray-300 placeholder-gray-500 appearance-none rounded-none relative block w-full px-3 py-2 border text-gray-900 rounded-b-md focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm"
placeholder="Passwort"
/>
<div class="absolute inset-y-0 right-0 pr-3 flex items-center text-sm">
<a href="./reset" class="text-gray-900 underline">Passwort vergessen?</a>
</div>
</div>
</div>
<div class="mt-5">
<button
v-if="loading === false"
@click="login"
type="submit"
class="relative block w-full py-2 px-3 border border-transparent rounded-md font-semibold bg-gray-800 hover:bg-gray-700 focus:bg-gray-900 focus:outline-none focus:shadow-outline sm:text-sm text-white"
>
<span class="absolute left-0 inset-y pl-3">
<svg class="h-5 w-5 text-gray-500" fill="currentColor" viewBox="0 0 20 20">
<path
fill-rule="evenodd"
d="M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z"
clip-rule="evenodd"
/>
</svg>
</span>
Log in
</button>
<button
v-if="loading === true"
type="submit"
class="relative block w-full py-2 px-3 border border-transparent rounded-md font-semibold bg-yellow-500 sm:text-sm text-black"
>
<span class="absolute left-0 inset-y pl-3">
<svg class="h-5 w-5 text-gray-500" fill="currentColor" viewBox="0 0 20 20">
<path
fill-rule="evenodd"
d="M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z"
clip-rule="evenodd"
/>
</svg>
</span>
Logging in...
</button>
</div>
</div>
<div class="mt-6">
<div class="relative">
<div class="absolute inset-0 flex items-center">
<div class="w-full border-t border-gray-300"></div>
</div>
<div class="relative flex justify-center text-sm">
<span class="px-2 bg-white dark:bg-gray-900">Sie haben noch keinen Account?</span>
</div>
</div>
<div class="mt-6">
<a
href="./register"
class="block w-full text-center py-2 px-3 border border-gray-300 rounded-md font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm"
>Account erstellen</a>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import axios from "redaxios";
import Toastify from "toastify-js";
let mail = ref("");
let loading = ref(false);
function login() {
loading.value = true;
axios.get("").then((res) => {
loading.value = false;
Toastify({
text: "This is a toast",
duration: 3000,
}).showToast();
});
}
</script>

View File

@@ -1,109 +0,0 @@
<template>
<div class="min-h-screen flex items-center justify-center">
<div class="max-w-md w-full py-12 px-6">
<!-- <img class="mx-auto h-8 w-auto" src="/img/tailwindui-logo.svg" alt="" /> -->
<h1 class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center">Login</h1>
<p
class="mx-auto leading-relaxed text-base text-center"
>Bitte anmelden...</p>
<div class="mt-5">
<div class="rounded-md shadow-sm">
<div>
<input
aria-label="E-Mail Adresse"
name="email"
type="email"
required
class="border-gray-300 placeholder-gray-500 appearance-none rounded-none relative block w-full px-3 py-2 border text-gray-900 rounded-t-md focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm"
placeholder="E-Mail Adresse"
v-model="mail"
/>
</div>
<div class="-mt-px relative">
<input
aria-label="Passwort"
name="password"
type="password"
required
class="border-gray-300 placeholder-gray-500 appearance-none rounded-none relative block w-full px-3 py-2 border text-gray-900 rounded-b-md focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm"
placeholder="Passwort"
/>
<div class="absolute inset-y-0 right-0 pr-3 flex items-center text-sm">
<a href="./reset" class="text-gray-900 underline">Passwort vergessen?</a>
</div>
</div>
</div>
<div class="mt-5">
<button
v-if="loading === false"
@click="login"
type="submit"
class="relative block w-full py-2 px-3 border border-transparent rounded-md font-semibold bg-gray-800 hover:bg-gray-700 focus:bg-gray-900 focus:outline-none focus:shadow-outline sm:text-sm text-white"
>
<span class="absolute left-0 inset-y pl-3">
<svg class="h-5 w-5 text-gray-500" fill="currentColor" viewBox="0 0 20 20">
<path
fill-rule="evenodd"
d="M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z"
clip-rule="evenodd"
/>
</svg>
</span>
Log in
</button>
<button
v-if="loading === true"
type="submit"
class="relative block w-full py-2 px-3 border border-transparent rounded-md font-semibold bg-yellow-500 sm:text-sm text-black"
>
<span class="absolute left-0 inset-y pl-3">
<svg class="h-5 w-5 text-gray-500" fill="currentColor" viewBox="0 0 20 20">
<path
fill-rule="evenodd"
d="M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z"
clip-rule="evenodd"
/>
</svg>
</span>
Logging in...
</button>
</div>
</div>
<div class="mt-6">
<div class="relative">
<div class="absolute inset-0 flex items-center">
<div class="w-full border-t border-gray-300"></div>
</div>
<div class="relative flex justify-center text-sm">
<span class="px-2 bg-white dark:bg-gray-900">Sie haben noch keinen Account?</span>
</div>
</div>
<div class="mt-6">
<a
href="./register"
class="block w-full text-center py-2 px-3 border border-gray-300 rounded-md font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm"
>Account erstellen</a>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import axios from "redaxios";
import Toastify from "toastify-js";
let mail = ref("");
let loading = ref(false);
function login() {
loading.value = true;
axios.get("").then((res) => {
loading.value = false;
Toastify({
text: "This is a toast",
duration: 3000,
}).showToast();
});
}
</script>

View File

@@ -1,58 +1,81 @@
{ {
"access_is_only_provided_via_your_email_link": "Der Zugang erfolgt nur über den Link, den Sie bei der Registrierung erhalten haben.", "access_is_only_provided_via_your_email_link": "Der Zugang erfolgt über den Link, den Sie bei der Registrierung erhalten haben.",
"already_have_an_account": "Sie haben bereits einen Account?", "add_sponsoring": "Sponsoring hinzufügen",
"amount_per_kilometer_in_eur": "Betrag pro Kilometer (in €)", "alle_daten_geloescht": "Alle Daten gelöscht!",
"apartment_suite_etc": "Addresszeile 2", "already_registered": "bereits registriert...",
"cancel_keep_my_data": "Abbrechen, meine Daten behalten", "amount_per_kilometer_in_eur": "Betrag pro Kilometer (in €)",
"configuration_error": "Konfigurationsfehler", "apartment_suite_etc": "Addresszeile 2",
"confirm_delete_all_of_my_data": "Bestätigung, meine gesamten Daten löschen", "buergerlauf": "Bürgerlauf",
"confirm_personal_data": "Hiermit bestätige ich die Vollständigkeit und Richtigkeit der oben genannten Angaben", "cancel_keep_my_data": "Abbrechen, meine Daten behalten",
"current_total_amount_in_eur": "Aktueller Gesamtbetrag (in €)", "configuration_error": "Konfigurationsfehler",
"delete_all_of_my_data": "Meine gesamten Daten löschen", "confirm_delete_all_of_my_data": "Bestätigen, meine Daten löschen",
"delete_my_data": "Meine Daten löschen", "confirm_personal_data": "Hiermit bestätige ich die Vollständigkeit und Richtigkeit der oben genannten Angaben",
"deletion_in_progress": "Daten werden gelöscht...", "current_total_amount_in_eur": "Aktueller Gesamtbetrag (in €)",
"distance": "Distanz", "delete_my_data": "Meine Daten löschen",
"download_certificate": "Urkunde herunterladen", "distance": "Distanz",
"e_mail_adress": "E-Mail Adresse", "download_certificate": "Urkunde herunterladen",
"go_to_login": "Zum Login", "download_registrationcode": "Registrierungscode herunterladen",
"i_accept": "Ich habe die ", "e_mail_adress": "E-Mail Adresse",
"i_accept_end": "gelesen und akzeptiert.", "e_mail_des_sponsors": "E-Mail des Sponsors",
"if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "Wenn Sie der Systemadministrator sind, finden Sie Konfigurationsanweisungen in der offiziellen Produktdokumentation / README.", "error_requesting_the_login_link": "Fehler beim Anfordern des Login-Links...",
"imprint": "Impressum", "first_lap": "👏 erste Runde",
"lap_time": "Rundenzeit", "hinweis": "Hinweis:",
"lap_times": "Rundenzeiten", "i_accept": "Ich habe die ",
"lost_your_registration_mail": "Haben Sie Ihre Registrierungsmail verloren?", "i_accept_end": "gelesen und akzeptiert.",
"main_page_text": "Hier können Sie sich für den Lauf Für Kaya! registrieren oder ihr Läuferprofil verwalten.", "if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "Wenn Sie der Systemadministrator sind, finden Sie Konfigurationsanweisungen in der offiziellen Produktdokumentation / README.",
"mittelname": "Mittelname", "imprint": "Impressum",
"nachname": "Nachname", "invalid_input_phone_number_should_be_international_format": "ungültige Eingabe... Die Telefonnummer sollte ein internationales Format haben",
"no_laps_scans_were_recorded_yet": "Es wurden noch keine Runden / Scans aufgezeichnet ...", "lap_time": "Rundenzeit",
"no_sponsorings_for_you_were_recorded_yet": "Es gibt noch keine Sponsorings für dich", "lap_times": "Rundenzeiten",
"not_registered_yet": "Noch nicht registriert?", "login_link_gesendet_an_user_email_value": "Login-Link gesendet an ",
"organization": "Organisation", "login_link_is_requested": "Login-Link wird angefordert...",
"ort": "Ort", "lost_your_registration_mail": "Brauchen Sie einen neuen Login-Link?",
"phone_number": "Telefonnummer", "main_page_text": "Hier können Sie sich für den Lauf Für Kaya! registrieren oder ihr Läuferprofil verwalten.",
"please_provide_a_valid_zipcode": "Bitte geben Sie eine gültige Postleitzahl an...", "mittelname": "Mittelname",
"please_provide_valid_mail": "Bitte geben Sie eine gültige E-Mail Adresse an", "nachname": "Nachname",
"plz": "PLZ", "nachname_des_sponsors": "Nachname des Sponsors",
"privacy_policy": "Datenschutzerklärung", "no_laps_scans_were_recorded_yet": "Noch keine Runden aufgezeichnet ...",
"profile": "Profil", "no_sponsorings_for_you_were_recorded_yet": "Es gibt noch keine Sponsorings für dich",
"provide_address": "Adresse angeben?", "not_registered_yet": "Noch nicht registriert?",
"register": { "organization": "Organisation",
"register_now": "Jetzt für den Lauf für Kaya! 2021 registrieren." "ort": "Ort",
}, "phone_number": "Telefonnummer",
"register_now": "Jetzt registrieren!", "please_provide_a_valid_zipcode": "Bitte geben Sie eine gültige Postleitzahl an...",
"register_now_small": "Jetzt registrieren", "please_provide_valid_mail": "Bitte geben Sie eine gültige E-Mail Adresse an",
"registrieren": "Registrieren", "plz": "PLZ",
"resend_the_registration_mail": "Registrierungsmail erneut versenden", "privacy_policy": "Datenschutzerklärung",
"save_changes": "Änderungen speichern", "profil_konnte_nicht_geladen_werden": "Profil konnte nicht geladen werden...",
"sponsoring": "Sponsoring", "profil_konnte_nicht_geloescht_werden": "Profil konnte nicht gelöscht werden...",
"strasse": "Straße", "profil_wird_geloescht": "Profil wird gelöscht...",
"the_system_is_not_properly_configured_please_contact_the_system_administrator_for_help": "Das System ist nicht richtig konfiguriert. Bitte wenden Sie sich an den Systemadministrator, um Hilfe zu erhalten.", "profile": "Profil",
"this_is_not_a_valid_international_phone_number": "Dies ist keine gültige internationale Telefonnummer", "provide_address": "Adresse angeben?",
"tos": "AGBs", "register": {
"view_my_data": "Meine Läuferdaten einsehen", "register_now": "Jetzt für den Lauf für Kaya! 2025 registrieren."
"vorname": "Vorname", },
"you_have_been_registered": "Sie wurden registriert!", "register_now": "Jetzt registrieren!",
"you_have_not_provided_a_valid_access_key": "Sie haben keinen gültigen Zugangsschlüssel angegeben...", "register_now_small": "Jetzt registrieren",
"total": "Gesamt" "registration_local_phone_nr": "Wenn Sie eine Telefonnummer ohne Vorwahl angeben, wird Sie als deutsche Telefonnummer gewertet",
} "registration_running": "Registrierung läuft...",
"registrationcode": "Registrierungscode",
"registrieren": "Registrieren",
"registriert": "Registriert",
"registrierungscode_generiert": "Registrierungscode generiert!",
"registrierungscode_wird_generiert": "Registrierungscode wird generiert...",
"resend_the_registration_mail": "Login-Link anfordern",
"sponsor_add_agree": "Mit dem Absenden bestätige ich, dass der Sponsor mit der Übermittlung seiner Daten einverstanden ist und ich dessen Berechtigung habe",
"sponsoring": "Sponsoring",
"sponsoring_pro_kilometer_in_eur": "Sponsoring pro Kilometer (in €)",
"strasse": "Straße",
"telefonnummer_des_sponsors": "Telefonnummer des Sponsors",
"the_system_is_not_properly_configured_please_contact_the_system_administrator_for_help": "Das System ist nicht richtig konfiguriert. Bitte wenden Sie sich an den Systemadministrator, um Hilfe zu erhalten.",
"this_is_not_a_valid_international_phone_number": "Dies ist keine gültige internationale Telefonnummer",
"total": "Gesamt",
"total_distance": "Gesamt-Distanz",
"urkunde_generiert": "Urkunde generiert!",
"urkunde_konnte_nicht_generiert_werden": "Urkunde konnte nicht generiert werden...",
"urkunde_wird_generiert": "Urkunde wird generiert...",
"view_my_data": "Meine Läuferdaten einsehen",
"vorname": "Vorname",
"vorname_des_sponsors": "Vorname des Sponsors",
"z_b_1eur_oder_0_50eur": "z.B. 1€ ODER 0,50€"
}

View File

@@ -1,58 +1,81 @@
{ {
"access_is_only_provided_via_your_email_link": "Access is only provided via the link you received upon registration.", "access_is_only_provided_via_your_email_link": "Access is only provided via the link you received upon registration.",
"all_data_deleted": "All Data deleted!", "add_sponsoring": "New Sponsoring",
"already_have_an_account": "Already have an account?", "alle_daten_geloescht": "all data deleted!",
"amount_per_kilometer_in_eur": "Amount per kilometer (in €)", "already_registered": "already registered...",
"apartment_suite_etc": "Apartment, suite, etc.", "amount_per_kilometer_in_eur": "Amount per kilometer (in €)",
"cancel_keep_my_data": "Cancel, keep my data", "apartment_suite_etc": "Apartment, suite, etc.",
"configuration_error": "Configuration error", "buergerlauf": "Public Run",
"confirm_delete_all_of_my_data": "Confirm, delete all of my data", "cancel_keep_my_data": "Cancel, keep my data",
"confirm_personal_data": "I hereby confirm that the above information is complete and correct", "configuration_error": "Configuration error",
"current_total_amount_in_eur": "Current total amount (in €)", "confirm_delete_all_of_my_data": "Confirm, delete all of my data",
"delete_my_data": "Delete my data", "confirm_personal_data": "I hereby confirm that the above information is complete and correct",
"deletion_in_progress": "Deletion in progress...", "current_total_amount_in_eur": "Current total amount (in €)",
"distance": "Distance", "delete_my_data": "Delete my data",
"download_certificate": "Download certificate", "distance": "Distance",
"e_mail_adress": "mail address", "download_certificate": "Download certificate",
"go_to_login": "Go To Login", "download_registrationcode": "Download registrationcode",
"i_accept": "I have read and accepted the ", "e_mail_adress": "mail address",
"i_accept_end": "", "e_mail_des_sponsors": "E-Mail of the Sponsor",
"if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "If you are the system administrator, please refer to the official product documentation/ README for configuration guidance.", "error_requesting_the_login_link": "Error requesting the login link...",
"imprint": "Imprint", "first_lap": "👏 first lap",
"lap_time": "Lap time", "hinweis": "Note:",
"lap_times": "Lap times", "i_accept": "I have read and accepted the ",
"lost_your_registration_mail": "Lost your registration mail?", "i_accept_end": "",
"main_page_text": "Here you can register for the Lauf Für Kaya! or manage your runner profile.", "if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "If you are the system administrator, please refer to the official product documentation/ README for configuration guidance.",
"mittelname": "Middlename", "imprint": "Imprint",
"nachname": "Lastname", "invalid_input_phone_number_should_be_international_format": "invalid input... phone number should be international format",
"no_laps_scans_were_recorded_yet": "No laps/ scans were recorded yet...", "lap_time": "Lap time",
"no_sponsorings_for_you_were_recorded_yet": "No sponsorings for you were recorded yet...", "lap_times": "Lap times",
"not_registered_yet": "Not registered yet?", "login_link_gesendet_an_user_email_value": "Login-Link sent to ",
"organization": "Organization", "login_link_is_requested": "Login link is requested...",
"ort": "City", "lost_your_registration_mail": "Lost your registration mail?",
"phone_number": "Phone Number", "main_page_text": "Here you can register for the Lauf Für Kaya! or manage your runner profile.",
"please_provide_a_valid_zipcode": "Please provide a valid zipcode...", "mittelname": "Middlename",
"please_provide_valid_mail": "Please provide a valid mail address.", "nachname": "Lastname",
"plz": "zipcode", "nachname_des_sponsors": "last name of the sponsor",
"privacy_policy": "Privacy Policy", "no_laps_scans_were_recorded_yet": "No laps/ scans were recorded yet...",
"profile": "Profile", "no_sponsorings_for_you_were_recorded_yet": "No sponsorings for you were recorded yet...",
"provide_address": "Provide a postal address?", "not_registered_yet": "Not registered yet?",
"register": { "organization": "Organization",
"register_now": "Register now for Lauf für Kaya! 2021." "ort": "City",
}, "phone_number": "Phone Number",
"register_now": "Register now!", "please_provide_a_valid_zipcode": "Please provide a valid zipcode...",
"register_now_small": "Register now", "please_provide_valid_mail": "Please provide a valid mail address.",
"registrieren": "Register Now", "plz": "zipcode",
"resend_the_registration_mail": "Resend the registration mail", "privacy_policy": "Privacy Policy",
"save_changes": "Save changes", "profil_konnte_nicht_geladen_werden": "could not load profile...",
"sponsoring": "Sponsoring", "profil_konnte_nicht_geloescht_werden": "couold not delete profile...",
"strasse": "Street/ Block", "profil_wird_geloescht": "deleting profile...",
"the_system_is_not_properly_configured_please_contact_the_system_administrator_for_help": "The system is not properly configured. Please contact the system administrator for help.", "profile": "Profile",
"this_is_not_a_valid_international_phone_number": "This is not a valid international phone number", "provide_address": "Provide a postal address?",
"tos": "Terms of Service", "register": {
"view_my_data": "View my data", "register_now": "Register now for Lauf für Kaya! 2025."
"vorname": "Firstname", },
"you_have_been_registered": "You have been registered!", "register_now": "Register now!",
"you_have_not_provided_a_valid_access_key": "You have not provided a valid access key...", "register_now_small": "Register now",
"total": "Total" "registration_local_phone_nr": "If you enter a phone number without an country code, it will be treated as a German phone number",
} "registration_running": "registration is running...",
"registrationcode": "Registration Code",
"registrieren": "Register Now",
"registriert": "Registered",
"registrierungscode_generiert": "created registration code!",
"registrierungscode_wird_generiert": "creating registration code...",
"resend_the_registration_mail": "Send me a login link",
"sponsor_add_agree": "By submitting, I confirm that the sponsor agrees to the transmission of his data and that I have his authorization",
"sponsoring": "Sponsoring",
"sponsoring_pro_kilometer_in_eur": "Sponsoring per Kilometer (in €)",
"strasse": "Street/ Block",
"telefonnummer_des_sponsors": "Sponsor's phone number",
"the_system_is_not_properly_configured_please_contact_the_system_administrator_for_help": "The system is not properly configured. Please contact the system administrator for help.",
"this_is_not_a_valid_international_phone_number": "This is not a valid international phone number",
"total": "Total",
"total_distance": "total distance",
"urkunde_generiert": "created certificate",
"urkunde_konnte_nicht_generiert_werden": "could not create your certificate...",
"urkunde_wird_generiert": "creating certificate...",
"view_my_data": "View my data",
"vorname": "Firstname",
"vorname_des_sponsors": "Sponsor's first name",
"z_b_1eur_oder_0_50eur": "e.g. €1 OR €0.50"
}

View File

@@ -2,6 +2,14 @@ import { createApp } from 'vue';
import './tailwind.css'; import './tailwind.css';
import 'toastify-js/src/toastify.css'; import 'toastify-js/src/toastify.css';
import 'vue-toastification/dist/index.css'; import 'vue-toastification/dist/index.css';
// import '@fontsource/athiti';
import '@fontsource/athiti/200.css';
import '@fontsource/athiti/300.css';
import '@fontsource/athiti/400.css';
import '@fontsource/athiti/500.css';
import '@fontsource/athiti/600.css';
import '@fontsource/athiti/700.css';
//
import App from './App.vue'; import App from './App.vue';
import { routes } from './routes.js'; import { routes } from './routes.js';
import { createRouter, createWebHistory } from 'vue-router'; import { createRouter, createWebHistory } from 'vue-router';

View File

@@ -1,24 +1,17 @@
// import EnvError from './components/EnvError.vue'; import Home from "./views/Home.vue";
import Home from './views/Home.vue'; import Register from "./views/Register.vue";
import Imprint from './views/Imprint.vue'; import Profile from "./views/Profile.vue";
import Privacy from './views/Privacy.vue'; import ProfileNone from "./views/ProfileNone.vue";
import Register from './views/Register.vue';
import Profile from './views/Profile.vue';
import ProfileNone from './views/ProfileNone.vue';
console.log(config); // console.log(config);
/** @type {import('vue-router').RouterOptions['routes']} */ /** @type {import('vue-router').RouterOptions['routes']} */
export const routes = [ export const routes = [
{ path: config.baseurl_selfservice + '', component: Home }, { path: "/", component: Home },
{ path: config.baseurl_selfservice + 'imprint', component: Imprint }, { path: "/register", component: Register },
{ path: config.baseurl_selfservice + 'imprint/', component: Imprint }, { path: "/register/", component: Register },
{ path: config.baseurl_selfservice + 'privacy', component: Privacy }, { path: "/register/:token", component: Register, props: true },
{ path: config.baseurl_selfservice + 'privacy/', component: Privacy }, { path: "/profile", component: Profile },
{ path: config.baseurl_selfservice + 'register', component: Register }, { path: "/profile/", component: ProfileNone },
{ path: config.baseurl_selfservice + 'register/', component: Register }, { path: "/profile/:token", component: Profile, props: true },
{ path: config.baseurl_selfservice + 'register/:token', component: Register, props: true },
{ path: config.baseurl_selfservice + 'profile', component: Profile },
{ path: config.baseurl_selfservice + 'profile/', component: ProfileNone },
{ path: config.baseurl_selfservice + 'profile/:token', component: Profile, props: true }
]; ];

View File

@@ -1,3 +1,8 @@
@import 'tailwindcss/base'; @import "tailwindcss";
@import 'tailwindcss/components'; @custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
@import 'tailwindcss/utilities';
* {
font-family: Athiti;
}

View File

@@ -1,23 +1,20 @@
<template> <template>
<div class="bg-cover bg-fixed m-0 h-screen" style="background-image: url('./background.jpg');"> <div class="bg-cover bg-fixed m-0 h-screen text-white"
<section class="container px-4 py-24 mx-auto"> v-bind:style='{ backgroundImage: "url(" + background_base64 + ")", }'>
<section class="px-4 py-24 mx-auto">
<div class="w-full mx-auto text-center"> <div class="w-full mx-auto text-center">
<img src="/favicon.png" class="h-32 mx-auto" /> <img src="/favicon-lfk.png" class="h-32 mx-auto" />
<h1 <h1
class="mb-6 text-4xl font-extrabold leading-none tracking-normal text-white md:text-6xl md:tracking-tight" class="mb-6 text-4xl font-extrabold leading-none tracking-normal md:text-6xl md:tracking-tight">
>Lauf Für Kaya!</h1> Lauf Für Kaya!<br>2025</h1>
<p class="px-0 mb-6 text-lg text-gray-100 md:text-xl lg:px-24">Selfservice Portal</p> <h2 class="mb-6 text-xl font-bold leading-none tracking-normal md:text-3xl md:tracking-tight">
<p class="px-0 mb-6 text-md text-gray-100 lg:px-24">{{ $t('main_page_text') }}</p> Selfservice Portal</h2>
<div class="mt-6 sm:flex place-content-center"> <p class="px-0 mb-6 text-md lg:px-24 font-medium">{{ $t('main_page_text') }}</p>
<a <a class="w-full block mx-auto md:w-3/4 px-6 py-3 border border-transparent text-base font-semibold rounded-md text-gray-900 bg-white shadow-sm hover:text-gray-600 focus:outline-none focus:text-gray-600 xl:text-lg xl:py-4"
class="w-full sm:w-auto inline-flex px-6 py-3 border border-transparent text-base font-semibold rounded-md text-gray-900 bg-white shadow-sm hover:text-gray-600 focus:outline-none focus:text-gray-600 transition ease-in-out duration-150 xl:text-lg xl:py-4" href="/register/">{{ $t('register_now') }}</a>
href="./register/" <a href="/profile/"
>{{ $t('register_now') }}</a> class="md:mt-4 mt-2 w-full block mx-auto md:w-3/4 px-6 py-3 text-base font-semibold rounded-md bg-gray-800 shadow-sm hover:bg-gray-700 focus:outline-none focus:bg-gray-700 xl:text-lg xl:py-4 border border-gray-400">{{
<a $t('view_my_data') }}</a>
href="./profile/"
class="mt-4 sm:ml-4 sm:mt-0 w-full sm:w-auto inline-flex px-6 py-3 border border-transparent text-base font-semibold rounded-md text-white bg-gray-800 shadow-sm hover:bg-gray-700 focus:outline-none focus:bg-gray-700 transition ease-in-out duration-150 xl:text-lg xl:py-4"
>{{ $t('view_my_data') }}</a>
</div>
</div> </div>
</section> </section>
</div> </div>
@@ -25,6 +22,6 @@
</template> </template>
<script setup> <script setup>
import background_base64 from "../assets/background.jpg?inline";
import Footer from "@/components/Footer.vue"; import Footer from "@/components/Footer.vue";
console.log(config);
</script> </script>

View File

@@ -1,38 +0,0 @@
<template>
<section class="container px-4 py-24 mx-auto">
<div class="simplecontent">
<div class="mb-24 text-left md:text-center">
<h1
class="mb-4 text-4xl font-bold leading-tight text-gray-900 dark:text-gray-50 md:text-5xl"
>{{$t('imprint')}}</h1>
</div>
<div class="mx-auto prose" v-html="content"></div>
</div>
</section>
</template>
<style src="../simple.css">
</style>
<script>
import marked from "marked";
export default {
data() {
return {
content: ""
}
},
async beforeMount() {
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
let md = "";
try {
md = await fetch(`/imprint_${browserlocale}.md`);
} catch (error) {
try {
md = await fetch(`/imprint_en.md`);
} catch (error) {
md = "Error loading Imprint";
}
}
this.content = marked(await md.text());
},
}
</script>

View File

@@ -1,38 +0,0 @@
<template>
<section class="container px-4 py-24 mx-auto">
<div class="simplecontent">
<div class="mb-24 text-left md:text-center">
<h1
class="mb-4 text-4xl font-bold leading-tight text-gray-900 dark:text-gray-50 md:text-5xl"
>{{ $t('privacy_policy') }}</h1>
</div>
<div class="mx-auto prose" v-html="content"></div>
</div>
</section>
</template>
<style src="../simple.css">
</style>
<script>
import marked from "marked";
export default {
data() {
return {
content: ""
}
},
async beforeMount() {
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
let md = "";
try {
md = await fetch(`/privacy_${browserlocale}.md`);
} catch (error) {
try {
md = await fetch(`/privacy_en.md`);
} catch (error) {
md = "Error loading Privacy Policy";
}
}
this.content = marked(await md.text());
},
}
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -1,104 +1,92 @@
<template> <template>
<div class="min-h-screen flex items-center justify-center"> <div class="min-h-screen flex items-center justify-center">
<div class="max-w-md w-full py-12 px-6"> <div class="max-w-md w-full py-12 px-6">
<img class="mx-auto h-24 w-auto" src="/favicon.png" alt /> <img class="mx-auto h-24 w-auto" src="/favicon-lfk.png" alt />
<h1 <h1 class="sm:text-3xl text-2xl font-semibold title-font mb-4 text-center">Lauf für Kaya! - {{
class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center" $t('profile')
>Lauf für Kaya! - {{ $t('profile') }}</h1> }}</h1>
<p class="mx-auto leading-relaxed text-base text-center"> <p class="mx-auto leading-relaxed text-base text-center">
{{ $t('you_have_not_provided_a_valid_access_key') }} {{ $t('access_is_only_provided_via_your_email_link') }}
<br /> </p>
{{ $t('access_is_only_provided_via_your_email_link') }} <div class="mt-6">
</p> <div class="relative">
<div class="mt-6"> <div class="absolute inset-0 flex items-center">
<div class="relative"> <div class="w-full border-t border-gray-300"></div>
<div class="absolute inset-0 flex items-center"> </div>
<div class="w-full border-t border-gray-300"></div> <div class="relative flex justify-center text-sm">
</div> <span class="px-2 bg-white dark:bg-gray-900">{{ $t('lost_your_registration_mail') }}</span>
<div class="relative flex justify-center text-sm"> </div>
<span </div>
class="px-2 bg-white dark:bg-gray-900" <div class="mt-4">
>{{ $t('lost_your_registration_mail') }}</span> <label for="email_address" class="block font-medium">
</div> {{ $t('e_mail_adress') }}
</div> <span class="font-bold">*</span>
<div class="mt-4"> </label>
<label for="email_address" class="block font-medium"> <input v-model="user_email" name="email_address" id="email_address" autocomplete="email"
{{ $t('e_mail_adress') }} :placeholder="[[$t('e_mail_adress')]]" type="email"
<span class="font-bold">*</span> :class="{ 'border-red-500': (!isEmail(user_email)), 'border-green-300': (isEmail(user_email)) }"
</label> class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-2 bg-gray-50 text-gray-500 rounded-md p-2" />
<input <p v-if="!isEmail(user_email) && user_email !== ''" class="text-sm">{{
v-model="user_email" $t('please_provide_valid_mail')
name="email_address" }}</p>
id="email_address" </div>
autocomplete="off" <div class="mt-2">
:placeholder="[[$t('e_mail_adress')]]" <button :disabled="(!state.submit_enabled)"
type="email" :class="{ 'opacity-50': (!state.submit_enabled), 'cursor-not-allowed': (!state.submit_enabled) }"
:class="{ 'border-red-500': (!isEmail(user_email)), 'border-green-300': (isEmail(user_email)) }" @click="resendMail"
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-2 bg-gray-50 text-gray-500 rounded-md p-2" class="block w-full text-center py-2 px-3 border-2 border-gray-300 rounded-md p-1 dark:bg-gray-800 font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm">{{
/> $t('resend_the_registration_mail') }}</button>
<p </div>
v-if="!isEmail(user_email)" </div>
class="text-sm" <div class="mt-12">
>{{ $t('please_provide_valid_mail') }}</p> <div class="relative">
</div> <div class="absolute inset-0 flex items-center">
<div class="mt-2"> <div class="w-full border-t border-gray-300"></div>
<a </div>
:disabled="(!state.submit_enabled)" <div class="relative flex justify-center text-sm">
:class="{ 'opacity-50': (!state.submit_enabled), 'cursor-not-allowed': (!state.submit_enabled) }" <span class="px-2 bg-white dark:bg-gray-900">{{ $t('not_registered_yet') }}</span>
@click="resendMail" </div>
class="block w-full text-center py-2 px-3 border-2 border-gray-300 rounded-md p-1 dark:bg-gray-800 font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm" </div>
>{{ $t('resend_the_registration_mail') }}</a> <div class="mt-2">
</div> <a href="/register/"
</div> class="text-white block w-full text-center py-2 px-3 border-2 border-gray-300 rounded-md p-1 bg-blue-800 font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm">{{
<div class="mt-12"> $t('register_now_small') }}</a>
<div class="relative"> </div>
<div class="absolute inset-0 flex items-center"> </div>
<div class="w-full border-t border-gray-300"></div> </div>
</div> </div>
<div class="relative flex justify-center text-sm"> <Footer></Footer>
<span class="px-2 bg-white dark:bg-gray-900">{{ $t('not_registered_yet') }}</span> </template>
</div>
</div> <script setup>
<div class="mt-2"> import Footer from "@/components/Footer.vue";
<a import { runnerSelfServiceControllerRequestNewToken } from "@odit/lfk-client";
href="./register/" import isEmail from 'validator/es/lib/isEmail';
class="text-white block w-full text-center py-2 px-3 border-2 border-gray-300 rounded-md p-1 bg-blue-800 font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm" import { computed, reactive, ref } from "vue";
>{{ $t('register_now_small') }}</a> import { useI18n } from 'vue-i18n';
</div> import { TYPE, useToast } from "vue-toastification";
</div> const { t } = useI18n()
</div>
</div> let user_email = ref("");
</template> //
const state = reactive({
<script setup> org_name: "",
import { computed, ref, reactive, defineProps } from "vue"; org_teams: [],
import axios from "redaxios"; submit_enabled: computed(() => isEmail(user_email.value))
import isEmail from 'validator/es/lib/isEmail'; })
import isMobilePhone from 'validator/es/lib/isMobilePhone'; const toast = useToast();
import isPostalCode from 'validator/es/lib/isPostalCode'; function resendMail() {
import { useToast } from "vue-toastification"; if (isEmail(user_email.value)) {
toast(t('login_link_is_requested'));
let user_email = ref(""); const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
// runnerSelfServiceControllerRequestNewToken({ query: { locale: browserlocale, mail: user_email.value } }).then(({ data }) => {
const state = reactive({ console.log(data);
org_name: "", toast(t('login_link_gesendet_an_user_email_value') + user_email.value);
org_teams: [], })
submit_enabled: computed(() => isEmail(user_email.value)) .catch((error) => {
}) console.log(error);
const toast = useToast(); toast(t('error_requesting_the_login_link'), { type: TYPE.ERROR });
function resendMail() { });
if (isEmail(user_email.value)) { }
toast("sending password reset mail..."); }
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
axios.post(`${config.baseurl}api/runners/forgot?mail=${user_email.value}&locale=${browserlocale}`)
.then(({ data }) => {
console.log(data);
toast("sent password reset mail to " + user_email.value + "!");
})
.catch((error) => {
console.log(error);
toast("user does not exist...");
});
}
}
</script> </script>

View File

@@ -1,338 +1,488 @@
<template> <template>
<div class="min-h-screen flex items-center justify-center"> <div class="min-h-screen flex items-center justify-center" v-if="registrationState === 'registered'">
<div class="max-w-md w-full py-12 px-6"> <div class="max-w-md w-full py-12 px-6">
<img class="mx-auto h-24 w-auto" src="/favicon.png" alt /> <img class="mx-auto h-24 w-auto" src="/favicon-lfk.png" alt />
<h1 <h1 class="sm:text-3xl text-2xl font-semibold title-font mb-4 text-center">
class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center" Lauf für Kaya! - {{ $t('registriert') }}
>Lauf für Kaya! - {{ $t('registrieren') }}</h1> </h1>
<p class="mx-auto leading-relaxed text-base text-center">{{ $t('register.register_now') }}</p> <p class="mx-auto leading-relaxed text-base text-center">
<p Bitte klicken Sie zum Fortfahren auf den Link, den wir an
v-if="state.org_name !== ''" <b class="font-bold">{{ userdetails.mail }}</b> geschickt haben.
class="mx-auto leading-relaxed text-base text-center" </p>
>{{ $t('organization') }}: {{ state.org_name }}</p> </div>
<p </div>
v-if="state.org_name !== '' && state.org_teams.length > 0" <div class="min-h-screen flex items-center justify-center" v-else>
class="mx-auto leading-relaxed text-base text-center" <div class="max-w-md w-full py-12 px-6">
>Team:</p> <img class="mx-auto h-24 w-auto" src="/favicon-lfk.png" alt />
<select <h1 class="sm:text-3xl text-2xl font-semibold title-font mb-4 text-center">
v-model="org_team" Lauf für Kaya! - {{ $t("registrieren") }}
v-if="state.org_name !== '' && state.org_teams.length > 0" </h1>
class="w-full border bg-white rounded px-3 py-2 outline-none block mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray" <p class="mx-auto leading-relaxed text-base text-center font-medium">
> {{ $t("register.register_now") }}
<option v-for="t in state.org_teams" :key="t.id" :value="t.id">{{ t.name }}</option> </p>
</select> <p v-if="state.org_name !== ''" class="mx-auto leading-relaxed text-base text-center font-medium">
<p {{ $t("organization") }}: {{ state.org_name }}
v-if="state.org_name === ''" </p>
class="mx-auto leading-relaxed text-base text-center" <p v-if="state.org_name !== '' && state.org_teams.length > 0"
>Bürgerlauf</p> class="mx-auto leading-relaxed text-base text-center">
<div class="mt-4"> Team:
<label for="first_name" class="block font-medium"> </p>
{{ $t('vorname') }} <select v-model="org_team" v-if="state.org_name !== '' && state.org_teams.length > 0" class="
<span class="font-bold">*</span> w-full
</label> border
<input bg-white
v-model="userdetails.firstname" rounded
name="firstname" px-3
id="first_name" py-2
autocomplete="off" outline-none
:placeholder="[[$t('vorname')]]" block
type="text" mt-1
:class="{ 'border-red-500': (!userdetails.firstname.trim()), 'border-green-300': (userdetails.firstname.trim()) }" text-sm
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2" dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700
/> form-select
<!-- --> focus:border-purple-400 focus:outline-none focus:shadow-outline-purple
<label for="middle_name" class="block font-medium">{{ $t('mittelname') }}</label> dark:focus:shadow-outline-gray
<input ">
v-model="userdetails.middlename" <option v-for="t in state.org_teams" :key="t.id" :value="t.id">
name="middlename" {{ t.name }}
id="middle_name" </option>
autocomplete="off" </select>
:placeholder="[[$t('mittelname')]]" <p v-if="state.org_name === ''" class="mx-auto leading-relaxed text-base text-center">
type="text" {{ $t('buergerlauf') }}
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2" </p>
/> <div class="mt-4">
<!-- --> <label for="first_name" class="block font-semibold mt-2">
<label for="last_name" class="block font-medium"> {{ $t("vorname") }}
{{ $t('nachname') }} <span class="font-bold">*</span>
<span class="font-bold">*</span> </label>
</label> <input v-model="userdetails.firstname" name="firstname" id="first_name" autocomplete="off"
<input :placeholder="[[$t('vorname')]]" type="text" :class="{
v-model="userdetails.lastname" 'border-red-500': !userdetails.firstname.trim(),
name="lastname" 'border-green-300': userdetails.firstname.trim(),
id="last_name" }" class="
autocomplete="off" dark:bg-gray-800
:placeholder="[[$t('nachname')]]" block
type="text" w-full
:class="{ 'border-red-500': (!userdetails.lastname.trim()), 'border-green-300': (userdetails.lastname.trim()) }" shadow-sm
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2" sm:text-sm
/> border-gray-300 border-2
<!-- --> bg-gray-50
<label for="email_address" class="block font-medium"> text-gray-500
{{ $t('e_mail_adress') }} rounded-md
<span class="font-bold">*</span> p-2
</label> " />
<input <!-- -->
v-model="userdetails.mail" <label for="last_name" class="block font-semibold mt-2">
name="email_address" {{ $t("nachname") }}
id="email_address" <span class="font-bold">*</span>
autocomplete="off" </label>
:placeholder="[[$t('e_mail_adress')]]" <input v-model="userdetails.lastname" name="lastname" id="last_name" autocomplete="off"
type="email" :placeholder="[[$t('nachname')]]" type="text" :class="{
:class="{ 'border-red-500': (!isEmail(userdetails.mail)), 'border-green-300': (isEmail(userdetails.mail)) }" 'border-red-500': !userdetails.lastname.trim(),
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-2 bg-gray-50 text-gray-500 rounded-md p-2" 'border-green-300': userdetails.lastname.trim(),
/> }" class="
<p v-if="!isEmail(userdetails.mail)" class="text-sm">{{ $t('please_provide_valid_mail') }}</p> dark:bg-gray-800
<!-- --> block
<label for="phone" class="select-none block font-medium">{{ $t('phone_number') }}</label> w-full
<input shadow-sm
v-model="userdetails.phone" sm:text-sm
name="phone" border-gray-300 border-2
id="phone" bg-gray-50
autocomplete="off" text-gray-500
:placeholder="[[$t('phone_number')]]" rounded-md
type="text" p-2
:class="{ 'border-red-500': (!isMobilePhone(userdetails.phone) && userdetails.phone.trim()), 'border-green-300': (isMobilePhone(userdetails.phone) && userdetails.phone.trim()) }" " />
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-2 bg-gray-50 text-gray-500 rounded-md p-2" <!-- -->
/> <label for="email_address" class="block font-semibold mt-2">
<p {{ $t("e_mail_adress") }}
v-if="(!isMobilePhone(userdetails.phone) && userdetails.phone.trim())" <span class="font-bold">*</span>
class="text-sm" </label>
>{{ $t('this_is_not_a_valid_international_phone_number') }}</p> <input v-model="userdetails.mail" name="email_address" id="email_address" autocomplete="off"
<!-- --> :placeholder="[[$t('e_mail_adress')]]" type="email" :class="{
<div class="grid grid-cols-6 mt-6"> 'border-red-500': !isEmail(userdetails.mail),
<div class="col-span-6"></div> 'border-green-300': isEmail(userdetails.mail),
<div class="flex items-start col-span-6"> }" class="
<div class="flex items-center h-5"> dark:bg-gray-800
<input block
v-model="provide_address" w-full
id="address_activated" shadow-sm
name="address_activated" sm:text-sm
type="checkbox" border-2
class="h-4 w-4 text-indigo-600 border-gray-300 rounded" bg-gray-50
/> text-gray-500
</div> rounded-md
<div class="ml-3 text-sm"> p-2
<label " />
for="address_activated" <p v-if="!isEmail(userdetails.mail)" class="text-sm">
class="font-medium text-gray-400 select-none" {{ $t("please_provide_valid_mail") }}
>{{ $t('provide_address') }}</label> </p>
</div> <!-- -->
</div> <label for="phone" class="block font-semibold mt-2">{{
<div v-if="provide_address === true" class="col-span-6"> $t("phone_number")
<div class="col-span-6"> }}</label>
<label for="street" class="block font-medium"> <div v-if="userdetails.phone!=='' && !userdetails.phone.includes('+')" class="bg-blue-100 border border-blue-200 text-black rounded-lg p-4 mb-1" role="alert" tabindex="-1"
{{ $t('strasse') }} aria-labelledby="hs-actions-label">
<span class="font-bold">*</span> <div class="flex">
</label> <div class="shrink-0">
<input <svg class="shrink-0 size-4 mt-1" xmlns="http://www.w3.org/2000/svg" width="24" height="24"
v-model="userdetails.address.street" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
type="text" stroke-linejoin="round">
name="street" <circle cx="12" cy="12" r="10"></circle>
:placeholder="[[$t('strasse')]]" <path d="M12 16v-4"></path>
id="street" <path d="M12 8h.01"></path>
autocomplete="street-address" </svg>
:class="{ 'border-red-500': (!userdetails.address.street.trim()), 'border-green-300': (userdetails.address.street.trim()) }" </div>
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2" <div class="ms-3">
/> <h3 id="hs-actions-label" class="font-semibold">
</div> {{ $t('hinweis') }}
<div class="col-span-6"> </h3>
<label for="address2" class="block font-medium">{{ $t('apartment_suite_etc') }}</label> <div class="mt-2 text-sm text-gray-800 font-medium">
<input {{ $t('registration_local_phone_nr') }}
v-model="userdetails.address.address2" </div>
type="text" </div>
name="address2" </div>
:placeholder="[[$t('apartment_suite_etc')]]" </div>
id="address2" <input v-model="userdetails.phone" name="phone" id="phone" autocomplete="off"
autocomplete="street-address" :placeholder="[[$t('phone_number')]]" type="text" :class="{
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2" 'border-red-500':
/> !isPhoneOkay(userdetails.phone),
</div> 'border-green-300':
<div class="col-span-6 sm:col-span-6 lg:col-span-2"> isPhoneOkay(userdetails.phone),
<label for="city" class="block font-medium"> }" class="
{{ $t('ort') }} dark:bg-gray-800
<span class="font-bold">*</span> block
</label> w-full
<input shadow-sm
v-model="userdetails.address.city" sm:text-sm
type="text" border-2
name="city" bg-gray-50
:placeholder="[[$t('ort')]]" text-gray-500
id="city" rounded-md
:class="{ 'border-red-500': (!userdetails.address.city.trim()), 'border-green-300': (userdetails.address.city.trim()) }" p-2
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2" " />
/> <p v-if="!isPhoneOkay(userdetails.phone)" class="text-sm">
</div> {{ $t("this_is_not_a_valid_international_phone_number") }}
<div class="col-span-6 sm:col-span-3 lg:col-span-2"> </p>
<label for="postal_code" class="block font-medium"> <!-- -->
{{ $t('plz') }} <div class="grid grid-cols-6 mt-6">
<span class="font-bold">*</span> <div class="col-span-6"></div>
</label> <div class="flex items-start col-span-6">
<input <div class="flex items-center h-5">
v-model="userdetails.address.zipcode" <input v-model="provide_address" id="address_activated" name="address_activated" type="checkbox"
type="text" class="h-4 w-4 text-indigo-600 border-gray-300 rounded" />
name="postal_code" </div>
:placeholder="[[$t('plz')]]" <div class="ml-3 text-sm">
id="postal_code" <label for="address_activated" class="font-medium text-gray-600 select-none">{{ $t("provide_address")
autocomplete="postal-code" }}</label>
:class="{ 'border-red-500': (!isPostalCode(userdetails.address.zipcode, 'DE')), 'border-green-300': (isPostalCode(userdetails.address.zipcode, 'DE')) }" </div>
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2" </div>
/> <div v-if="provide_address === true" class="col-span-6">
</div> <div class="col-span-6">
<p <label for="street" class="block font-semibold mt-2">
v-if="!isPostalCode(userdetails.address.zipcode, 'DE')" {{ $t("strasse") }}
class="text-sm" <span class="font-bold">*</span>
>{{ $t('please_provide_a_valid_zipcode') }}</p> </label>
</div> <input v-model="userdetails.address.street" type="text" name="street" :placeholder="[[$t('strasse')]]"
</div> id="street" autocomplete="street-address" :class="{
<div class="flex items-start mt-6"> 'border-red-500': !userdetails.address.street.trim(),
<div class="flex items-center h-5"> 'border-green-300': userdetails.address.street.trim(),
<input }" class="
v-model="agb_accepted" dark:bg-gray-800
id="agb_accepted" block
name="agb_accepted" w-full
type="checkbox" shadow-sm
class="h-4 w-4 text-indigo-600 border-gray-300 rounded" sm:text-sm
/> border-gray-300 border-2
</div> bg-gray-50
<div class="ml-3 text-sm"> text-gray-500
<label for="agb_accepted" class="font-medium text-gray-400 select-none"> rounded-md
{{ $t('i_accept', { tos: $t('tos') }) }} p-2
<a " />
target="_blank" </div>
rel="noreferrer,noopener" <div class="col-span-6">
href <label for="address2" class="block font-semibold mt-2">{{
class="underline" $t("apartment_suite_etc")
>{{ $t('tos') }}</a> }}</label>
{{ $t('i_accept_end') }} <input v-model="userdetails.address.address2" type="text" name="address2"
<span class="font-bold">*</span> :placeholder="[[$t('apartment_suite_etc')]]" id="address2" autocomplete="street-address" class="
</label> dark:bg-gray-800
</div> block
</div> w-full
<div class="flex items-start mt-6"> shadow-sm
<div class="flex items-center h-5"> sm:text-sm
<input border-gray-300 border-2
v-model="data_confirmed" bg-gray-50
id="data_confirmed" text-gray-500
name="data_confirmed" rounded-md
type="checkbox" p-2
class="h-4 w-4 text-indigo-600 border-gray-300 rounded" " />
/> </div>
</div> <div class="col-span-6 sm:col-span-6 lg:col-span-2">
<div class="ml-3 text-sm"> <label for="city" class="block font-semibold mt-2">
<label for="data_confirmed" class="font-medium text-gray-400 select-none"> {{ $t("ort") }}
{{ $t('confirm_personal_data') }} <span class="font-bold">*</span>
<span class="font-bold">*</span> </label>
</label> <input v-model="userdetails.address.city" type="text" name="city" :placeholder="[[$t('ort')]]" id="city"
</div> :class="{
</div> 'border-red-500': !userdetails.address.city.trim(),
<div class="mt-6"> 'border-green-300': userdetails.address.city.trim(),
<button }" class="
@click="login" dark:bg-gray-800
:disabled="(!state.submit_enabled)" block
:class="{ 'opacity-50': (!state.submit_enabled), 'cursor-not-allowed': (!state.submit_enabled) }" w-full
class="text-white block w-full text-center py-2 px-3 border-2 border-gray-300 rounded-md p-1 bg-blue-800 font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm" shadow-sm
>{{ $t('registrieren') }}</button> sm:text-sm
</div> border-gray-300 border-2
</div> bg-gray-50
<div class="mt-6"> text-gray-500
<div class="relative"> rounded-md
<div class="absolute inset-0 flex items-center"> p-2
<div class="w-full border-t border-gray-300"></div> " />
</div> </div>
<div class="relative flex justify-center text-sm"> <div class="col-span-6 sm:col-span-3 lg:col-span-2">
<span class="px-2 bg-white dark:bg-gray-900">{{ $t('already_have_an_account') }}</span> <label for="postal_code" class="block font-semibold mt-2">
</div> {{ $t("plz") }}
</div> <span class="font-bold">*</span>
<div class="mt-6"> </label>
<a <input v-model="userdetails.address.zipcode" type="text" name="postal_code" :placeholder="[[$t('plz')]]"
href="./login" id="postal_code" autocomplete="postal-code" :class="{
class="block w-full text-center py-2 px-3 border-2 border-gray-300 rounded-md p-1 dark:bg-gray-800 font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm" 'border-red-500': !isPostalCode(
>{{ $t('go_to_login') }}</a> userdetails.address.zipcode,
</div> 'DE'
</div> ),
</div> 'border-green-300': isPostalCode(
</div> userdetails.address.zipcode,
</template> 'DE'
),
<script setup> }" class="
import { computed, ref, reactive, defineProps } from "vue"; dark:bg-gray-800
import axios from "redaxios"; block
import isEmail from 'validator/es/lib/isEmail'; w-full
import isMobilePhone from 'validator/es/lib/isMobilePhone'; shadow-sm
import isPostalCode from 'validator/es/lib/isPostalCode'; sm:text-sm
import { useToast } from "vue-toastification"; border-gray-300 border-2
bg-gray-50
const props = defineProps({ text-gray-500
token: String rounded-md
}) p-2
if (props.token) { " />
axios.get(`${config.baseurl}api/organizations/selfservice/${props.token}`) </div>
.then(({ data }) => { <p v-if="!isPostalCode(userdetails.address.zipcode, 'DE')" class="text-sm">
state.org_name = data.name; {{ $t("please_provide_a_valid_zipcode") }}
state.org_teams = data.teams; </p>
org_team.value = data.teams[0]?.id; </div>
}) </div>
.catch((error) => { <div class="flex items-start mt-6">
console.log(error); <div class="flex items-center h-5">
}); <input v-model="agb_accepted" id="agb_accepted" name="agb_accepted" type="checkbox"
} class="h-4 w-4 text-indigo-600 border-gray-300 rounded" />
</div>
let userdetails = ref({ firstname: "", lastname: "", middlename: "", mail: "", phone: "", address: { street: "", address2: "", city: "", zipcode: "" } }); <div class="ml-3 text-sm">
let provide_address = ref(false); <label for="agb_accepted" class="font-medium text-gray-600 select-none">
let agb_accepted = ref(false); {{ $t("i_accept", { tos: $t("privacy_policy") }) }}
let data_confirmed = ref(false); <a target="_blank" rel="noreferrer,noopener" href="https://lauf-fuer-kaya.de/datenschutz/"
let org_team = ref(""); class="underline">{{ $t("privacy_policy") }}</a>
// {{ $t("i_accept_end") }}
const state = reactive({ <span class="font-bold">*</span>
org_name: "", </label>
org_teams: [], </div>
submit_enabled: computed(() => agb_accepted.value === true && data_confirmed.value === true && (isMobilePhone(userdetails.value.phone) || !userdetails.value.phone.trim()) && isEmail(userdetails.value.mail) </div>
&& userdetails.value.firstname <div class="flex items-start mt-6">
&& userdetails.value.lastname && (provide_address.value === false || provide_address.value === true && (userdetails.value.address.street.trim() && userdetails.value.address.city.trim() && isPostalCode(userdetails.value.address.zipcode, "DE")))) <div class="flex items-center h-5">
}) <input v-model="data_confirmed" id="data_confirmed" name="data_confirmed" type="checkbox"
const toast = useToast(); class="h-4 w-4 text-indigo-600 border-gray-300 rounded" />
function login() { </div>
userdetails = userdetails.value; <div class="ml-3 text-sm">
if (userdetails.phone === "" || isMobilePhone(userdetails.phone)) { <label for="data_confirmed" class="font-medium text-gray-600 select-none">
if (isEmail(userdetails.mail)) { {{ $t("confirm_personal_data") }}
let postdata = { <span class="font-bold">*</span>
"email": userdetails.mail, </label>
"firstname": userdetails.firstname, </div>
"middlename": userdetails.middlename, </div>
"lastname": userdetails.lastname, <div class="mt-6">
"address": {} <button @click="login" :disabled="!state.submit_enabled" :class="{
} 'opacity-50': !state.submit_enabled,
if (isMobilePhone(userdetails.phone)) { 'cursor-not-allowed': !state.submit_enabled,
postdata.phone = userdetails.phone; }" class="
} text-white
if (provide_address.value === true) { block
postdata.address = { w-full
address1: userdetails.address.street, text-center
address2: userdetails.address.address2 || "", py-2
city: userdetails.address.city, px-3
postalcode: userdetails.address.zipcode, border-2 border-gray-300
country: "DE", rounded-md
} p-1
} bg-blue-800
if (state.org_name !== '' && state.org_teams.length > 0) { font-medium
postdata.team = org_team.value; not-disabled:hover:border-gray-400
} not-disabled:hover:bg-blue-600
toast("registration in progress..."); not-disabled:cursor-pointer
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2); not-disabled:focus:outline-none focus:border-gray-400
let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`; sm:text-sm
if (props.token) { ">
url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}` {{ $t("registrieren") }}
} </button>
axios.post(url, postdata) </div>
.then(({ data }) => { </div>
const token = btoa(data.token); </div>
// alert(token); </div>
location.replace(`${config.baseurl_selfservice}profile/${token}`); <Footer></Footer>
}) </template>
.catch((error) => {
console.log(error); <script setup>
}); import Footer from "@/components/Footer.vue";
} import { runnerSelfServiceControllerGetSelfserviceOrg, runnerSelfServiceControllerRegisterOrganizationRunner, runnerSelfServiceControllerRegisterRunner } from "@odit/lfk-client";
} import isEmail from "validator/es/lib/isEmail";
} import isMobilePhone from "validator/es/lib/isMobilePhone";
import isPostalCode from "validator/es/lib/isPostalCode";
import { computed, reactive, ref } from "vue";
import { useI18n } from 'vue-i18n';
import { TYPE, useToast } from "vue-toastification";
const { t } = useI18n()
const props = defineProps({
token: String,
});
if (props.token) {
runnerSelfServiceControllerGetSelfserviceOrg({ path: { token: props.token } }).then(({ data }) => {
state.org_name = data.name;
state.org_teams = data.teams;
org_team.value = data.teams[0]?.id;
})
.catch((error) => {
console.log(error);
});
}
let userdetails = ref({
firstname: "",
lastname: "",
middlename: "",
mail: "",
phone: "",
address: { street: "", address2: "", city: "", zipcode: "" },
});
function formatPhoneNumber(phoneNumber, countryCode = "+49") {
// Remove all non-digit characters
const cleanedNumber = phoneNumber.replace(/\D/g, "");
// Check if the number starts with the country code
if (cleanedNumber.startsWith(countryCode.replace("+", ""))) {
return "+" + cleanedNumber; // already international
}
// Check if the number starts with 0
if (cleanedNumber.startsWith("0")) {
return countryCode + cleanedNumber.slice(1);
}
// If it doesn't start with 0 or the country code, assume it's a local number.
// In this case, prepend the country code.
return countryCode + cleanedNumber;
}
function isPhoneOkay() {
if (userdetails.value.phone === "") {
return true
}
const formattedNumber = formatPhoneNumber(userdetails.value.phone)
if (isMobilePhone(formattedNumber)) {
return true
}
return false
}
let provide_address = ref(false);
let agb_accepted = ref(false);
let data_confirmed = ref(false);
let org_team = ref("");
let registrationState = ref("pending");
//
const state = reactive({
org_name: "",
org_teams: [],
submit_enabled: computed(
() =>
agb_accepted.value === true &&
data_confirmed.value === true &&
isPhoneOkay() &&
isEmail(userdetails.value.mail) &&
userdetails.value.firstname &&
userdetails.value.lastname &&
(provide_address.value === false ||
(provide_address.value === true &&
userdetails.value.address.street.trim() &&
userdetails.value.address.city.trim() &&
isPostalCode(userdetails.value.address.zipcode, "DE")))
),
});
const toast = useToast();
function login() {
// userdetails = userdetails.value;
if (isPhoneOkay()) {
if (isEmail(userdetails.value.mail)) {
let postdata = {
email: userdetails.value.mail,
firstname: userdetails.value.firstname,
middlename: userdetails.value.middlename,
lastname: userdetails.value.lastname,
address: {},
};
if (userdetails.value.phone !== "") {
postdata.phone = formatPhoneNumber(userdetails.value.phone)
}
if (provide_address.value === true) {
postdata.address = {
address1: userdetails.value.address.street,
address2: userdetails.value.address.address2 || "",
city: userdetails.value.address.city,
postalcode: userdetails.value.address.zipcode,
country: "DE",
};
}
if (state.org_name !== "" && state.org_teams.length > 0) {
postdata.team = org_team.value;
}
toast(t('registration_running'));
const browserlocale = (
(navigator.languages && navigator.languages[0]) ||
""
).substr(0, 2);
registrationState.value = "loading";
if (props.token) {
runnerSelfServiceControllerRegisterOrganizationRunner({ path: { token: props.token }, body: postdata, query: { locale: browserlocale } })
.then(() => {
registrationState.value = "registered";
})
.catch((error) => {
console.log(error);
if (error.data.message === "E-Mail already registered") {
toast(t('already_registered'), { type: TYPE.ERROR });
} else if (error.data.message === "Invalid body, check 'errors' property for more info.") {
error.data.errors.forEach(e => {
if (e.property === "phone") {
toast(t('invalid_input_phone_number_should_be_international_format'), { type: TYPE.ERROR });
}
});
}
});
} else {
runnerSelfServiceControllerRegisterRunner({ body: postdata, query: { locale: browserlocale } })
.then(() => {
registrationState.value = "registered";
})
.catch((error) => {
console.log(error);
if (error.data.message === "E-Mail already registered") {
toast(t('already_registered'), { type: TYPE.ERROR });
} else if (error.data.message === "Invalid body, check 'errors' property for more info.") {
error.data.errors.forEach(e => {
if (e.property === "phone") {
toast(t('invalid_input_phone_number_should_be_international_format'), { type: TYPE.ERROR });
}
});
}
});
}
}
}
}
</script> </script>

View File

@@ -1,11 +0,0 @@
module.exports = {
purge: [ './index.html', './src/**/*.{vue,js,ts,jsx,tsx}' ],
darkMode: 'media', // or 'media' or 'class'
theme: {
extend: {}
},
variants: {
extend: {}
},
plugins: []
};

View File

@@ -1,13 +1,15 @@
import { defineConfig } from 'vite'; import { fileURLToPath, URL } from "node:url";
import vue from '@vitejs/plugin-vue';
import path from 'path'; import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import tailwindcss from "@tailwindcss/vite";
import vueDevTools from "vite-plugin-vue-devtools";
export default defineConfig({ export default defineConfig({
plugins: [ vue() ], plugins: [vue(), vueDevTools(), tailwindcss()],
base: './',
resolve: { resolve: {
alias: { alias: {
'@': path.resolve(__dirname, '/src') "@": fileURLToPath(new URL("./src", import.meta.url)),
} },
} },
}); });