Compare commits

..

63 Commits

Author SHA1 Message Date
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
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
3b4c11e4c0 Merge branch 'feature/39-donation_list' of git.odit.services:lfk/selfservice into feature/39-donation_list 2021-04-06 21:25:12 +02:00
89820d4450 Added total to bottom of page
ref #39
2021-04-06 21:25:10 +02:00
121022c843 added distance formatting
ref #39
2021-04-06 21:23:24 +02:00
d713fbef94 Added translations 🌍
ref #39
2021-04-06 17:27:18 +02:00
815a36f202 Now w/ formatted currency amount
ref #39
2021-04-06 17:20:41 +02:00
baa6da3dd0 Fixed spaces in name
ref #39
2021-04-06 17:18:09 +02:00
f141130db5 Added basic sponsoring table
ref #39
2021-04-06 17:14:22 +02:00
5a123b0cf8 Updated env description
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-06 17:03:05 +02:00
f5ae2145df 🚀Bumped version to v0.6.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-06 17:01:20 +02:00
96c0e56986 Fixed imprint/privacy default links
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-06 17:00:55 +02:00
bc1de2acdc 🚀Bumped version to v0.6.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-03 18:53:32 +02:00
5c558aa9ee Merge branch 'dev' of git.odit.services:lfk/selfservice into dev 2021-04-03 18:53:14 +02:00
145b49906b Revert "🚀Bumped version to v0.6.0"
This reverts commit 0a62e8f5d1.
2021-04-03 18:53:12 +02:00
0a62e8f5d1 🚀Bumped version to v0.6.0 2021-04-03 18:52:54 +02:00
53eeb6be3d Merge pull request 'Certificate download feature/19-runner_certficates' (#38) from feature/19-runner_certficates into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #38
2021-04-03 16:51:22 +00:00
a554a90e74 Merge branch 'dev' into feature/19-runner_certficates
# Conflicts:
#	index.html
2021-04-03 18:50:16 +02:00
c3b2b93d90 Reverted relative linking fix
ref #19
2021-04-03 18:48:53 +02:00
7064a5bd82 Merge branch 'dev' into feature/19-runner_certficates 2021-04-03 16:28:18 +00:00
f0a7f35dec Renoved fixed data
ref #19
2021-04-03 18:11:57 +02:00
b938cfc49e Fixed blob handling
ref #19
2021-04-03 18:11:22 +02:00
f6334397dc first part of certificate generation with manual data
ref #19
2021-04-03 17:57:24 +02:00
17 changed files with 4556 additions and 828 deletions

View File

@@ -25,23 +25,6 @@ type: kubernetes
name: build:dev name: build:dev
steps: 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 - name: build dev
image: plugins/docker image: plugins/docker
depends_on: [clone] depends_on: [clone]

View File

@@ -2,9 +2,136 @@
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.
#### [0.7.11](https://git.odit.services/lfk/selfservice/compare/0.7.10...0.7.11)
- Profile: improved mobile responsiveness/ design + toast clear [`077b33f`](https://git.odit.services/lfk/selfservice/commit/077b33f03180d0bd6c45becaaa63d3408c645deb)
- 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)
> 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)
#### [0.6.0](https://git.odit.services/lfk/selfservice/compare/0.5.1...0.6.0)
> 3 April 2021
- 🚀Bumped version to v0.6.0 [`bc1de2a`](https://git.odit.services/lfk/selfservice/commit/bc1de2acdcbf8f3319026887cb6b3d594fcd63dc)
- first part of certificate generation with manual data [`f633439`](https://git.odit.services/lfk/selfservice/commit/f6334397dc99cd38d31ef524bc26ba7d386b33dd)
- Renoved fixed data [`f0a7f35`](https://git.odit.services/lfk/selfservice/commit/f0a7f35dec07508a07d4c11abda297ad0bf91187)
- Revert "🚀Bumped version to v0.6.0" [`145b499`](https://git.odit.services/lfk/selfservice/commit/145b49906bdf2d75abf93e1779f188a691a3a909)
- 🚀Bumped version to v0.6.0 [`0a62e8f`](https://git.odit.services/lfk/selfservice/commit/0a62e8f5d1929bfe9a53a9709a3031f06a2487c3)
- Merge pull request 'Certificate download feature/19-runner_certficates' (#38) from feature/19-runner_certficates into dev [`53eeb6b`](https://git.odit.services/lfk/selfservice/commit/53eeb6be3ddf4735a11b6c4636c28b4d16aa58ee)
- Fixed blob handling [`b938cfc`](https://git.odit.services/lfk/selfservice/commit/b938cfc49e269e76761a752f8257ebbab88f6959)
- Reverted relative linking fix [`c3b2b93`](https://git.odit.services/lfk/selfservice/commit/c3b2b93d90102b4e31cfce15220acfc8fe48a7c5)
#### [0.5.1](https://git.odit.services/lfk/selfservice/compare/0.5.0...0.5.1) #### [0.5.1](https://git.odit.services/lfk/selfservice/compare/0.5.0...0.5.1)
> 3 April 2021
- Merge pull request 'feature/30-profile-forgot-link' (#35) from feature/30-profile-forgot-link into dev [`#30`](https://git.odit.services/lfk/selfservice/issues/30) - Merge pull request 'feature/30-profile-forgot-link' (#35) from feature/30-profile-forgot-link into dev [`#30`](https://git.odit.services/lfk/selfservice/issues/30)
- 🚀Bumped version to v0.5.1 [`1a3c9ed`](https://git.odit.services/lfk/selfservice/commit/1a3c9edeb3987907ffe2223da8f3be079a1c80d2)
- Merge pull request 'Env linking bugfix bugfix/31-env_linking' (#37) from bugfix/31-env_linking into dev [`fd6bd88`](https://git.odit.services/lfk/selfservice/commit/fd6bd88d4238cca2a2755ab1bc51ff7870bef947) - Merge pull request 'Env linking bugfix bugfix/31-env_linking' (#37) from bugfix/31-env_linking into dev [`fd6bd88`](https://git.odit.services/lfk/selfservice/commit/fd6bd88d4238cca2a2755ab1bc51ff7870bef947)
- basic ProfileNone layout [`863568d`](https://git.odit.services/lfk/selfservice/commit/863568d7d0e132dd1b7d13a2cb1afe8db02c472c) - basic ProfileNone layout [`863568d`](https://git.odit.services/lfk/selfservice/commit/863568d7d0e132dd1b7d13a2cb1afe8db02c472c)
- add forgot view + action [`30f3a51`](https://git.odit.services/lfk/selfservice/commit/30f3a51ef82ad966225abc6fd95508af56106924) - add forgot view + action [`30f3a51`](https://git.odit.services/lfk/selfservice/commit/30f3a51ef82ad966225abc6fd95508af56106924)

View File

@@ -1,9 +1,10 @@
FROM node:15.9.0-alpine3.13 FROM registry.odit.services/hub/library/node:15.9.0-alpine3.13
WORKDIR /app WORKDIR /app
COPY . . COPY . .
RUN yarn RUN yarn
RUN yarn build RUN yarn build
RUN yarn postbuild
# final image # final image
FROM fholzer/nginx-brotli:v1.19.1 FROM registry.odit.services/library/nginx-brotli:3.15
COPY --from=0 /app/dist /usr/share/nginx/html COPY --from=0 /app/dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./nginx.conf /etc/nginx/nginx.conf

6
env_fix.js Normal file
View File

@@ -0,0 +1,6 @@
const fs = require('fs');
if (fs.existsSync('./dist/index.html')) {
const content = fs.readFileSync('./dist/index.html', { encoding: 'utf8' });
const newcontent = content.replace(`"/env.js"`, `"./env.js"`);
fs.writeFileSync('./dist/index.html', newcontent);
}

View File

@@ -10,8 +10,8 @@
<body class="dark:bg-gray-900 text-black dark:text-white p-0"> <body class="dark:bg-gray-900 text-black dark:text-white p-0">
<div id="app"></div> <div id="app"></div>
<script src="./env.js"></script> <script src="/env.js"></script>
<script defer type="module" src="./src/main.js"></script> <script defer type="module" src="/src/main.js"></script>
</body> </body>
</html> </html>

View File

@@ -1,17 +1,19 @@
{ {
"name": "@odit/lfk-selfservice", "name": "@odit/lfk-selfservice",
"version": "0.5.1", "version": "0.7.11",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
"release": "release-it --only-version" "release": "release-it",
"postbuild": "node env_fix.js"
}, },
"dependencies": { "dependencies": {
"marked": "2.0.1", "bwip-js": "3.2.2",
"marked": "2.0.3",
"redaxios": "0.4.1", "redaxios": "0.4.1",
"toastify-js": "1.10.0", "toastify-js": "1.10.0",
"validator": "13.5.2", "validator": "13.5.2",
"vue-i18n": "9.0.0", "vue-i18n": "9.1.4",
"vue-toastification": "2.0.0-rc.1", "vue-toastification": "2.0.0-rc.1",
"vue": "3.0.9", "vue": "3.0.9",
"vue-router": "4.0.5" "vue-router": "4.0.5"
@@ -23,10 +25,10 @@
"@tailwindcss/line-clamp": "0.2.0", "@tailwindcss/line-clamp": "0.2.0",
"@tailwindcss/typography": "0.4.0", "@tailwindcss/typography": "0.4.0",
"@vitejs/plugin-vue": "1.2.1", "@vitejs/plugin-vue": "1.2.1",
"@vue/compiler-sfc": "3.0.10", "@vue/compiler-sfc": "3.0.11",
"autoprefixer": "10.2.5", "autoprefixer": "10.2.5",
"tailwindcss": "2.0.4", "tailwindcss": "2.1.1",
"release-it": "14.5.0", "release-it": "14.6.1",
"vite": "2.1.5" "vite": "2.1.5"
}, },
"release-it": { "release-it": {
@@ -35,7 +37,7 @@
"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}"

3129
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -5,8 +5,13 @@ const config = {
baseurl: '', baseurl: '',
// optional, will fallback to /selfservice/ // optional, will fallback to /selfservice/
baseurl_selfservice: '/selfservice/', baseurl_selfservice: '/selfservice/',
// optional, will fallback to /imprint // full url (including fqdn)
baseurl_documentserver: 'http://localhost:4010/documents',
// optional, will fallback to code128
code_format: 'ean13',
// optional, will fallback to baseurl_selfservice/imprint
url_imprint: '', url_imprint: '',
// optional, will fallback to /privacy // optional, will fallback to baseurl_selfservice/privacy
url_privacy: '' url_privacy: '',
codeformat: 'code39'
}; };

View File

@@ -2,7 +2,7 @@
<footer class="text-gray-400 bg-gray-900 body-font"> <footer class="text-gray-400 bg-gray-900 body-font">
<div class="container px-5 py-8 mx-auto flex items-center sm:flex-row flex-col"> <div class="container px-5 py-8 mx-auto flex items-center sm:flex-row flex-col">
<p class="text-sm text-gray-400 sm:ml-4 sm:pl-4 sm:py-2 sm:mt-0 mt-4"> <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 - Copyright © 2021 + proudly powered by Lauf für Kaya! Selfservice - Copyright © 2023 + proudly powered by
<a <a
class="underline" class="underline"
target="_blank" target="_blank"
@@ -31,8 +31,8 @@
export default { export default {
data() { data() {
return { return {
imprint_url: config.url_imprint || "/imprint/" imprint_url: config.url_imprint || config.baseurl_selfservice + "imprint"
, privacy_url: config.url_privacy || "/privacy/" , privacy_url: config.url_privacy || config.baseurl_selfservice + "privacy"
} }
}, },
} }

View File

@@ -29,7 +29,7 @@
placeholder="Passwort" placeholder="Passwort"
/> />
<div class="absolute inset-y-0 right-0 pr-3 flex items-center text-sm"> <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> <a href="/selfservice/reset" class="text-gray-900 underline">Passwort vergessen?</a>
</div> </div>
</div> </div>
</div> </div>
@@ -80,7 +80,7 @@
</div> </div>
<div class="mt-6"> <div class="mt-6">
<a <a
href="./register" href="/selfservice/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" 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> >Account erstellen</a>
</div> </div>
@@ -101,7 +101,7 @@ function login() {
axios.get("").then((res) => { axios.get("").then((res) => {
loading.value = false; loading.value = false;
Toastify({ Toastify({
text: "This is a toast", text: "Login läuft...",
duration: 3000, duration: 3000,
}).showToast(); }).showToast();
}); });

View File

@@ -29,7 +29,7 @@
placeholder="Passwort" placeholder="Passwort"
/> />
<div class="absolute inset-y-0 right-0 pr-3 flex items-center text-sm"> <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> <a href="/selfservice/reset" class="text-gray-900 underline">Passwort vergessen?</a>
</div> </div>
</div> </div>
</div> </div>
@@ -80,7 +80,7 @@
</div> </div>
<div class="mt-6"> <div class="mt-6">
<a <a
href="./register" href="/selfservice/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" 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> >Account erstellen</a>
</div> </div>
@@ -101,7 +101,7 @@ function login() {
axios.get("").then((res) => { axios.get("").then((res) => {
loading.value = false; loading.value = false;
Toastify({ Toastify({
text: "This is a toast", text: "Login läuft...",
duration: 3000, duration: 3000,
}).showToast(); }).showToast();
}); });

View File

@@ -1,16 +1,19 @@
{ {
"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 nur über den Link, den Sie bei der Registrierung erhalten haben.",
"already_have_an_account": "Sie haben bereits einen Account?", "already_have_an_account": "Sie haben bereits einen Account?",
"amount_per_kilometer_in_eur": "Betrag pro Kilometer (in €)",
"apartment_suite_etc": "Addresszeile 2", "apartment_suite_etc": "Addresszeile 2",
"cancel_keep_my_data": "Abbrechen, meine Daten behalten", "cancel_keep_my_data": "Abbrechen, meine Daten behalten",
"configuration_error": "Konfigurationsfehler", "configuration_error": "Konfigurationsfehler",
"confirm_delete_all_of_my_data": "Bestätigung, meine gesamten Daten löschen", "confirm_delete_all_of_my_data": "Bestätigung, meine gesamten Daten löschen",
"confirm_personal_data": "Hiermit bestätige ich die Vollständigkeit und Richtigkeit der oben genannten Angaben", "confirm_personal_data": "Hiermit bestätige ich die Vollständigkeit und Richtigkeit der oben genannten Angaben",
"delete-all-of-my-data": "Meine gesamten Daten löschen", "current_total_amount_in_eur": "Aktueller Gesamtbetrag (in €)",
"delete_all_of_my_data": "Meine gesamten Daten löschen",
"delete_my_data": "Meine Daten löschen", "delete_my_data": "Meine Daten löschen",
"deletion_in_progress": "Daten werden gelöscht...", "deletion_in_progress": "Daten werden gelöscht...",
"distance": "Distanz", "distance": "Distanz",
"download_certificate": "Urkunde herunterladen", "download_certificate": "Urkunde herunterladen",
"download_registrationcode": "Registrierungscode herunterladen",
"e_mail_adress": "E-Mail Adresse", "e_mail_adress": "E-Mail Adresse",
"go_to_login": "Zum Login", "go_to_login": "Zum Login",
"i_accept": "Ich habe die ", "i_accept": "Ich habe die ",
@@ -24,6 +27,7 @@
"mittelname": "Mittelname", "mittelname": "Mittelname",
"nachname": "Nachname", "nachname": "Nachname",
"no_laps_scans_were_recorded_yet": "Es wurden noch keine Runden / Scans aufgezeichnet ...", "no_laps_scans_were_recorded_yet": "Es wurden noch keine Runden / Scans aufgezeichnet ...",
"no_sponsorings_for_you_were_recorded_yet": "Es gibt noch keine Sponsorings für dich",
"not_registered_yet": "Noch nicht registriert?", "not_registered_yet": "Noch nicht registriert?",
"organization": "Organisation", "organization": "Organisation",
"ort": "Ort", "ort": "Ort",
@@ -35,11 +39,12 @@
"profile": "Profil", "profile": "Profil",
"provide_address": "Adresse angeben?", "provide_address": "Adresse angeben?",
"register": { "register": {
"register_now": "Jetzt für den Lauf für Kaya! 2021 registrieren." "register_now": "Jetzt für den Lauf für Kaya! 2023 registrieren."
}, },
"register_now": "Jetzt registrieren!", "register_now": "Jetzt registrieren!",
"register_now_small": "Jetzt registrieren", "register_now_small": "Jetzt registrieren",
"registrieren": "Registrieren", "registrieren": "Registrieren",
"registrierungscode": "Registrierungscode",
"resend_the_registration_mail": "Registrierungsmail erneut versenden", "resend_the_registration_mail": "Registrierungsmail erneut versenden",
"save_changes": "Änderungen speichern", "save_changes": "Änderungen speichern",
"sponsoring": "Sponsoring", "sponsoring": "Sponsoring",
@@ -47,6 +52,7 @@
"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.", "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", "this_is_not_a_valid_international_phone_number": "Dies ist keine gültige internationale Telefonnummer",
"tos": "AGBs", "tos": "AGBs",
"total": "Gesamt",
"view_my_data": "Meine Läuferdaten einsehen", "view_my_data": "Meine Läuferdaten einsehen",
"vorname": "Vorname", "vorname": "Vorname",
"you_have_been_registered": "Sie wurden registriert!", "you_have_been_registered": "Sie wurden registriert!",

View File

@@ -2,15 +2,18 @@
"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!", "all_data_deleted": "All Data deleted!",
"already_have_an_account": "Already have an account?", "already_have_an_account": "Already have an account?",
"amount_per_kilometer_in_eur": "Amount per kilometer (in €)",
"apartment_suite_etc": "Apartment, suite, etc.", "apartment_suite_etc": "Apartment, suite, etc.",
"cancel_keep_my_data": "Cancel, keep my data", "cancel_keep_my_data": "Cancel, keep my data",
"configuration_error": "Configuration error", "configuration_error": "Configuration error",
"confirm_delete_all_of_my_data": "Confirm, delete all of my data", "confirm_delete_all_of_my_data": "Confirm, delete all of my data",
"confirm_personal_data": "I hereby confirm that the above information is complete and correct", "confirm_personal_data": "I hereby confirm that the above information is complete and correct",
"current_total_amount_in_eur": "Current total amount (in €)",
"delete_my_data": "Delete my data", "delete_my_data": "Delete my data",
"deletion_in_progress": "Deletion in progress...", "deletion_in_progress": "Deletion in progress...",
"distance": "Distance", "distance": "Distance",
"download_certificate": "Download certificate", "download_certificate": "Download certificate",
"download_registrationcode": "Download registrationcode",
"e_mail_adress": "mail address", "e_mail_adress": "mail address",
"go_to_login": "Go To Login", "go_to_login": "Go To Login",
"i_accept": "I have read and accepted the ", "i_accept": "I have read and accepted the ",
@@ -24,6 +27,7 @@
"mittelname": "Middlename", "mittelname": "Middlename",
"nachname": "Lastname", "nachname": "Lastname",
"no_laps_scans_were_recorded_yet": "No laps/ scans were recorded yet...", "no_laps_scans_were_recorded_yet": "No laps/ scans were recorded yet...",
"no_sponsorings_for_you_were_recorded_yet": "No sponsorings for you were recorded yet...",
"not_registered_yet": "Not registered yet?", "not_registered_yet": "Not registered yet?",
"organization": "Organization", "organization": "Organization",
"ort": "City", "ort": "City",
@@ -35,7 +39,7 @@
"profile": "Profile", "profile": "Profile",
"provide_address": "Provide a postal address?", "provide_address": "Provide a postal address?",
"register": { "register": {
"register_now": "Register now for Lauf für Kaya! 2021." "register_now": "Register now for Lauf für Kaya! 2023."
}, },
"register_now": "Register now!", "register_now": "Register now!",
"register_now_small": "Register now", "register_now_small": "Register now",
@@ -47,6 +51,7 @@
"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.", "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", "this_is_not_a_valid_international_phone_number": "This is not a valid international phone number",
"tos": "Terms of Service", "tos": "Terms of Service",
"total": "Total",
"view_my_data": "View my data", "view_my_data": "View my data",
"vorname": "Firstname", "vorname": "Firstname",
"you_have_been_registered": "You have been registered!", "you_have_been_registered": "You have been registered!",

View File

@@ -11,10 +11,10 @@
<div class="mt-6 sm:flex place-content-center"> <div class="mt-6 sm:flex place-content-center">
<a <a
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" 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/" href="/selfservice/register/"
>{{ $t('register_now') }}</a> >{{ $t('register_now') }}</a>
<a <a
href="./profile/" href="/selfservice/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" 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> >{{ $t('view_my_data') }}</a>
</div> </div>

View File

@@ -3,19 +3,47 @@
<section class="text-white body-font"> <section class="text-white body-font">
<div class="container mx-auto flex items-center md:flex-row flex-col"> <div class="container mx-auto flex items-center md:flex-row flex-col">
<div <div
class="flex flex-col md:pr-10 md:mb-0 mb-6 pr-0 w-full md:w-auto md:text-left text-center text-black dark:text-gray-200" class="
flex flex-col
md:pr-10 md:mb-0
mb-6
pr-0
w-full
md:w-auto md:text-left
text-center text-black
dark:text-gray-200
"
> >
<p <p
class="text-3xl font-bold whitespace-nowrap" class="text-3xl font-bold whitespace-nowrap"
v-text="(state.firstname || '') + ' ' + (state.middlename || '') + ' ' + (state.lastname || '')" v-text="
(state.firstname || '') +
' ' +
(state.middlename || '') +
' ' +
(state.lastname || '')
"
></p> ></p>
<p class="text-md whitespace-nowrap">{{ state.group }}</p> <p class="text-md whitespace-nowrap">{{ state.group }}</p>
</div> </div>
<div class="inline-flex md:ml-auto md:mr-0 mx-auto items-center"> <div class="inline-flex md:ml-auto md:mr-0 mx-auto items-center">
<div v-if="(state.delete_active === false)"> <div v-if="state.delete_active === false">
<button <button
type="button" type="button"
class="focus:border-black focus:ring-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md bg-blue-500 hover:bg-blue-600 hover:shadow-lg" class="
focus:border-black focus:ring-2 focus:ring-black
text-white text-sm
py-2.5
px-5
rounded-md
bg-blue-500
hover:bg-blue-600 hover:shadow-lg
w-full
md:w-auto
mb-1
md:mr-1
"
@click="get_registration"
> >
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@@ -28,18 +56,68 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
class="feather feather-download" class="feather feather-download"
style="display: inline;height: 1rem;vertical-align: sub;" style="display: inline; height: 1rem; vertical-align: sub"
> >
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" /> <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
<polyline points="7 10 12 15 17 10" /> <polyline points="7 10 12 15 17 10" />
<line x1="12" y1="15" x2="12" y2="3" /> <line x1="12" y1="15" x2="12" y2="3" />
</svg> </svg>
{{ $t('download_certificate') }} {{ $t("download_registrationcode") }}
</button> </button>
<button <button
type="button" type="button"
class="focus:border-black focus:ring-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md bg-red-600 hover:bg-red-700 hover:shadow-lg ml-1" class="
@click="() => { state.delete_active = true }" focus:border-black focus:ring-2 focus:ring-black
text-white text-sm
py-2.5
px-5
rounded-md
bg-blue-500
hover:bg-blue-600 hover:shadow-lg
w-full
md:w-auto
mb-1
md:mr-1
"
@click="get_certificate"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-download"
style="display: inline; height: 1rem; vertical-align: sub"
>
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
<polyline points="7 10 12 15 17 10" />
<line x1="12" y1="15" x2="12" y2="3" />
</svg>
{{ $t("download_certificate") }}
</button>
<button
type="button"
class="
focus:border-black focus:ring-2 focus:ring-black
text-white text-sm
py-2.5
px-5
rounded-md
bg-red-600
hover:bg-red-700 hover:shadow-lg
w-full
md:w-auto
"
@click="
() => {
state.delete_active = true;
}
"
> >
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@@ -52,7 +130,7 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
class="feather feather-download" class="feather feather-download"
style="display: inline;height: 1rem;vertical-align: sub;" style="display: inline; height: 1rem; vertical-align: sub"
> >
<path d="M0 0h24v24H0z" /> <path d="M0 0h24v24H0z" />
<path <path
@@ -60,14 +138,26 @@
d="M17 6h5v2h-2v13a1 1 0 01-1 1H5a1 1 0 01-1-1V8H2V6h5V3a1 1 0 011-1h8a1 1 0 011 1v3zm1 2H6v12h12V8zm-5 6l2 2-1 1-2-2-2 2-1-1 2-2-2-2 1-1 2 2 2-2 1 1-2 2zM9 4v2h6V4H9z" d="M17 6h5v2h-2v13a1 1 0 01-1 1H5a1 1 0 01-1-1V8H2V6h5V3a1 1 0 011-1h8a1 1 0 011 1v3zm1 2H6v12h12V8zm-5 6l2 2-1 1-2-2-2 2-1-1 2-2-2-2 1-1 2 2 2-2 1 1-2 2zM9 4v2h6V4H9z"
/> />
</svg> </svg>
{{ $t('delete_my_data') }} {{ $t("delete_my_data") }}
</button> </button>
</div> </div>
<div v-if="(state.delete_active === true)"> <div v-if="state.delete_active === true">
<button <button
type="button" type="button"
class="focus:border-black focus:ring-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md bg-blue-500 hover:bg-blue-600 hover:shadow-lg" class="
@click="() => { state.delete_active = false }" focus:border-black focus:ring-2 focus:ring-black
text-white text-sm
py-2.5
px-5
rounded-md
bg-blue-500
hover:bg-blue-600 hover:shadow-lg
"
@click="
() => {
state.delete_active = false;
}
"
> >
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@@ -80,16 +170,28 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
class="feather feather-download" class="feather feather-download"
style="display: inline;height: 1rem;vertical-align: sub;" style="display: inline; height: 1rem; vertical-align: sub"
> >
<path fill="none" d="M0 0h24v24H0z" /> <path fill="none" d="M0 0h24v24H0z" />
<path fill="currentColor" d="M12 11l5-5 1 1-5 5 5 5-1 1-5-5-5 5-1-1 5-5-5-5 1-1z" /> <path
fill="currentColor"
d="M12 11l5-5 1 1-5 5 5 5-1 1-5-5-5 5-1-1 5-5-5-5 1-1z"
/>
</svg> </svg>
{{ $t('cancel_keep_my_data') }} {{ $t("cancel_keep_my_data") }}
</button> </button>
<button <button
type="button" type="button"
class="focus:border-black focus:ring-2 focus:ring-black text-white text-sm py-2.5 px-5 rounded-md bg-red-600 hover:bg-red-700 hover:shadow-lg ml-1" class="
focus:border-black focus:ring-2 focus:ring-black
text-white text-sm
py-2.5
px-5
rounded-md
bg-red-600
hover:bg-red-700 hover:shadow-lg
ml-1
"
@click="delete_me" @click="delete_me"
> >
<svg <svg
@@ -103,7 +205,7 @@
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
class="feather feather-download" class="feather feather-download"
style="display: inline;height: 1rem;vertical-align: sub;" style="display: inline; height: 1rem; vertical-align: sub"
> >
<path d="M0 0h24v24H0z" /> <path d="M0 0h24v24H0z" />
<path <path
@@ -111,7 +213,7 @@
d="M17 6h5v2h-2v13a1 1 0 01-1 1H5a1 1 0 01-1-1V8H2V6h5V3a1 1 0 011-1h8a1 1 0 011 1v3zm1 2H6v12h12V8zm-5 6l2 2-1 1-2-2-2 2-1-1 2-2-2-2 1-1 2 2 2-2 1 1-2 2zM9 4v2h6V4H9z" d="M17 6h5v2h-2v13a1 1 0 01-1 1H5a1 1 0 01-1-1V8H2V6h5V3a1 1 0 011-1h8a1 1 0 011 1v3zm1 2H6v12h12V8zm-5 6l2 2-1 1-2-2-2 2-1-1 2-2-2-2 1-1 2 2 2-2 1 1-2 2zM9 4v2h6V4H9z"
/> />
</svg> </svg>
{{ $t('confirm_delete_all_of_my_data') }} {{ $t("confirm_delete_all_of_my_data") }}
</button> </button>
</div> </div>
</div> </div>
@@ -123,66 +225,170 @@
<div class="flex lg:flex-wrap flex-row lg:space-x-2"> <div class="flex lg:flex-wrap flex-row lg:space-x-2">
<div class="flex-none"> <div class="flex-none">
<button <button
@click="() => { state.activetab = 'profile' }" @click="
:class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'profile') }" () => {
state.activetab = 'profile';
}
"
:class="{
'tab-active border-b-2 font-medium border-blue-500':
state.activetab === 'profile',
}"
class="tab tab-underline py-4 px-6 block" class="tab tab-underline py-4 px-6 block"
type="button" type="button"
>{{ $t('profile') }}</button> >
{{ $t("profile") }}
</button>
</div> </div>
<div class="flex-none"> <div class="flex-none">
<button <button
@click="() => { state.activetab = 'laptimes' }" @click="
:class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'laptimes') }" () => {
state.activetab = 'laptimes';
}
"
:class="{
'tab-active border-b-2 font-medium border-blue-500':
state.activetab === 'laptimes',
}"
class="tab tab-underline py-4 px-6 block" class="tab tab-underline py-4 px-6 block"
type="button" type="button"
>{{ $t('lap_times') }}</button> >
{{ $t("lap_times") }}
</button>
</div> </div>
<div class="flex-none"> <div class="flex-none">
<button <button
@click="() => { state.activetab = 'sponsorings' }" @click="
:class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'sponsorings') }" () => {
state.activetab = 'sponsorings';
}
"
:class="{
'tab-active border-b-2 font-medium border-blue-500':
state.activetab === 'sponsorings',
}"
class="tab tab-underline py-4 px-6 block" class="tab tab-underline py-4 px-6 block"
type="button" type="button"
>{{ $t('sponsoring') }}</button> >
{{ $t("sponsoring") }}
</button>
</div> </div>
</div> </div>
<div v-if="(state.activetab === 'profile')" class="tab-content block"> <div v-if="state.activetab === 'profile'" class="tab-content block">
<div class="py-4 w-full"> <div class="py-4 w-full">
<div class="flex flex-col"> <div class="flex flex-col">
<form class="form flex flex-wrap w-full"> <form class="form flex flex-wrap w-full">
<div class="w-full"> <div class="w-full">
<div class="form-element"> <div class="form-element">
<div class="text-lg">{{ $t('vorname') }}</div> <div class="text-lg">{{ $t("registrierungscode") }}</div>
<img alt="Registrierungscode" :src="state.barcode" />
<div class="text-lg">{{ $t("vorname") }}</div>
<p <p
class="h-10 w-full dark:bg-gray-800 rounded text-base outline-none dark:text-gray-100 text-gray-600 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out" class="
h-10
w-full
dark:bg-gray-800
rounded
text-base
outline-none
dark:text-gray-100
text-gray-600
py-1
px-3
leading-8
transition-colors
duration-200
ease-in-out
"
v-text="state.firstname" v-text="state.firstname"
/> />
</div> </div>
<div class="form-element"> <div class="form-element">
<div class="text-lg">{{ $t('mittelname') }}</div> <div class="text-lg">{{ $t("mittelname") }}</div>
<p <p
class="h-10 w-full dark:bg-gray-800 rounded text-base outline-none dark:text-gray-100 text-gray-600 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out" class="
h-10
w-full
dark:bg-gray-800
rounded
text-base
outline-none
dark:text-gray-100
text-gray-600
py-1
px-3
leading-8
transition-colors
duration-200
ease-in-out
"
v-text="state.middlename" v-text="state.middlename"
/> />
</div> </div>
<div class="form-element"> <div class="form-element">
<div class="text-lg">{{ $t('nachname') }}</div> <div class="text-lg">{{ $t("nachname") }}</div>
<p <p
class="h-10 w-full dark:bg-gray-800 rounded text-base outline-none dark:text-gray-100 text-gray-600 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out" class="
h-10
w-full
dark:bg-gray-800
rounded
text-base
outline-none
dark:text-gray-100
text-gray-600
py-1
px-3
leading-8
transition-colors
duration-200
ease-in-out
"
v-text="state.lastname" v-text="state.lastname"
/> />
</div> </div>
<div class="form-element"> <div class="form-element">
<div class="text-lg">{{ $t('e_mail_adress') }}</div> <div class="text-lg">{{ $t("e_mail_adress") }}</div>
<p <p
class="h-10 w-full dark:bg-gray-800 rounded text-base outline-none dark:text-gray-100 text-gray-600 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out" class="
h-10
w-full
dark:bg-gray-800
rounded
text-base
outline-none
dark:text-gray-100
text-gray-600
py-1
px-3
leading-8
transition-colors
duration-200
ease-in-out
"
v-text="state.email" v-text="state.email"
/> />
</div> </div>
<div class="form-element"> <div class="form-element">
<div class="text-lg">{{ $t('phone_number') }}</div> <div class="text-lg">{{ $t("phone_number") }}</div>
<p <p
class="h-10 w-full dark:bg-gray-800 rounded text-base outline-none dark:text-gray-100 text-gray-600 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out" class="
h-10
w-full
dark:bg-gray-800
rounded
text-base
outline-none
dark:text-gray-100
text-gray-600
py-1
px-3
leading-8
transition-colors
duration-200
ease-in-out
"
v-text="state.phone" v-text="state.phone"
/> />
</div> </div>
@@ -191,7 +397,7 @@
</div> </div>
</div> </div>
</div> </div>
<div v-if="(state.activetab === 'laptimes')" class="tab-content block"> <div v-if="state.activetab === 'laptimes'" class="tab-content block">
<div class="py-4 w-full"> <div class="py-4 w-full">
<section class="text-gray-400 dark:bg-gray-900 body-font"> <section class="text-gray-400 dark:bg-gray-900 body-font">
<div class="container mx-auto"> <div class="container mx-auto">
@@ -201,41 +407,223 @@
class="table-auto w-full text-left whitespace-no-wrap" class="table-auto w-full text-left whitespace-no-wrap"
> >
<thead <thead
class="text-black bg-gray-300 dark:text-white text-sm dark:bg-gray-800" class="
text-black
bg-gray-300
dark:text-white
text-sm
dark:bg-gray-800
"
> >
<tr> <tr>
<th <th
class="px-4 py-3 title-font tracking-wider font-medium" class="
>{{ $t('distance') }}</th> px-4
py-3
title-font
tracking-wider
font-medium
"
>
{{ $t("distance") }}
</th>
<th <th
class="px-4 py-3 title-font tracking-wider font-medium" class="
>{{ $t('lap_time') }}</th> px-4
py-3
title-font
tracking-wider
font-medium
"
>
{{ $t("lap_time") }}
</th>
</tr> </tr>
</thead> </thead>
<tbody class="text-gray-900 dark:text-gray-50"> <tbody class="text-gray-900 dark:text-gray-50">
<tr v-for="s in state.scans" :key="s.id"> <tr v-for="s in state.scans" :key="s.id">
<td class="px-4 py-3"> <td class="px-4 py-3">
<span v-text="s.distance"></span>m <span v-text="s.distance"></span>
</td> </td>
<td class="px-4 py-3" v-text="s.lapTime"></td> <td class="px-4 py-3" v-text="s.lapTime"></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div v-else class="text-center font-bold text-black dark:text-white text-2xl"> <div
v-else
class="
text-center
font-bold
text-black
dark:text-white
text-2xl
"
>
<img <img
src="../assets/empty_laps.svg" src="../assets/empty_laps.svg"
style="height:25rem; margin:0 auto;" style="height: 25rem; margin: 0 auto"
:alt="[[$t('no_laps_scans_were_recorded_yet')]]" :alt="[[$t('no_laps_scans_were_recorded_yet')]]"
/> />
{{ $t('no_laps_scans_were_recorded_yet') }} {{ $t("no_laps_scans_were_recorded_yet") }}
</div> </div>
</div> </div>
</div> </div>
</section> </section>
</div> </div>
</div> </div>
<div v-if="(state.activetab === 'sponsorings')" class="tab-content block"> <div
<div class="py-4 w-full">coming soon...</div> v-if="state.activetab === 'sponsorings'"
class="tab-content block"
>
<div class="py-4 w-full">
<section class="text-gray-400 dark:bg-gray-900 body-font">
<div class="container mx-auto">
<div class="lg:w-2/3 w-full mx-auto overflow-auto">
<table
v-if="state.sponsorings.length > 0"
class="table-auto w-full text-left whitespace-no-wrap"
>
<thead
class="
text-black
bg-gray-300
dark:text-white
text-sm
dark:bg-gray-800
"
>
<tr>
<th
class="
px-4
py-3
title-font
tracking-wider
font-medium
"
>
Name
</th>
<th
class="
px-4
py-3
title-font
tracking-wider
font-medium
"
>
{{ $t("amount_per_kilometer_in_eur") }}
</th>
<th
class="
px-4
py-3
title-font
tracking-wider
font-medium
"
>
{{ $t("current_total_amount_in_eur") }}
</th>
</tr>
</thead>
<tbody class="text-gray-900 dark:text-gray-50">
<tr v-for="s in state.sponsorings" :key="s.id">
<td class="px-4 py-3">
<span v-text="s.donor.firstname"></span>
<span v-if="s.donor.middlename">
<span v-text="s.donor.middlename"></span>
</span>
<span v-text="s.donor.lastname"></span>
</td>
<td class="px-4 py-3">
<span
v-text="
(s.amountPerDistance / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })
"
></span
>€
</td>
<td class="px-4 py-3">
<span
v-text="
(s.amount / 100)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })
"
></span
>€
</td>
</tr>
</tbody>
<tfoot class="text-gray-900 dark:text-gray-50">
<tr>
<td class="px-4 py-3">{{ $t("total") }}</td>
<td class="px-4 py-3">
<span
v-text="
(
state.sponsorings.reduce(function (
sum,
current
) {
return sum + current.amountPerDistance;
},
0) / 100
)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })
"
></span
>€
</td>
<td class="px-4 py-3">
<span
v-text="
(
state.sponsorings.reduce(function (
sum,
current
) {
return sum + current.amount;
},
0) / 100
)
.toFixed(2)
.toLocaleString('de-DE', { valute: 'EUR' })
"
></span
>€
</td>
</tr>
</tfoot>
</table>
<div
v-else
class="
text-center
font-bold
text-black
dark:text-white
text-2xl
"
>
<img
src="../assets/empty_laps.svg"
style="height: 25rem; margin: 0 auto"
:alt="[
[$t('no_sponsorings_for_you_were_recorded_yet')],
]"
/>
{{ $t("no_sponsorings_for_you_were_recorded_yet") }}
</div>
</div>
</div>
</section>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -245,26 +633,46 @@
<script setup> <script setup>
import { reactive } from "vue"; import { reactive } from "vue";
import { useToast } from "vue-toastification"; import { TYPE, useToast } from "vue-toastification";
import axios from "redaxios"; import axios from "redaxios";
import bwipjs from "bwip-js";
function textToBase64Barcode(text) {
var canvas = document.createElement("canvas");
bwipjs.toCanvas(canvas, {
bcid: config.codeformat || "code39",
text: text,
scale: 3,
height: 10,
// width: 10,
includetext: true,
textxalign: "center",
backgroundcolor: "ffffff",
});
return canvas.toDataURL("image/png");
}
const state = reactive({ const state = reactive({
barcode: "",
phone: "", phone: "",
email: "", email: "",
firstname: "", firstname: "",
middlename: "", middlename: "",
lastname: "", lastname: "",
scans: [], scans: [],
sponsorings: [],
group: "", group: "",
activetab: "profile", activetab: "profile",
delete_active: false, delete_active: false,
}) fullobject: {},
});
const toast = useToast(); const toast = useToast();
const props = defineProps({ const props = defineProps({
token: String token: String,
}) });
const accesstoken = atob(props.token); const accesstoken = atob(props.token);
axios.get(`${config.baseurl}api/runners/me/${accesstoken}`) axios
.get(`${config.baseurl}api/runners/me/${accesstoken}`)
.then(({ data }) => { .then(({ data }) => {
state.phone = data.phone; state.phone = data.phone;
state.email = data.email; state.email = data.email;
@@ -272,30 +680,102 @@ axios.get(`${config.baseurl}api/runners/me/${accesstoken}`)
state.middlename = data.middlename; state.middlename = data.middlename;
state.lastname = data.lastname; state.lastname = data.lastname;
state.group = data.group; state.group = data.group;
}).catch((error) => { state.sponsorings = data.distanceDonations;
toast.error("An error occured while loading your profile data"); state.fullobject = data;
state.barcode = textToBase64Barcode(data.id ?? "???");
}) })
axios.get(`${config.baseurl}api/runners/me/${accesstoken}/scans`) .catch((error) => {
toast.clear();
toast.error("Profil konnte nicht geladen werden...");
});
axios
.get(`${config.baseurl}api/runners/me/${accesstoken}/scans`)
.then(({ data }) => { .then(({ data }) => {
data.map(function(s) { data.map(function (s) {
s.lapTime = Math.floor(s.lapTime / 60) + 'min ' + (Math.floor(s.lapTime % 60) + "").padStart(2, "0") + "s" s.lapTime =
Math.floor(s.lapTime / 60) +
"min " +
(Math.floor(s.lapTime % 60) + "").padStart(2, "0") +
"s";
s.distance =
Math.floor(s.distance / 1000) +
"km " +
(Math.floor(s.distance % 1000) + "").padStart(3, "0") +
"m";
return s; return s;
}) });
data.filter(s => s.valid === true); data.filter((s) => s.valid === true);
state.scans = data; state.scans = data;
}).catch((error) => {
toast.error("An error occured while loading your profile data");
}) })
.catch((error) => {
toast.error("Profil konnte nicht geladen werden...");
});
function delete_me() { function delete_me() {
toast("Deletion in progress..."); toast.clear();
let url = `${config.baseurl}api/runners/me/${accesstoken}?force=true` toast("Profil wird gelöscht...");
axios.delete(url) let url = `${config.baseurl}api/runners/me/${accesstoken}?force=true`;
axios
.delete(url)
.then(() => { .then(() => {
toast("All Data deleted!"); toast.clear();
toast("Alle Daten gelöscht!");
location.replace(`${config.baseurl_selfservice}`); location.replace(`${config.baseurl_selfservice}`);
}) })
.catch((error) => { .catch((error) => {
toast.error("An error occured while deleting your profile data"); toast.clear();
toast.error("Profil konnte nicht gelöscht werden...");
}); });
} }
function get_certificate() {
toast("Urkunde wird generiert...");
const browserlocale = (
(navigator.languages && navigator.languages[0]) ||
""
).substr(0, 2);
let url = `${config.baseurl_documentserver}certificates?locale=${browserlocale}&download=true&key=${config.documentserver_key}`;
let postdata = Object.assign({}, state.fullobject);
postdata.group = {
name: postdata.group,
};
postdata = [postdata];
axios
.post(url, postdata, {
responseType: "blob",
})
.then((response) => {
console.log(response);
if (response.status != "200") {
toast.error("Urkunde konnte nicht generiert werden...");
} else {
var fileURL = window.URL.createObjectURL(
new Blob([response.data], { type: "application/pdf" })
);
var fileLink = document.createElement("a");
fileLink.href = fileURL;
fileLink.setAttribute("download", "Certificate.pdf");
document.body.appendChild(fileLink);
fileLink.click();
fileLink.remove();
toast.clear();
toast("Urkunde generiert!", { type: TYPE.SUCCESS });
}
})
.catch((err) => {
console.error(err);
toast.clear();
toast.error("Urkunde konnte nicht generiert werden...");
});
}
function get_registration() {
toast.clear();
toast("Registrierungscode wird generiert...");
var a = document.createElement("a");
a.href = state.barcode;
a.download = "LfK23_Registrierungscode.png";
a.click();
toast.clear();
toast("Registrierungscode generiert!", { type: TYPE.SUCCESS });
}
</script> </script>

