Compare commits

..

65 Commits

Author SHA1 Message Date
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
1a3c9edeb3 🚀Bumped version to v0.5.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-03 18:38:44 +02:00
7064a5bd82 Merge branch 'dev' into feature/19-runner_certficates 2021-04-03 16:28:18 +00:00
fd6bd88d42 Merge pull request 'Env linking bugfix bugfix/31-env_linking' (#37) from bugfix/31-env_linking into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #37
2021-04-03 16:27:56 +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
544542ac1e Added building pipeline for current branch
All checks were successful
continuous-integration/drone/push Build is passing
ref #31
2021-04-03 15:26:07 +02:00
67c0dae537 Now manually linking env and main
ref #31
2021-04-03 15:24:52 +02:00
cd6a139daf Merge pull request 'feature/30-profile-forgot-link' (#35) from feature/30-profile-forgot-link into dev
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #35
close #30
2021-04-02 19:00:50 +00:00
ec44a8b63e Merge branch 'dev' into feature/30-profile-forgot-link
# Conflicts:
#	src/locales/en.json
#	src/views/Home.vue
2021-04-01 19:58:37 +02:00
676f0e8339 🚀Bumped version to v0.5.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-01 19:57:02 +02:00
27fd8f9a91 Revert "🚀Bumped version to v0.5.0"
This reverts commit b8c1b8c43b.
2021-04-01 19:56:52 +02:00
bc1c824d9f Merge branch 'dev' of git.odit.services:lfk/selfservice into dev 2021-04-01 19:56:30 +02:00
b8c1b8c43b 🚀Bumped version to v0.5.0 2021-04-01 19:56:09 +02:00
713db5e1e8 Removed useless code
ref #30
2021-04-01 19:55:23 +02:00
0795ea318d Fixed post url and body
ref #30
2021-04-01 19:55:01 +02:00
bd512e0651 Merge pull request 'Runner self deletion feature/21-user_deletion' (#36) from feature/21-user_deletion into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #36
2021-04-01 17:50:41 +00:00
cf0437c3a7 Sorted translations
ref #21
2021-04-01 19:42:51 +02:00
8a24505d64 Added translations
ref #21
2021-04-01 19:42:33 +02:00
175bb168ae Content i18n run 🌍
ref #21
2021-04-01 19:40:49 +02:00
9751c2e9fd Added error toast
ref #21
2021-04-01 19:37:21 +02:00
7440fc404e Updated toasts and removed useless code
ref #21
2021-04-01 19:36:40 +02:00
ba3dedb164 Added translations 🌍
ref #21
2021-04-01 19:35:54 +02:00
d710d4b68f Updated icons
ref #21
2021-04-01 19:35:42 +02:00
125fcdd8cf Merge branch 'feature/21-user_deletion' of git.odit.services:lfk/selfservice into feature/21-user_deletion 2021-04-01 19:31:29 +02:00
8773239244 Added confirmation for profile deletion
ref #21
2021-04-01 19:31:25 +02:00
85b0549a11 Added confirmation for profile deletion 2021-04-01 19:31:19 +02:00
fc04e71311 Implemented basic deletion
ref #21
2021-04-01 19:27:12 +02:00
619078cce8 Added data deletion button
ref #21
2021-04-01 19:25:09 +02:00
30f3a51ef8 add forgot view + action
ref #30
2021-04-01 19:22:23 +02:00
60dea511b9 🐞 fix home routes
ref #30
2021-04-01 19:07:14 +02:00
863568d7d0 basic ProfileNone layout
ref #30
2021-04-01 19:07:04 +02:00
555823954a Merge branch 'main' into dev
Some checks reported errors
continuous-integration/drone/push Build was killed
2021-04-01 16:45:25 +00:00
efcb7f5674 🚀Bumped version to v0.4.5
Some checks reported errors
continuous-integration/drone/push Build was killed
2021-04-01 18:40:10 +02:00
e796f6dcaf Merge pull request 'feature/32-registration-language' (#33) from feature/32-registration-language into dev
Some checks reported errors
continuous-integration/drone/push Build was killed
Reviewed-on: #33
close #32
2021-04-01 16:38:49 +00:00
52a082841d 🐞 fix /profile/ router on register
ref #32
2021-04-01 18:31:37 +02:00
e3f7497af5 pass browser locale to api/runners/register/
ref #32
2021-04-01 18:31:18 +02:00
9b62962758 🚀Bumped version to v0.4.4
Some checks reported errors
continuous-integration/drone/push Build was killed
2021-03-31 20:16:18 +02:00
84dc33bf14 🚑 hotfix - baseurl_selfservice -> baseurl 2021-03-31 20:14:58 +02:00
cad34d357b 🚀Bumped version to v0.4.3
Some checks reported errors
continuous-integration/drone/push Build was killed
2021-03-31 20:13:03 +02:00
2056ce1e62 🚑 hotfix - Profile api path 2021-03-31 20:11:40 +02:00
3b2c99c709 🚀Bumped version to v0.4.2
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-31 20:06:42 +02:00
f150821f0f 🚑 fix organization registration token 2021-03-31 20:06:20 +02:00
5191ecea1e 🚀Bumped version to v0.4.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-31 19:34:36 +02:00
2141f62dca Fixed registration routing 2021-03-31 19:34:13 +02:00
149fbdf581 🚀Bumped version to v0.4.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-31 19:07:43 +02:00
7e0108c739 Merge pull request 'bugfix/27-route-matching' (#28) from bugfix/27-route-matching into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #28
close #27
2021-03-31 17:07:18 +00:00
1c19657935 Merge pull request 'RELEASE 0.3.0' (#25) from dev into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #25
2021-03-30 16:20:04 +00:00
12 changed files with 911 additions and 426 deletions

View File

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

View File

@@ -2,9 +2,115 @@
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.6.1](https://git.odit.services/lfk/selfservice/compare/0.6.0...0.6.1)
- 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)
> 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)
- 🚀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)
- pass browser locale to api/runners/register/ [`e3f7497`](https://git.odit.services/lfk/selfservice/commit/e3f7497af5860b2472b6cdfd33090b9d68b9fb49)
#### [0.4.4](https://git.odit.services/lfk/selfservice/compare/0.4.3...0.4.4)
> 31 March 2021
- 🚀Bumped version to v0.4.4 [`9b62962`](https://git.odit.services/lfk/selfservice/commit/9b62962758f8a73d669bca69b77f2c09a13c9e7a)
- 🚑 hotfix - baseurl_selfservice -> baseurl [`84dc33b`](https://git.odit.services/lfk/selfservice/commit/84dc33bf14ace839261aea02ffbcac5d627f8200)
#### [0.4.3](https://git.odit.services/lfk/selfservice/compare/0.4.2...0.4.3)
> 31 March 2021
- 🚀Bumped version to v0.4.3 [`cad34d3`](https://git.odit.services/lfk/selfservice/commit/cad34d357b9bd8501eed26b35b5324d2b4f756c3)
- 🚑 hotfix - Profile api path [`2056ce1`](https://git.odit.services/lfk/selfservice/commit/2056ce1e62a33e14bce5bdef5ea8cd38e039dc62)
#### [0.4.2](https://git.odit.services/lfk/selfservice/compare/0.4.1...0.4.2)
> 31 March 2021
- 🚀Bumped version to v0.4.2 [`3b2c99c`](https://git.odit.services/lfk/selfservice/commit/3b2c99c7090de03aab12415342136460ddd735ee)
- 🚑 fix organization registration token [`f150821`](https://git.odit.services/lfk/selfservice/commit/f150821f0f60e4798b02ebf50588da61ccb51279)
#### [0.4.1](https://git.odit.services/lfk/selfservice/compare/0.4.0...0.4.1)
> 31 March 2021
- Fixed registration routing [`2141f62`](https://git.odit.services/lfk/selfservice/commit/2141f62dca7ecb2be2579a7e79ffca513563c22a)
- 🚀Bumped version to v0.4.1 [`5191ece`](https://git.odit.services/lfk/selfservice/commit/5191ecea1eb3ac66a3f0c2743d43ff5b505061b7)
#### [0.4.0](https://git.odit.services/lfk/selfservice/compare/0.3.1...0.4.0)
> 31 March 2021
- Merge pull request 'bugfix/27-route-matching' (#28) from bugfix/27-route-matching into dev [`#27`](https://git.odit.services/lfk/selfservice/issues/27)
- added missing routes [`f603e53`](https://git.odit.services/lfk/selfservice/commit/f603e531512a2245ea2fe41304eb039080bcba28)
- added env config instructions [`ba604f7`](https://git.odit.services/lfk/selfservice/commit/ba604f77e9ce770e60f032cf393a5987a0401fbe)
- 🚀Bumped version to v0.4.0 [`149fbdf`](https://git.odit.services/lfk/selfservice/commit/149fbdf58180d1af33f9741d9076df0bb1591130)
- Home - route fixes [`c178932`](https://git.odit.services/lfk/selfservice/commit/c178932d943e08168fa6be39eb0a1d7e4a25824a)
- route fix for favicon + background [`106bf4c`](https://git.odit.services/lfk/selfservice/commit/106bf4c0ff07fe847f98aa250230f2a272f55a04)
- favicon fix [`63d9ee2`](https://git.odit.services/lfk/selfservice/commit/63d9ee2f867e42ecd23ca1d48d59b6deb7458d76)
- load main.js as deferred [`2e7a718`](https://git.odit.services/lfk/selfservice/commit/2e7a718daa7ca607622e3e339bdb85f5c64cfcf0)
#### [0.3.1](https://git.odit.services/lfk/selfservice/compare/0.3.0...0.3.1) #### [0.3.1](https://git.odit.services/lfk/selfservice/compare/0.3.0...0.3.1)
> 31 March 2021
- 🐞 fixed Vite/ Tailwind build [`27b81d8`](https://git.odit.services/lfk/selfservice/commit/27b81d87aeb907f6c3d35ea6f55b4fe56c1e79b4) - 🐞 fixed Vite/ Tailwind build [`27b81d8`](https://git.odit.services/lfk/selfservice/commit/27b81d87aeb907f6c3d35ea6f55b4fe56c1e79b4)
- 🚀Bumped version to v0.3.1 [`6e0bf56`](https://git.odit.services/lfk/selfservice/commit/6e0bf56289852cda0c30325f4b8ca7826386abf4)
#### [0.3.0](https://git.odit.services/lfk/selfservice/compare/0.2.0...0.3.0) #### [0.3.0](https://git.odit.services/lfk/selfservice/compare/0.2.0...0.3.0)

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,9 +7,16 @@ 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 /profile/(.*) /$1 break;
try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html;
} }
location ~* \.(?:ico|css|gif|jpe?g|png)$ { location ~* \.(?:ico|css|gif|jpe?g|png)$ {
rewrite /register/(.*) /$1 break;
rewrite /profile/(.*) /$1 break;
expires 1y; expires 1y;
add_header Pragma public; add_header Pragma public;
add_header Cache-Control "public"; add_header Cache-Control "public";

View File

@@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-selfservice", "name": "@odit/lfk-selfservice",
"version": "0.3.1", "version": "0.6.1",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",

View File

@@ -5,8 +5,8 @@ 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 // 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: ''
}; };

View File

@@ -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

@@ -1,41 +1,58 @@
{ {
"already_have_an_account": "Sie haben bereits einen Account?", "access_is_only_provided_via_your_email_link": "Der Zugang erfolgt nur über den Link, den Sie bei der Registrierung erhalten haben.",
"apartment_suite_etc": "Addresszeile 2", "already_have_an_account": "Sie haben bereits einen Account?",
"configuration_error": "Konfigurationsfehler", "amount_per_kilometer_in_eur": "Betrag pro Kilometer (in €)",
"confirm_personal_data": "Hiermit bestätige ich die Vollständigkeit und Richtigkeit der oben genannten Angaben", "apartment_suite_etc": "Addresszeile 2",
"distance": "Distanz", "cancel_keep_my_data": "Abbrechen, meine Daten behalten",
"download_certificate": "Urkunde herunterladen", "configuration_error": "Konfigurationsfehler",
"e_mail_adress": "E-Mail Adresse", "confirm_delete_all_of_my_data": "Bestätigung, meine gesamten Daten löschen",
"go_to_login": "Zum Login", "confirm_personal_data": "Hiermit bestätige ich die Vollständigkeit und Richtigkeit der oben genannten Angaben",
"i_accept": "Ich habe die ", "current_total_amount_in_eur": "Aktueller Gesamtbetrag (in €)",
"i_accept_end": "gelesen und akzeptiert.", "delete_all_of_my_data": "Meine gesamten Daten löschen",
"if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "Wenn Sie der Systemadministrator sind, finden Sie Konfigurationsanweisungen in der offiziellen Produktdokumentation / README.", "delete_my_data": "Meine Daten löschen",
"imprint": "Impressum", "deletion_in_progress": "Daten werden gelöscht...",
"lap_time": "Rundenzeit", "distance": "Distanz",
"lap_times": "Rundenzeiten", "download_certificate": "Urkunde herunterladen",
"main_page_text": "Hier können Sie sich für den Lauf Für Kaya! registrieren oder ihr Läuferprofil verwalten.", "e_mail_adress": "E-Mail Adresse",
"mittelname": "Mittelname", "go_to_login": "Zum Login",
"nachname": "Nachname", "i_accept": "Ich habe die ",
"no_laps_scans_were_recorded_yet": "Es wurden noch keine Runden / Scans aufgezeichnet ...", "i_accept_end": "gelesen und akzeptiert.",
"ort": "Ort", "if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "Wenn Sie der Systemadministrator sind, finden Sie Konfigurationsanweisungen in der offiziellen Produktdokumentation / README.",
"phone_number": "Telefonnummer", "imprint": "Impressum",
"please_provide_a_valid_zipcode": "Bitte geben Sie eine gültige Postleitzahl an...", "lap_time": "Rundenzeit",
"please_provide_valid_mail": "Bitte geben Sie eine gültige E-Mail Adresse an", "lap_times": "Rundenzeiten",
"plz": "PLZ", "lost_your_registration_mail": "Haben Sie Ihre Registrierungsmail verloren?",
"privacy_policy": "Datenschutzerklärung", "main_page_text": "Hier können Sie sich für den Lauf Für Kaya! registrieren oder ihr Läuferprofil verwalten.",
"profile": "Profil", "mittelname": "Mittelname",
"provide_address": "Adresse angeben?", "nachname": "Nachname",
"register": { "no_laps_scans_were_recorded_yet": "Es wurden noch keine Runden / Scans aufgezeichnet ...",
"register_now": "Jetzt für den Lauf für Kaya! 2021 registrieren." "no_sponsorings_for_you_were_recorded_yet": "Es gibt noch keine Sponsorings für dich",
}, "not_registered_yet": "Noch nicht registriert?",
"register_now": "Jetzt registrieren!", "organization": "Organisation",
"registrieren": "Registrieren", "ort": "Ort",
"save_changes": "Änderungen speichern", "phone_number": "Telefonnummer",
"sponsoring": "Sponsoring", "please_provide_a_valid_zipcode": "Bitte geben Sie eine gültige Postleitzahl an...",
"strasse": "Straße", "please_provide_valid_mail": "Bitte geben Sie eine gültige E-Mail Adresse an",
"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.", "plz": "PLZ",
"this_is_not_a_valid_international_phone_number": "Dies ist keine gültige internationale Telefonnummer", "privacy_policy": "Datenschutzerklärung",
"tos": "AGBs", "profile": "Profil",
"view_my_data": "Meine Läuferdaten einsehen", "provide_address": "Adresse angeben?",
"vorname": "Vorname" "register": {
} "register_now": "Jetzt für den Lauf für Kaya! 2021 registrieren."
},
"register_now": "Jetzt registrieren!",
"register_now_small": "Jetzt registrieren",
"registrieren": "Registrieren",
"resend_the_registration_mail": "Registrierungsmail erneut versenden",
"save_changes": "Änderungen speichern",
"sponsoring": "Sponsoring",
"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.",
"this_is_not_a_valid_international_phone_number": "Dies ist keine gültige internationale Telefonnummer",
"tos": "AGBs",
"view_my_data": "Meine Läuferdaten einsehen",
"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...",
"total": "Gesamt"
}

View File

@@ -1,43 +1,58 @@
{ {
"already_have_an_account": "Already have an account?", "access_is_only_provided_via_your_email_link": "Access is only provided via the link you received upon registration.",
"apartment_suite_etc": "Apartment, suite, etc.", "all_data_deleted": "All Data deleted!",
"configuration_error": "Configuration error", "already_have_an_account": "Already have an account?",
"confirm_personal_data": "I hereby confirm that the above information is complete and correct", "amount_per_kilometer_in_eur": "Amount per kilometer (in €)",
"distance": "Distance", "apartment_suite_etc": "Apartment, suite, etc.",
"download_certificate": "Download certificate", "cancel_keep_my_data": "Cancel, keep my data",
"e_mail_adress": "mail address", "configuration_error": "Configuration error",
"go_to_login": "Go To Login", "confirm_delete_all_of_my_data": "Confirm, delete all of my data",
"i_accept": "I have read and accepted the ", "confirm_personal_data": "I hereby confirm that the above information is complete and correct",
"i_accept_end": "", "current_total_amount_in_eur": "Current total amount (in €)",
"if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "If you are the system administrator, please refer to the official product documentation/ README for configuration guidance.", "delete_my_data": "Delete my data",
"imprint": "Imprint", "deletion_in_progress": "Deletion in progress...",
"lap_time": "Lap time", "distance": "Distance",
"lap_times": "Lap times", "download_certificate": "Download certificate",
"main_page_text": "Here you can register for the Lauf Für Kaya! or manage your runner profile.", "e_mail_adress": "mail address",
"mittelname": "Middlename", "go_to_login": "Go To Login",
"nachname": "Lastname", "i_accept": "I have read and accepted the ",
"no_laps_scans_were_recorded_yet": "No laps/ scans were recorded yet...", "i_accept_end": "",
"organization": "Organization", "if_you_are_the_system_administrator_please_refer_to_the_official_product_documentation_readme_for_configuration_guidance": "If you are the system administrator, please refer to the official product documentation/ README for configuration guidance.",
"ort": "City", "imprint": "Imprint",
"phone_number": "Phone Number", "lap_time": "Lap time",
"please_provide_a_valid_zipcode": "Please provide a valid zipcode...", "lap_times": "Lap times",
"please_provide_valid_mail": "Please provide a valid mail address.", "lost_your_registration_mail": "Lost your registration mail?",
"plz": "zipcode", "main_page_text": "Here you can register for the Lauf Für Kaya! or manage your runner profile.",
"privacy_policy": "Privacy Policy", "mittelname": "Middlename",
"profile": "Profile", "nachname": "Lastname",
"provide_address": "Provide a postal address?", "no_laps_scans_were_recorded_yet": "No laps/ scans were recorded yet...",
"register": { "no_sponsorings_for_you_were_recorded_yet": "No sponsorings for you were recorded yet...",
"register_now": "Register now for Lauf für Kaya! 2021." "not_registered_yet": "Not registered yet?",
}, "organization": "Organization",
"register_now": "Register now!", "ort": "City",
"registrieren": "Register Now", "phone_number": "Phone Number",
"save_changes": "Save changes", "please_provide_a_valid_zipcode": "Please provide a valid zipcode...",
"sponsoring": "Sponsoring", "please_provide_valid_mail": "Please provide a valid mail address.",
"strasse": "Street/ Block", "plz": "zipcode",
"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.", "privacy_policy": "Privacy Policy",
"this_is_not_a_valid_international_phone_number": "This is not a valid international phone number", "profile": "Profile",
"tos": "Terms of Service", "provide_address": "Provide a postal address?",
"view_my_data": "View my data", "register": {
"vorname": "Firstname", "register_now": "Register now for Lauf für Kaya! 2021."
"you_have_been_registered": "You have been registered!" },
} "register_now": "Register now!",
"register_now_small": "Register now",
"registrieren": "Register Now",
"resend_the_registration_mail": "Resend the registration mail",
"save_changes": "Save changes",
"sponsoring": "Sponsoring",
"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.",
"this_is_not_a_valid_international_phone_number": "This is not a valid international phone number",
"tos": "Terms of Service",
"view_my_data": "View my data",
"vorname": "Firstname",
"you_have_been_registered": "You have been registered!",
"you_have_not_provided_a_valid_access_key": "You have not provided a valid access key...",
"total": "Total"
}

View File

@@ -1,209 +1,422 @@
<template> <template>
<div class="min-h-screen w-full p-4"> <div class="min-h-screen w-full p-4">
<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">
<button <div v-if="(state.delete_active === false)">
type="button" <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" 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"
<svg @click="get_certificate"
xmlns="http://www.w3.org/2000/svg" >
width="24" <svg
height="24" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24" width="24"
fill="none" height="24"
stroke="currentColor" viewBox="0 0 24 24"
stroke-width="2" fill="none"
stroke-linecap="round" stroke="currentColor"
stroke-linejoin="round" stroke-width="2"
class="feather feather-download" stroke-linecap="round"
style="display: inline;height: 1rem;vertical-align: sub;" stroke-linejoin="round"
> class="feather feather-download"
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" /> style="display: inline;height: 1rem;vertical-align: sub;"
<polyline points="7 10 12 15 17 10" /> >
<line x1="12" y1="15" x2="12" y2="3" /> <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
</svg> <polyline points="7 10 12 15 17 10" />
{{ $t('download_certificate') }} <line x1="12" y1="15" x2="12" y2="3" />
</button> </svg>
</div> {{ $t('download_certificate') }}
</div> </button>
</section> <button
<div class="flex flex-wrap"> type="button"
<div class="w-full p-4"> 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"
<div class="flex flex-wrap flex-col w-full tabs"> @click="() => { state.delete_active = true }"
<div class="flex lg:flex-wrap flex-row lg:space-x-2"> >
<div class="flex-none"> <svg
<button xmlns="http://www.w3.org/2000/svg"
@click="() => { state.activetab = 'profile' }" width="24"
:class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'profile') }" height="24"
class="tab tab-underline py-4 px-6 block" viewBox="0 0 24 24"
type="button" fill="none"
>{{ $t('profile') }}</button> stroke="none"
</div> stroke-width="2"
<div class="flex-none"> stroke-linecap="round"
<button stroke-linejoin="round"
@click="() => { state.activetab = 'laptimes' }" class="feather feather-download"
:class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'laptimes') }" style="display: inline;height: 1rem;vertical-align: sub;"
class="tab tab-underline py-4 px-6 block" >
type="button" <path d="M0 0h24v24H0z" />
>{{ $t('lap_times') }}</button> <path
</div> fill="currentColor"
<div class="flex-none"> 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"
<button />
@click="() => { state.activetab = 'sponsorings' }" </svg>
:class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'sponsorings') }" {{ $t('delete_my_data') }}
class="tab tab-underline py-4 px-6 block" </button>
type="button" </div>
>{{ $t('sponsoring') }}</button> <div v-if="(state.delete_active === true)">
</div> <button
</div> type="button"
<div v-if="(state.activetab === 'profile')" class="tab-content block"> 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"
<div class="py-4 w-full"> @click="() => { state.delete_active = false }"
<div class="flex flex-col"> >
<form class="form flex flex-wrap w-full"> <svg
<div class="w-full"> xmlns="http://www.w3.org/2000/svg"
<div class="form-element"> width="24"
<div class="text-lg">{{ $t('vorname') }}</div> height="24"
<p viewBox="0 0 24 24"
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" fill="none"
v-text="state.firstname" stroke="none"
/> stroke-width="2"
</div> stroke-linecap="round"
<div class="form-element"> stroke-linejoin="round"
<div class="text-lg">{{ $t('mittelname') }}</div> class="feather feather-download"
<p style="display: inline;height: 1rem;vertical-align: sub;"
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" <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" />
</div> </svg>
<div class="form-element"> {{ $t('cancel_keep_my_data') }}
<div class="text-lg">{{ $t('nachname') }}</div> </button>
<p <button
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" type="button"
v-text="state.lastname" 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"
</div> >
<div class="form-element"> <svg
<div class="text-lg">{{ $t('e_mail_adress') }}</div> xmlns="http://www.w3.org/2000/svg"
<p width="24"
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" height="24"
v-text="state.email" viewBox="0 0 24 24"
/> fill="none"
</div> stroke="none"
<div class="form-element"> stroke-width="2"
<div class="text-lg">{{ $t('phone_number') }}</div> stroke-linecap="round"
<p stroke-linejoin="round"
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="feather feather-download"
v-text="state.phone" style="display: inline;height: 1rem;vertical-align: sub;"
/> >
</div> <path d="M0 0h24v24H0z" />
</div> <path
</form> fill="currentColor"
</div> 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"
</div> />
</div> </svg>
<div v-if="(state.activetab === 'laptimes')" class="tab-content block"> {{ $t('confirm_delete_all_of_my_data') }}
<div class="py-4 w-full"> </button>
<section class="text-gray-400 dark:bg-gray-900 body-font"> </div>
<div class="container mx-auto"> </div>
<div class="lg:w-2/3 w-full mx-auto overflow-auto"> </div>
<table </section>
v-if="state.scans.length > 0" <div class="flex flex-wrap">
class="table-auto w-full text-left whitespace-no-wrap" <div class="w-full p-4">
> <div class="flex flex-wrap flex-col w-full tabs">
<thead <div class="flex lg:flex-wrap flex-row lg:space-x-2">
class="text-black bg-gray-300 dark:text-white text-sm dark:bg-gray-800" <div class="flex-none">
> <button
<tr> @click="() => { state.activetab = 'profile' }"
<th :class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'profile') }"
class="px-4 py-3 title-font tracking-wider font-medium" class="tab tab-underline py-4 px-6 block"
>{{ $t('distance') }}</th> type="button"
<th >{{ $t('profile') }}</button>
class="px-4 py-3 title-font tracking-wider font-medium" </div>
>{{ $t('lap_time') }}</th> <div class="flex-none">
</tr> <button
</thead> @click="() => { state.activetab = 'laptimes' }"
<tbody class="text-gray-900 dark:text-gray-50"> :class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'laptimes') }"
<tr v-for="s in state.scans" :key="s.id"> class="tab tab-underline py-4 px-6 block"
<td class="px-4 py-3"> type="button"
<span v-text="s.distance"></span>m >{{ $t('lap_times') }}</button>
</td> </div>
<td class="px-4 py-3" v-text="s.lapTime"></td> <div class="flex-none">
</tr> <button
</tbody> @click="() => { state.activetab = 'sponsorings' }"
</table> :class="{ 'tab-active border-b-2 font-medium border-blue-500': (state.activetab === 'sponsorings') }"
<div v-else class="text-center font-bold text-black dark:text-white text-2xl"> class="tab tab-underline py-4 px-6 block"
<img type="button"
src="../assets/empty_laps.svg" >{{ $t('sponsoring') }}</button>
style="height:25rem; margin:0 auto;" </div>
:alt="[[$t('no_laps_scans_were_recorded_yet')]]" </div>
/> <div v-if="(state.activetab === 'profile')" class="tab-content block">
{{ $t('no_laps_scans_were_recorded_yet') }} <div class="py-4 w-full">
</div> <div class="flex flex-col">
</div> <form class="form flex flex-wrap w-full">
</div> <div class="w-full">
</section> <div class="form-element">
</div> <div class="text-lg">{{ $t('vorname') }}</div>
</div> <p
<div v-if="(state.activetab === 'sponsorings')" class="tab-content block"> 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"
<div class="py-4 w-full">coming soon...</div> v-text="state.firstname"
</div> />
</div> </div>
</div> <div class="form-element">
</div> <div class="text-lg">{{ $t('mittelname') }}</div>
</div> <p
</template> 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"
<script setup> />
import { reactive } from "vue"; </div>
import { useToast } from "vue-toastification"; <div class="form-element">
import axios from "redaxios"; <div class="text-lg">{{ $t('nachname') }}</div>
<p
const state = reactive({ 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"
phone: "", v-text="state.lastname"
email: "", />
firstname: "", </div>
middlename: "", <div class="form-element">
lastname: "", <div class="text-lg">{{ $t('e_mail_adress') }}</div>
scans: [], <p
group: "", 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"
activetab: "profile", v-text="state.email"
}) />
const toast = useToast(); </div>
const props = defineProps({ <div class="form-element">
token: String <div class="text-lg">{{ $t('phone_number') }}</div>
}) <p
const accesstoken = atob(props.token); 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"
axios.get(`${config.baseurl_selfservice}/api/runners/me/${accesstoken}`) v-text="state.phone"
.then(({ data }) => { />
state.phone = data.phone; </div>
state.email = data.email; </div>
state.firstname = data.firstname; </form>
state.middlename = data.middlename; </div>
state.lastname = data.lastname; </div>
state.group = data.group; </div>
}).catch((error) => { <div v-if="(state.activetab === 'laptimes')" class="tab-content block">
toast.error("An error occured while loading your profile data"); <div class="py-4 w-full">
}) <section class="text-gray-400 dark:bg-gray-900 body-font">
axios.get(`${config.baseurl}api/runners/me/${accesstoken}/scans`) <div class="container mx-auto">
.then(({ data }) => { <div class="lg:w-2/3 w-full mx-auto overflow-auto">
data.map(function(s) { <table
s.lapTime = Math.floor(s.lapTime / 60) + 'min ' + (Math.floor(s.lapTime % 60) + "").padStart(2, "0") + "s" v-if="state.scans.length > 0"
return s; class="table-auto w-full text-left whitespace-no-wrap"
}) >
data.filter(s => s.valid === true); <thead
state.scans = data; class="text-black bg-gray-300 dark:text-white text-sm dark:bg-gray-800"
}).catch((error) => { >
toast.error("An error occured while loading your profile data"); <tr>
}) <th
class="px-4 py-3 title-font tracking-wider font-medium"
>{{ $t('distance') }}</th>
<th
class="px-4 py-3 title-font tracking-wider font-medium"
>{{ $t('lap_time') }}</th>
</tr>
</thead>
<tbody class="text-gray-900 dark:text-gray-50">
<tr v-for="s in state.scans" :key="s.id">
<td class="px-4 py-3">
<span v-text="s.distance"></span>
</td>
<td class="px-4 py-3" v-text="s.lapTime"></td>
</tr>
</tbody>
</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_laps_scans_were_recorded_yet')]]"
/>
{{ $t('no_laps_scans_were_recorded_yet') }}
</div>
</div>
</div>
</section>
</div>
</div>
<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>
</template>
<script setup>
import { reactive } from "vue";
import { useToast } from "vue-toastification";
import axios from "redaxios";
const state = reactive({
phone: "",
email: "",
firstname: "",
middlename: "",
lastname: "",
scans: [],
sponsorings: [],
group: "",
activetab: "profile",
delete_active: false,
fullobject: {}
})
const toast = useToast();
const props = defineProps({
token: String
})
const accesstoken = atob(props.token);
axios.get(`${config.baseurl}api/runners/me/${accesstoken}`)
.then(({ data }) => {
state.phone = data.phone;
state.email = data.email;
state.firstname = data.firstname;
state.middlename = data.middlename;
state.lastname = data.lastname;
state.group = data.group;
state.sponsorings = data.distanceDonations;
state.fullobject = data;
}).catch((error) => {
toast.error("An error occured while loading your profile data");
})
axios.get(`${config.baseurl}api/runners/me/${accesstoken}/scans`)
.then(({ data }) => {
data.map(function(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;
})
data.filter(s => s.valid === true);
state.scans = data;
}).catch((error) => {
toast.error("An error occured while loading your profile data");
})
function delete_me() {
toast("Deletion in progress...");
let url = `${config.baseurl}api/runners/me/${accesstoken}?force=true`
axios.delete(url)
.then(() => {
toast("All Data deleted!");
location.replace(`${config.baseurl_selfservice}`);
})
.catch((error) => {
toast.error("An error occured while deleting your profile data");
});
}
function get_certificate() {
toast("Generation in progress...");
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
let url = `${config.baseurl}documents/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("An error occured while generateing your certificate!");
} 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("Document generated!");
}
})
.catch((err) => {
console.error(err);
toast.error("An error occured while deleting your profile data");
});
}
</script> </script>

View File

@@ -1 +1,104 @@
<template>You have not provided a valid access key...</template> <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="off"
: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)"
class="text-sm"
>{{ $t('please_provide_valid_mail') }}</p>
</div>
<div class="mt-2">
<a
: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') }}</a>
</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="./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 { 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("sending password reset mail...");
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
axios.post(`${config.baseurl}api/runners/forgot?mail=${user_email.value}&locale=${browserlocale}`)
.then(({ data }) => {
console.log(data);
toast("sent password reset mail to " + user_email.value + "!");
})
.catch((error) => {
console.log(error);
toast("user does not exist...");
});
}
}
</script>

View File

@@ -261,14 +261,11 @@ import isEmail from 'validator/es/lib/isEmail';
import isMobilePhone from 'validator/es/lib/isMobilePhone'; import isMobilePhone from 'validator/es/lib/isMobilePhone';
import isPostalCode from 'validator/es/lib/isPostalCode'; import isPostalCode from 'validator/es/lib/isPostalCode';
import { useToast } from "vue-toastification"; import { useToast } from "vue-toastification";
// import { router } from '../router';
import { i18n } from '../language';
const props = defineProps({ const props = defineProps({
token: String token: String
}) })
if (props.token) { if (props.token) {
props.token = atob(props.token);
axios.get(`${config.baseurl}api/organizations/selfservice/${props.token}`) axios.get(`${config.baseurl}api/organizations/selfservice/${props.token}`)
.then(({ data }) => { .then(({ data }) => {
state.org_name = data.name; state.org_name = data.name;
@@ -321,14 +318,16 @@ function login() {
postdata.team = org_team.value; postdata.team = org_team.value;
} }
toast("registration in progress..."); toast("registration in progress...");
let url = `${config.baseurl}api/runners/register`; const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`;
if (props.token) { if (props.token) {
url = `${config.baseurl}api/runners/register/${props.token}` url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}`
} }
axios.post(url, postdata) axios.post(url, postdata)
.then(({ data }) => { .then(({ data }) => {
const token = btoa(data.token); const token = btoa(data.token);
// router.push(`${config.baseurl_selfservice}/profile/${token}`); // alert(token);
location.replace(`${config.baseurl_selfservice}profile/${token}`);
}) })
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);