Compare commits

..

1 Commits

Author SHA1 Message Date
7ae0081d69 Merge pull request 'sync - 0.4.5' (#34) from dev into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #34
2021-04-01 16:46:05 +00:00
19 changed files with 763 additions and 5155 deletions

View File

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

View File

@@ -2,225 +2,9 @@
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.10.0](https://git.odit.services/lfk/selfservice/compare/0.9.0...0.10.0)
- 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)
#### [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)
> 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)
> 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)
- 🚀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)
- 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)
- Added building pipeline for current branch [`544542a`](https://git.odit.services/lfk/selfservice/commit/544542ac1e9717506676c1495c2d530eca833d31)
- Removed useless code [`713db5e`](https://git.odit.services/lfk/selfservice/commit/713db5e1e8fed5f38b3a5d19cfe870eff16eeda1)
- Now manually linking env and main [`67c0dae`](https://git.odit.services/lfk/selfservice/commit/67c0dae537df5842e89c0ed040c0fef02df01b69)
- Fixed post url and body [`0795ea3`](https://git.odit.services/lfk/selfservice/commit/0795ea318d80b764eee89462ad87da86aa7ce0ae)
- 🐞 fix home routes [`60dea51`](https://git.odit.services/lfk/selfservice/commit/60dea511b9fbb6d206ee531618e788e686fa6b5a)
#### [0.5.0](https://git.odit.services/lfk/selfservice/compare/0.4.5...0.5.0)
> 1 April 2021
- 🚀Bumped version to v0.5.0 [`676f0e8`](https://git.odit.services/lfk/selfservice/commit/676f0e83393be823ccb612846650a9a98bf7f0b3)
- Revert "🚀Bumped version to v0.5.0" [`27fd8f9`](https://git.odit.services/lfk/selfservice/commit/27fd8f9a9106294ae6522f2fff42dfbf84f06f82)
- 🚀Bumped version to v0.5.0 [`b8c1b8c`](https://git.odit.services/lfk/selfservice/commit/b8c1b8c43b6d050d239d836bbb6ace2504fdcd21)
- Merge pull request 'Runner self deletion feature/21-user_deletion' (#36) from feature/21-user_deletion into dev [`bd512e0`](https://git.odit.services/lfk/selfservice/commit/bd512e0651363f1f2543136d354d9ada9990d83d)
- Sorted translations [`cf0437c`](https://git.odit.services/lfk/selfservice/commit/cf0437c3a738d42154ed1336d6020b88661b462f)
- Added translations 🌍 [`ba3dedb`](https://git.odit.services/lfk/selfservice/commit/ba3dedb1643e2d5f1c2ab92224a11c1c8a82ae71)
- Added confirmation for profile deletion [`8773239`](https://git.odit.services/lfk/selfservice/commit/8773239244c064a888a4ad1f66298f2811fcc2ae)
- Added confirmation for profile deletion [`85b0549`](https://git.odit.services/lfk/selfservice/commit/85b0549a11927758c579cd08bc8015ae00105a84)
- Updated icons [`d710d4b`](https://git.odit.services/lfk/selfservice/commit/d710d4b68ff0e9515eb4a0a4ea0def7b3552e599)
- Added data deletion button [`619078c`](https://git.odit.services/lfk/selfservice/commit/619078cce8281bef520b05bf3e735c26d0752375)
- Content i18n run 🌍 [`175bb16`](https://git.odit.services/lfk/selfservice/commit/175bb168ae134009c26072b76cd74948aecc189f)
- Implemented basic deletion [`fc04e71`](https://git.odit.services/lfk/selfservice/commit/fc04e713110df161c481cb9a3b64e78b30d4f79b)
- Added translations [`8a24505`](https://git.odit.services/lfk/selfservice/commit/8a24505d64832001d6a44800f61f7e0705892046)
- Updated toasts and removed useless code [`7440fc4`](https://git.odit.services/lfk/selfservice/commit/7440fc404ea2a8e68e7ce896e8369700069b2021)
- Added error toast [`9751c2e`](https://git.odit.services/lfk/selfservice/commit/9751c2e9fd99650efab4d5edce3909c907ea9391)
- Merge pull request 'RELEASE 0.3.0' (#25) from dev into main [`1c19657`](https://git.odit.services/lfk/selfservice/commit/1c196579356a70f9d761f7f69d79033157570076)
#### [0.4.5](https://git.odit.services/lfk/selfservice/compare/0.4.4...0.4.5) #### [0.4.5](https://git.odit.services/lfk/selfservice/compare/0.4.4...0.4.5)
> 1 April 2021
- Merge pull request 'feature/32-registration-language' (#33) from feature/32-registration-language into dev [`#32`](https://git.odit.services/lfk/selfservice/issues/32) - Merge pull request 'feature/32-registration-language' (#33) from feature/32-registration-language into dev [`#32`](https://git.odit.services/lfk/selfservice/issues/32)
- 🚀Bumped version to v0.4.5 [`efcb7f5`](https://git.odit.services/lfk/selfservice/commit/efcb7f56745aa3f347eb98399ee1bcb68a157e9d)
- 🐞 fix /profile/ router on register [`52a0828`](https://git.odit.services/lfk/selfservice/commit/52a082841d47d1ed9c0997776a0784285a3f6ba7) - 🐞 fix /profile/ router on register [`52a0828`](https://git.odit.services/lfk/selfservice/commit/52a082841d47d1ed9c0997776a0784285a3f6ba7)
- pass browser locale to api/runners/register/ [`e3f7497`](https://git.odit.services/lfk/selfservice/commit/e3f7497af5860b2472b6cdfd33090b9d68b9fb49) - pass browser locale to api/runners/register/ [`e3f7497`](https://git.odit.services/lfk/selfservice/commit/e3f7497af5860b2472b6cdfd33090b9d68b9fb49)

View File

@@ -1,10 +1,9 @@
FROM registry.odit.services/hub/library/node:15.9.0-alpine3.13 FROM 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 registry.odit.services/library/nginx-brotli:3.15 FROM fholzer/nginx-brotli:v1.19.1
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

View File

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

@@ -1,17 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<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>
<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

@@ -7,21 +7,15 @@ 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;
@@ -41,24 +35,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,52 +1,50 @@
{ {
"name": "@odit/lfk-selfservice", "name": "@odit/lfk-selfservice",
"version": "0.10.0", "version": "0.4.5",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
"release": "release-it", "release": "release-it --only-version"
"postbuild": "node env_fix.js" },
}, "dependencies": {
"dependencies": { "marked": "2.0.1",
"bwip-js": "3.2.2", "redaxios": "0.4.1",
"marked": "2.0.3", "toastify-js": "1.10.0",
"redaxios": "0.4.1", "validator": "13.5.2",
"toastify-js": "1.10.0", "vue-i18n": "9.0.0",
"validator": "13.5.2", "vue-toastification": "2.0.0-rc.1",
"vue-i18n": "9.1.4", "vue": "3.0.9",
"vue-toastification": "2.0.0-rc.1", "vue-router": "4.0.5"
"vue": "3.0.9", },
"vue-router": "4.0.5" "devDependencies": {
}, "@tailwindcss/jit": "0.1.18",
"devDependencies": { "@tailwindcss/aspect-ratio": "0.2.0",
"@tailwindcss/jit": "0.1.18", "@tailwindcss/forms": "0.3.2",
"@tailwindcss/aspect-ratio": "0.2.0", "@tailwindcss/line-clamp": "0.2.0",
"@tailwindcss/forms": "0.3.2", "@tailwindcss/typography": "0.4.0",
"@tailwindcss/line-clamp": "0.2.0", "@vitejs/plugin-vue": "1.2.1",
"@tailwindcss/typography": "0.4.0", "@vue/compiler-sfc": "3.0.10",
"@vitejs/plugin-vue": "1.2.1", "autoprefixer": "10.2.5",
"@vue/compiler-sfc": "3.0.11", "tailwindcss": "2.0.4",
"autoprefixer": "10.2.5", "release-it": "14.5.0",
"tailwindcss": "2.1.1", "vite": "2.1.5"
"release-it": "14.6.1", },
"vite": "2.1.5" "release-it": {
}, "git": {
"release-it": { "commit": true,
"git": { "requireCleanWorkingDir": false,
"commit": true, "commitMessage": "🚀Bumped version to v${version}",
"requireCleanWorkingDir": false, "requireBranch": "dev",
"commitMessage": "🚀Bumped version to v${version}", "push": false,
"requireBranch": "dev", "tag": true,
"push": true, "tagName": null,
"tag": true, "tagAnnotation": "v${version}"
"tagName": null, },
"tagAnnotation": "v${version}" "npm": {
}, "publish": false
"npm": { },
"publish": false "hooks": {
}, "after:bump": "npx auto-changelog --commit-limit false -p -u --hide-credit && git add CHANGELOG.md && node order_i18n.js && git add src/locales"
"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" }
} }
}
}

3129
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,12 +5,8 @@ const config = {
baseurl: '', baseurl: '',
// optional, will fallback to /selfservice/ // optional, will fallback to /selfservice/
baseurl_selfservice: '/selfservice/', baseurl_selfservice: '/selfservice/',
// full url (including fqdn) // optional, will fallback to /imprint
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 baseurl_selfservice/privacy // optional, will fallback to /privacy
url_privacy: '', url_privacy: ''
}; };

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 © 2023 + proudly powered by Lauf für Kaya! Selfservice - Copyright © 2021 + 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 || config.baseurl_selfservice + "imprint" imprint_url: config.url_imprint || "/imprint/"
, privacy_url: config.url_privacy || config.baseurl_selfservice + "privacy" , privacy_url: config.url_privacy || "/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="/selfservice/reset" class="text-gray-900 underline">Passwort vergessen?</a> <a href="./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="/selfservice/register" 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" 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: "Login läuft...", text: "This is a toast",
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="/selfservice/reset" class="text-gray-900 underline">Passwort vergessen?</a> <a href="./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="/selfservice/register" 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" 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: "Login läuft...", text: "This is a toast",
duration: 3000, duration: 3000,
}).showToast(); }).showToast();
}); });

View File

@@ -1,19 +1,10 @@
{ {
"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?", "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",
"configuration_error": "Konfigurationsfehler", "configuration_error": "Konfigurationsfehler",
"confirm_delete_all_of_my_data": "Bestätigen, meine 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",
"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",
"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 ",
@@ -22,14 +13,10 @@
"imprint": "Impressum", "imprint": "Impressum",
"lap_time": "Rundenzeit", "lap_time": "Rundenzeit",
"lap_times": "Rundenzeiten", "lap_times": "Rundenzeiten",
"lost_your_registration_mail": "Brauchen Sie einen neuen Login-Link?",
"main_page_text": "Hier können Sie sich für den Lauf Für Kaya! registrieren oder ihr Läuferprofil verwalten.", "main_page_text": "Hier können Sie sich für den Lauf Für Kaya! registrieren oder ihr Läuferprofil verwalten.",
"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?",
"organization": "Organisation",
"ort": "Ort", "ort": "Ort",
"phone_number": "Telefonnummer", "phone_number": "Telefonnummer",
"please_provide_a_valid_zipcode": "Bitte geben Sie eine gültige Postleitzahl an...", "please_provide_a_valid_zipcode": "Bitte geben Sie eine gültige Postleitzahl an...",
@@ -39,22 +26,16 @@
"profile": "Profil", "profile": "Profil",
"provide_address": "Adresse angeben?", "provide_address": "Adresse angeben?",
"register": { "register": {
"register_now": "Jetzt für den Lauf für Kaya! 2023 registrieren." "register_now": "Jetzt für den Lauf für Kaya! 2021 registrieren."
}, },
"register_now": "Jetzt registrieren!", "register_now": "Jetzt registrieren!",
"register_now_small": "Jetzt registrieren",
"registrieren": "Registrieren", "registrieren": "Registrieren",
"registrierungscode": "Registrierungscode",
"resend_the_registration_mail": "Login-Link anfordern",
"save_changes": "Änderungen speichern", "save_changes": "Änderungen speichern",
"sponsoring": "Sponsoring", "sponsoring": "Sponsoring",
"strasse": "Straße", "strasse": "Straße",
"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_not_provided_a_valid_access_key": "Sie haben keinen gültigen Zugangsschlüssel angegeben..."
} }

View File

@@ -1,19 +1,10 @@
{ {
"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!",
"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",
"configuration_error": "Configuration error", "configuration_error": "Configuration error",
"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",
"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 ",
@@ -22,13 +13,10 @@
"imprint": "Imprint", "imprint": "Imprint",
"lap_time": "Lap time", "lap_time": "Lap time",
"lap_times": "Lap times", "lap_times": "Lap times",
"lost_your_registration_mail": "Lost your registration mail?",
"main_page_text": "Here you can register for the Lauf Für Kaya! or manage your runner profile.", "main_page_text": "Here you can register for the Lauf Für Kaya! or manage your runner profile.",
"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?",
"organization": "Organization", "organization": "Organization",
"ort": "City", "ort": "City",
"phone_number": "Phone Number", "phone_number": "Phone Number",
@@ -39,21 +27,17 @@
"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! 2023." "register_now": "Register now for Lauf für Kaya! 2021."
}, },
"register_now": "Register now!", "register_now": "Register now!",
"register_now_small": "Register now",
"registrieren": "Register Now", "registrieren": "Register Now",
"resend_the_registration_mail": "Send me a login link",
"save_changes": "Save changes", "save_changes": "Save changes",
"sponsoring": "Sponsoring", "sponsoring": "Sponsoring",
"strasse": "Street/ Block", "strasse": "Street/ Block",
"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!"
"you_have_not_provided_a_valid_access_key": "You have not provided a valid access key..."
} }

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="/selfservice/register/" href="./register"
>{{ $t('register_now') }}</a> >{{ $t('register_now') }}</a>
<a <a
href="/selfservice/profile/" 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" 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>

File diff suppressed because it is too large Load Diff

View File

@@ -1,104 +1 @@
<template> <template>You have not provided a valid access key...</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! - {{ $t('profile') }}</h1>
<p class="mx-auto leading-relaxed text-base text-center">
<!-- {{ $t('you_have_not_provided_a_valid_access_key') }}
<br /> -->
{{ $t('access_is_only_provided_via_your_email_link') }}
</p>
<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('lost_your_registration_mail') }}</span>
</div>
</div>
<div class="mt-4">
<label for="email_address" class="block font-medium">
{{ $t('e_mail_adress') }}
<span class="font-bold">*</span>
</label>
<input
v-model="user_email"
name="email_address"
id="email_address"
autocomplete="email"
:placeholder="[[$t('e_mail_adress')]]"
type="email"
:class="{ 'border-red-500': (!isEmail(user_email)), 'border-green-300': (isEmail(user_email)) }"
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"
/>
<p
v-if="!isEmail(user_email)&&user_email!==''"
class="text-sm"
>{{ $t('please_provide_valid_mail') }}</p>
</div>
<div class="mt-2">
<button
:disabled="(!state.submit_enabled)"
:class="{ 'opacity-50': (!state.submit_enabled), 'cursor-not-allowed': (!state.submit_enabled) }"
@click="resendMail"
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>
</div>
</div>
<div class="mt-12">
<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('not_registered_yet') }}</span>
</div>
</div>
<div class="mt-2">
<a
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"
>{{ $t('register_now_small') }}</a>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { computed, ref, reactive, defineProps } from "vue";
import axios from "redaxios";
import isEmail from 'validator/es/lib/isEmail';
import isMobilePhone from 'validator/es/lib/isMobilePhone';
import isPostalCode from 'validator/es/lib/isPostalCode';
import { TYPE, useToast } from "vue-toastification";
let user_email = ref("");
//
const state = reactive({
org_name: "",
org_teams: [],
submit_enabled: computed(() => isEmail(user_email.value))
})
const toast = useToast();
function resendMail() {
if (isEmail(user_email.value)) {
toast("Login-Link wird angefordert...");
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
axios.post(`${config.baseurl}api/runners/login?mail=${user_email.value}&locale=${browserlocale}`)
.then(({ data }) => {
console.log(data);
toast("Login-Link gesendet an " + user_email.value + "!");
})
.catch((error) => {
console.log(error);
toast("Fehler beim Anfordern des Login-Links...", { type: TYPE.ERROR });
});
}
}
</script>

View File

@@ -1,566 +1,338 @@
<template> <template>
<div <div class="min-h-screen flex items-center justify-center">
class="min-h-screen flex items-center justify-center" <div class="max-w-md w-full py-12 px-6">
v-if="registrationState === 'registered'" <img class="mx-auto h-24 w-auto" src="/favicon.png" alt />
> <h1
<div class="max-w-md w-full py-12 px-6"> class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center"
<img class="mx-auto h-24 w-auto" src="/favicon.png" alt /> >Lauf für Kaya! - {{ $t('registrieren') }}</h1>
<h1 class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center"> <p class="mx-auto leading-relaxed text-base text-center">{{ $t('register.register_now') }}</p>
Lauf für Kaya! - Registriert <p
</h1> v-if="state.org_name !== ''"
<p class="mx-auto leading-relaxed text-base text-center"> class="mx-auto leading-relaxed text-base text-center"
Bitte klicken Sie zum Fortfahren auf den Link, den wir an >{{ $t('organization') }}: {{ state.org_name }}</p>
<b class="font-bold">{{ userdetails.mail }}</b> geschickt haben. <p
</p> v-if="state.org_name !== '' && state.org_teams.length > 0"
</div> class="mx-auto leading-relaxed text-base text-center"
</div> >Team:</p>
<div class="min-h-screen flex items-center justify-center" v-else> <select
<div class="max-w-md w-full py-12 px-6"> v-model="org_team"
<img class="mx-auto h-24 w-auto" src="/favicon.png" alt /> v-if="state.org_name !== '' && state.org_teams.length > 0"
<h1 class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center"> 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"
Lauf für Kaya! - {{ $t("registrieren") }} >
</h1> <option v-for="t in state.org_teams" :key="t.id" :value="t.id">{{ t.name }}</option>
<p class="mx-auto leading-relaxed text-base text-center"> </select>
{{ $t("register.register_now") }} <p
</p> v-if="state.org_name === ''"
<p class="mx-auto leading-relaxed text-base text-center"
v-if="state.org_name !== ''" >Bürgerlauf</p>
class="mx-auto leading-relaxed text-base text-center" <div class="mt-4">
> <label for="first_name" class="block font-medium">
{{ $t("organization") }}: {{ state.org_name }} {{ $t('vorname') }}
</p> <span class="font-bold">*</span>
<p </label>
v-if="state.org_name !== '' && state.org_teams.length > 0" <input
class="mx-auto leading-relaxed text-base text-center" v-model="userdetails.firstname"
> name="firstname"
Team: id="first_name"
</p> autocomplete="off"
<select :placeholder="[[$t('vorname')]]"
v-model="org_team" type="text"
v-if="state.org_name !== '' && state.org_teams.length > 0" :class="{ 'border-red-500': (!userdetails.firstname.trim()), 'border-green-300': (userdetails.firstname.trim()) }"
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"
w-full />
border <!-- -->
bg-white <label for="middle_name" class="block font-medium">{{ $t('mittelname') }}</label>
rounded <input
px-3 v-model="userdetails.middlename"
py-2 name="middlename"
outline-none id="middle_name"
block autocomplete="off"
mt-1 :placeholder="[[$t('mittelname')]]"
text-sm type="text"
dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 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"
form-select />
focus:border-purple-400 focus:outline-none focus:shadow-outline-purple <!-- -->
dark:focus:shadow-outline-gray <label for="last_name" class="block font-medium">
" {{ $t('nachname') }}
> <span class="font-bold">*</span>
<option v-for="t in state.org_teams" :key="t.id" :value="t.id"> </label>
{{ t.name }} <input
</option> v-model="userdetails.lastname"
</select> name="lastname"
<p id="last_name"
v-if="state.org_name === ''" autocomplete="off"
class="mx-auto leading-relaxed text-base text-center" :placeholder="[[$t('nachname')]]"
> type="text"
Bürgerlauf :class="{ 'border-red-500': (!userdetails.lastname.trim()), 'border-green-300': (userdetails.lastname.trim()) }"
</p> 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="mt-4"> />
<label for="first_name" class="block font-medium"> <!-- -->
{{ $t("vorname") }} <label for="email_address" class="block font-medium">
<span class="font-bold">*</span> {{ $t('e_mail_adress') }}
</label> <span class="font-bold">*</span>
<input </label>
v-model="userdetails.firstname" <input
name="firstname" v-model="userdetails.mail"
id="first_name" name="email_address"
autocomplete="off" id="email_address"
:placeholder="[[$t('vorname')]]" autocomplete="off"
type="text" :placeholder="[[$t('e_mail_adress')]]"
:class="{ type="email"
'border-red-500': !userdetails.firstname.trim(), :class="{ 'border-red-500': (!isEmail(userdetails.mail)), 'border-green-300': (isEmail(userdetails.mail)) }"
'border-green-300': userdetails.firstname.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"
}" />
class=" <p v-if="!isEmail(userdetails.mail)" class="text-sm">{{ $t('please_provide_valid_mail') }}</p>
dark:bg-gray-800 <!-- -->
mt-1 <label for="phone" class="select-none block font-medium">{{ $t('phone_number') }}</label>
block <input
w-full v-model="userdetails.phone"
shadow-sm name="phone"
sm:text-sm id="phone"
border-gray-300 border-2 autocomplete="off"
bg-gray-50 :placeholder="[[$t('phone_number')]]"
text-gray-500 type="text"
rounded-md :class="{ 'border-red-500': (!isMobilePhone(userdetails.phone) && userdetails.phone.trim()), 'border-green-300': (isMobilePhone(userdetails.phone) && userdetails.phone.trim()) }"
p-2 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"
" />
/> <p
<!-- --> v-if="(!isMobilePhone(userdetails.phone) && userdetails.phone.trim())"
<label for="middle_name" class="block font-medium">{{ class="text-sm"
$t("mittelname") >{{ $t('this_is_not_a_valid_international_phone_number') }}</p>
}}</label> <!-- -->
<input <div class="grid grid-cols-6 mt-6">
v-model="userdetails.middlename" <div class="col-span-6"></div>
name="middlename" <div class="flex items-start col-span-6">
id="middle_name" <div class="flex items-center h-5">
autocomplete="off" <input
:placeholder="[[$t('mittelname')]]" v-model="provide_address"
type="text" id="address_activated"
class=" name="address_activated"
dark:bg-gray-800 type="checkbox"
mt-1 class="h-4 w-4 text-indigo-600 border-gray-300 rounded"
block />
w-full </div>
shadow-sm <div class="ml-3 text-sm">
sm:text-sm <label
border-gray-300 border-2 for="address_activated"
bg-gray-50 class="font-medium text-gray-400 select-none"
text-gray-500 >{{ $t('provide_address') }}</label>
rounded-md </div>
p-2 </div>
" <div v-if="provide_address === true" class="col-span-6">
/> <div class="col-span-6">
<!-- --> <label for="street" class="block font-medium">
<label for="last_name" class="block font-medium"> {{ $t('strasse') }}
{{ $t("nachname") }} <span class="font-bold">*</span>
<span class="font-bold">*</span> </label>
</label> <input
<input v-model="userdetails.address.street"
v-model="userdetails.lastname" type="text"
name="lastname" name="street"
id="last_name" :placeholder="[[$t('strasse')]]"
autocomplete="off" id="street"
:placeholder="[[$t('nachname')]]" autocomplete="street-address"
type="text" :class="{ 'border-red-500': (!userdetails.address.street.trim()), 'border-green-300': (userdetails.address.street.trim()) }"
: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': !userdetails.lastname.trim(), />
'border-green-300': userdetails.lastname.trim(), </div>
}" <div class="col-span-6">
class=" <label for="address2" class="block font-medium">{{ $t('apartment_suite_etc') }}</label>
dark:bg-gray-800 <input
mt-1 v-model="userdetails.address.address2"
block type="text"
w-full name="address2"
shadow-sm :placeholder="[[$t('apartment_suite_etc')]]"
sm:text-sm id="address2"
border-gray-300 border-2 autocomplete="street-address"
bg-gray-50 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"
text-gray-500 />
rounded-md </div>
p-2 <div class="col-span-6 sm:col-span-6 lg:col-span-2">
" <label for="city" class="block font-medium">
/> {{ $t('ort') }}
<!-- --> <span class="font-bold">*</span>
<label for="email_address" class="block font-medium"> </label>
{{ $t("e_mail_adress") }} <input
<span class="font-bold">*</span> v-model="userdetails.address.city"
</label> type="text"
<input name="city"
v-model="userdetails.mail" :placeholder="[[$t('ort')]]"
name="email_address" id="city"
id="email_address" :class="{ 'border-red-500': (!userdetails.address.city.trim()), 'border-green-300': (userdetails.address.city.trim()) }"
autocomplete="off" 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"
:placeholder="[[$t('e_mail_adress')]]" />
type="email" </div>
:class="{ <div class="col-span-6 sm:col-span-3 lg:col-span-2">
'border-red-500': !isEmail(userdetails.mail), <label for="postal_code" class="block font-medium">
'border-green-300': isEmail(userdetails.mail), {{ $t('plz') }}
}" <span class="font-bold">*</span>
class=" </label>
dark:bg-gray-800 <input
mt-1 v-model="userdetails.address.zipcode"
block type="text"
w-full name="postal_code"
shadow-sm :placeholder="[[$t('plz')]]"
sm:text-sm id="postal_code"
border-2 autocomplete="postal-code"
bg-gray-50 :class="{ 'border-red-500': (!isPostalCode(userdetails.address.zipcode, 'DE')), 'border-green-300': (isPostalCode(userdetails.address.zipcode, 'DE')) }"
text-gray-500 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"
rounded-md />
p-2 </div>
" <p
/> v-if="!isPostalCode(userdetails.address.zipcode, 'DE')"
<p v-if="!isEmail(userdetails.mail)" class="text-sm"> class="text-sm"
{{ $t("please_provide_valid_mail") }} >{{ $t('please_provide_a_valid_zipcode') }}</p>
</p> </div>
<!-- --> </div>
<label for="phone" class="select-none block font-medium">{{ <div class="flex items-start mt-6">
$t("phone_number") <div class="flex items-center h-5">
}}</label> <input
<input v-model="agb_accepted"
v-model="userdetails.phone" id="agb_accepted"
name="phone" name="agb_accepted"
id="phone" type="checkbox"
autocomplete="off" class="h-4 w-4 text-indigo-600 border-gray-300 rounded"
:placeholder="[[$t('phone_number')]]" />
type="text" </div>
:class="{ <div class="ml-3 text-sm">
'border-red-500': <label for="agb_accepted" class="font-medium text-gray-400 select-none">
!isMobilePhone(userdetails.phone) && userdetails.phone.trim(), {{ $t('i_accept', { tos: $t('tos') }) }}
'border-green-300': <a
isMobilePhone(userdetails.phone) && userdetails.phone.trim(), target="_blank"
}" rel="noreferrer,noopener"
class=" href
dark:bg-gray-800 class="underline"
mt-1 >{{ $t('tos') }}</a>
block {{ $t('i_accept_end') }}
w-full <span class="font-bold">*</span>
shadow-sm </label>
sm:text-sm </div>
border-2 </div>
bg-gray-50 <div class="flex items-start mt-6">
text-gray-500 <div class="flex items-center h-5">
rounded-md <input
p-2 v-model="data_confirmed"
" id="data_confirmed"
/> name="data_confirmed"
<p type="checkbox"
v-if="!isMobilePhone(userdetails.phone) && userdetails.phone.trim()" class="h-4 w-4 text-indigo-600 border-gray-300 rounded"
class="text-sm" />
> </div>
{{ $t("this_is_not_a_valid_international_phone_number") }} <div class="ml-3 text-sm">
</p> <label for="data_confirmed" class="font-medium text-gray-400 select-none">
<!-- --> {{ $t('confirm_personal_data') }}
<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"> </div>
<div class="flex items-center h-5"> </div>
<input <div class="mt-6">
v-model="provide_address" <button
id="address_activated" @click="login"
name="address_activated" :disabled="(!state.submit_enabled)"
type="checkbox" :class="{ 'opacity-50': (!state.submit_enabled), 'cursor-not-allowed': (!state.submit_enabled) }"
class="h-4 w-4 text-indigo-600 border-gray-300 rounded" 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('registrieren') }}</button>
</div> </div>
<div class="ml-3 text-sm"> </div>
<label <div class="mt-6">
for="address_activated" <div class="relative">
class="font-medium text-gray-400 select-none" <div class="absolute inset-0 flex items-center">
>{{ $t("provide_address") }}</label <div class="w-full border-t border-gray-300"></div>
> </div>
</div> <div class="relative flex justify-center text-sm">
</div> <span class="px-2 bg-white dark:bg-gray-900">{{ $t('already_have_an_account') }}</span>
<div v-if="provide_address === true" class="col-span-6"> </div>
<div class="col-span-6"> </div>
<label for="street" class="block font-medium"> <div class="mt-6">
{{ $t("strasse") }} <a
<span class="font-bold">*</span> href="./login"
</label> 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"
<input >{{ $t('go_to_login') }}</a>
v-model="userdetails.address.street" </div>
type="text" </div>
name="street" </div>
:placeholder="[[$t('strasse')]]" </div>
id="street" </template>
autocomplete="street-address"
:class="{ <script setup>
'border-red-500': !userdetails.address.street.trim(), import { computed, ref, reactive, defineProps } from "vue";
'border-green-300': userdetails.address.street.trim(), import axios from "redaxios";
}" import isEmail from 'validator/es/lib/isEmail';
class=" import isMobilePhone from 'validator/es/lib/isMobilePhone';
dark:bg-gray-800 import isPostalCode from 'validator/es/lib/isPostalCode';
mt-1 import { useToast } from "vue-toastification";
block
w-full const props = defineProps({
shadow-sm token: String
sm:text-sm })
border-gray-300 border-2 if (props.token) {
bg-gray-50 axios.get(`${config.baseurl}api/organizations/selfservice/${props.token}`)
text-gray-500 .then(({ data }) => {
rounded-md state.org_name = data.name;
p-2 state.org_teams = data.teams;
" org_team.value = data.teams[0]?.id;
/> })
</div> .catch((error) => {
<div class="col-span-6"> console.log(error);
<label for="address2" class="block font-medium">{{ });
$t("apartment_suite_etc") }
}}</label>
<input let userdetails = ref({ firstname: "", lastname: "", middlename: "", mail: "", phone: "", address: { street: "", address2: "", city: "", zipcode: "" } });
v-model="userdetails.address.address2" let provide_address = ref(false);
type="text" let agb_accepted = ref(false);
name="address2" let data_confirmed = ref(false);
:placeholder="[[$t('apartment_suite_etc')]]" let org_team = ref("");
id="address2" //
autocomplete="street-address" const state = reactive({
class=" org_name: "",
dark:bg-gray-800 org_teams: [],
mt-1 submit_enabled: computed(() => agb_accepted.value === true && data_confirmed.value === true && (isMobilePhone(userdetails.value.phone) || !userdetails.value.phone.trim()) && isEmail(userdetails.value.mail)
block && userdetails.value.firstname
w-full && 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"))))
shadow-sm })
sm:text-sm const toast = useToast();
border-gray-300 border-2 function login() {
bg-gray-50 userdetails = userdetails.value;
text-gray-500 if (userdetails.phone === "" || isMobilePhone(userdetails.phone)) {
rounded-md if (isEmail(userdetails.mail)) {
p-2 let postdata = {
" "email": userdetails.mail,
/> "firstname": userdetails.firstname,
</div> "middlename": userdetails.middlename,
<div class="col-span-6 sm:col-span-6 lg:col-span-2"> "lastname": userdetails.lastname,
<label for="city" class="block font-medium"> "address": {}
{{ $t("ort") }} }
<span class="font-bold">*</span> if (isMobilePhone(userdetails.phone)) {
</label> postdata.phone = userdetails.phone;
<input }
v-model="userdetails.address.city" if (provide_address.value === true) {
type="text" postdata.address = {
name="city" address1: userdetails.address.street,
:placeholder="[[$t('ort')]]" address2: userdetails.address.address2 || "",
id="city" city: userdetails.address.city,
:class="{ postalcode: userdetails.address.zipcode,
'border-red-500': !userdetails.address.city.trim(), country: "DE",
'border-green-300': userdetails.address.city.trim(), }
}" }
class=" if (state.org_name !== '' && state.org_teams.length > 0) {
dark:bg-gray-800 postdata.team = org_team.value;
mt-1 }
block toast("registration in progress...");
w-full const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
shadow-sm let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`;
sm:text-sm if (props.token) {
border-gray-300 border-2 url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}`
bg-gray-50 }
text-gray-500 axios.post(url, postdata)
rounded-md .then(({ data }) => {
p-2 const token = btoa(data.token);
" // alert(token);
/> location.replace(`${config.baseurl_selfservice}profile/${token}`);
</div> })
<div class="col-span-6 sm:col-span-3 lg:col-span-2"> .catch((error) => {
<label for="postal_code" class="block font-medium"> console.log(error);
{{ $t("plz") }} });
<span class="font-bold">*</span> }
</label> }
<input }
v-model="userdetails.address.zipcode"
type="text"
name="postal_code"
:placeholder="[[$t('plz')]]"
id="postal_code"
autocomplete="postal-code"
:class="{
'border-red-500': !isPostalCode(
userdetails.address.zipcode,
'DE'
),
'border-green-300': isPostalCode(
userdetails.address.zipcode,
'DE'
),
}"
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>
<p
v-if="!isPostalCode(userdetails.address.zipcode, 'DE')"
class="text-sm"
>
{{ $t("please_provide_a_valid_zipcode") }}
</p>
</div>
</div>
<div class="flex items-start mt-6">
<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>
<div class="ml-3 text-sm">
<label
for="agb_accepted"
class="font-medium text-gray-400 select-none"
>
{{ $t("i_accept", { tos: $t("tos") }) }}
<a
target="_blank"
rel="noreferrer,noopener"
href="https://lauf-fuer-kaya.de/datenschutz/"
class="underline"
>{{ $t("tos") }}</a
>
{{ $t("i_accept_end") }}
<span class="font-bold">*</span>
</label>
</div>
</div>
<div class="flex items-start mt-6">
<div class="flex items-center h-5">
<input
v-model="data_confirmed"
id="data_confirmed"
name="data_confirmed"
type="checkbox"
class="h-4 w-4 text-indigo-600 border-gray-300 rounded"
/>
</div>
<div class="ml-3 text-sm">
<label
for="data_confirmed"
class="font-medium text-gray-400 select-none"
>
{{ $t("confirm_personal_data") }}
<span class="font-bold">*</span>
</label>
</div>
</div>
<div class="mt-6">
<button
@click="login"
:disabled="!state.submit_enabled"
:class="{
'opacity-50': !state.submit_enabled,
'cursor-not-allowed': !state.submit_enabled,
}"
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("registrieren") }}
</button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { computed, ref, reactive, defineProps } from "vue";
import axios from "redaxios";
import isEmail from "validator/es/lib/isEmail";
import isMobilePhone from "validator/es/lib/isMobilePhone";
import isPostalCode from "validator/es/lib/isPostalCode";
import { TYPE, useToast } from "vue-toastification";
const props = defineProps({
token: String,
});
if (props.token) {
axios
.get(`${config.baseurl}api/organizations/selfservice/${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: "" },
});
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 &&
(isMobilePhone(userdetails.value.phone) ||
!userdetails.value.phone.trim()) &&
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 (userdetails?.phone === "" || isMobilePhone(userdetails.phone)) {
if (isEmail(userdetails.mail)) {
let postdata = {
email: userdetails.mail,
firstname: userdetails.firstname,
middlename: userdetails.middlename,
lastname: userdetails.lastname,
address: {},
};
if (isMobilePhone(userdetails.phone)) {
postdata.phone = userdetails.phone;
}
if (provide_address.value === true) {
postdata.address = {
address1: userdetails.address.street,
address2: userdetails.address.address2 || "",
city: userdetails.address.city,
postalcode: userdetails.address.zipcode,
country: "DE",
};
}
if (state.org_name !== "" && state.org_teams.length > 0) {
postdata.team = org_team.value;
}
toast("Registrierung läuft...");
const browserlocale = (
(navigator.languages && navigator.languages[0]) ||
""
).substr(0, 2);
let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`;
if (props.token) {
url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}`;
}
registrationState.value = "loading";
axios
.post(url, postdata)
.then(() => {
registrationState.value = "registered";
})
.catch((error) => {
console.log(error);
if (error.data.message === "E-Mail already registered") {
toast("bereits registriert...", { type: TYPE.ERROR });
}
});
}
}
}
</script> </script>

View File

@@ -1,20 +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! - Registriert
</h1>
<p class="mx-auto leading-relaxed text-base text-center">
Bitte klicken Sie zum Fortfahren auf den Link, den wir an
<b class="font-bold">{{ $props.mail }}</b> geschickt haben.
</p>
</div>
</div>
</template>
<script setup>
const props = defineProps({
mail: String,
});
</script>