View File

@@ -61,7 +61,7 @@
</div> </div>
<div class="mt-2"> <div class="mt-2">
<a <a
href="./register/" href="/selfservice/register/"
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" 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"
>{{ $t('register_now_small') }}</a> >{{ $t('register_now_small') }}</a>
</div> </div>
@@ -88,16 +88,16 @@ const state = reactive({
const toast = useToast(); const toast = useToast();
function resendMail() { function resendMail() {
if (isEmail(user_email.value)) { if (isEmail(user_email.value)) {
toast("sending password reset mail..."); toast("Login-Link wird angefordert...");
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2); const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
axios.post(`${config.baseurl}api/runners/forgot?mail=${user_email.value}&locale=${browserlocale}`) axios.post(`${config.baseurl}api/runners/forgot?mail=${user_email.value}&locale=${browserlocale}`)
.then(({ data }) => { .then(({ data }) => {
console.log(data); console.log(data);
toast("sent password reset mail to " + user_email.value + "!"); toast("Login-Link gesendet an " + user_email.value + "!");
}) })
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);
toast("user does not exist..."); toast("Fehler beim Anfordern des Login-Links...");
}); });
} }
} }

View File

@@ -200,7 +200,7 @@
<a <a
target="_blank" target="_blank"
rel="noreferrer,noopener" rel="noreferrer,noopener"
href href="https://lauf-fuer-kaya.de/datenschutz/"
class="underline" class="underline"
>{{ $t('tos') }}</a> >{{ $t('tos') }}</a>
{{ $t('i_accept_end') }} {{ $t('i_accept_end') }}
@@ -234,22 +234,6 @@
>{{ $t('registrieren') }}</button> >{{ $t('registrieren') }}</button>
</div> </div>
</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">{{ $t('already_have_an_account') }}</span>
</div>
</div>
<div class="mt-6">
<a
href="./login"
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('go_to_login') }}</a>
</div>
</div>
</div> </div>
</div> </div>
</template> </template>
@@ -293,7 +277,7 @@ const state = reactive({
const toast = useToast(); const toast = useToast();
function login() { function login() {
userdetails = userdetails.value; userdetails = userdetails.value;
if (userdetails.phone === "" || isMobilePhone(userdetails.phone)) { if (userdetails?.phone === "" || isMobilePhone(userdetails.phone)) {
if (isEmail(userdetails.mail)) { if (isEmail(userdetails.mail)) {
let postdata = { let postdata = {
"email": userdetails.mail, "email": userdetails.mail,
@@ -317,7 +301,7 @@ function login() {
if (state.org_name !== '' && state.org_teams.length > 0) { if (state.org_name !== '' && state.org_teams.length > 0) {
postdata.team = org_team.value; postdata.team = org_team.value;
} }
toast("registration in progress..."); toast("Registrierung läuft...");
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2); const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`; let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`;
if (props.token) { if (props.token) {