Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
8364321a7c
|
|||
659fa77dca
|
|||
10c9127256
|
|||
a3a1e89aa1
|
|||
5587175534
|
|||
8e2b355466
|
|||
eccce0795b
|
|||
54540be6e1
|
|||
3392a2e68e
|
|||
8928f841dc
|
|||
9ac14e8a5d
|
31
CHANGELOG.md
31
CHANGELOG.md
@@ -2,9 +2,40 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||
|
||||
#### [0.11.1](https://git.odit.services/lfk/selfservice/compare/0.11.0...0.11.1)
|
||||
|
||||
- Profile: add "---" if no data set [`659fa77`](https://git.odit.services/lfk/selfservice/commit/659fa77dca3b527d896d752386e91a167a1b8f4f)
|
||||
|
||||
#### [0.11.0](https://git.odit.services/lfk/selfservice/compare/0.10.0...0.11.0)
|
||||
|
||||
> 3 February 2023
|
||||
|
||||
- pnpm migration [`a3a1e89`](https://git.odit.services/lfk/selfservice/commit/a3a1e89aa14798e1d180697f91809e282a229f23)
|
||||
- 🚀Bumped version to v0.11.0 [`10c9127`](https://git.odit.services/lfk/selfservice/commit/10c9127256edf2cbad1dc6690d5f4e87c32f6396)
|
||||
|
||||
#### [0.10.0](https://git.odit.services/lfk/selfservice/compare/0.9.0...0.10.0)
|
||||
|
||||
> 3 February 2023
|
||||
|
||||
- text cleanups + footer [`eccce07`](https://git.odit.services/lfk/selfservice/commit/eccce0795b6960aa3a2e9368de5ae4bdf80997d7)
|
||||
- updated nginx config for cache busting [`8e2b355`](https://git.odit.services/lfk/selfservice/commit/8e2b355466e9a37510be8bf03311d6b28e1a0d9f)
|
||||
- improved profile page padding + full width registration code for easier scanning [`54540be`](https://git.odit.services/lfk/selfservice/commit/54540be6e12ed85afc96061b8548cd4ec6700eec)
|
||||
- 🚀Bumped version to v0.10.0 [`5587175`](https://git.odit.services/lfk/selfservice/commit/5587175534188e05ab43d0eed9745484e01edb63)
|
||||
|
||||
#### [0.9.0](https://git.odit.services/lfk/selfservice/compare/0.8.3...0.9.0)
|
||||
|
||||
> 3 February 2023
|
||||
|
||||
- wip: error registration ui feedback [`9ac14e8`](https://git.odit.services/lfk/selfservice/commit/9ac14e8a5d740fb4cd87645e69b2cfde73e4acc7)
|
||||
- wip: registration confirmation ui [`8928f84`](https://git.odit.services/lfk/selfservice/commit/8928f841dcd370daf28416adbf1adbe16fa4d76f)
|
||||
- 🚀Bumped version to v0.9.0 [`3392a2e`](https://git.odit.services/lfk/selfservice/commit/3392a2e68edb8fcf2aa6dd4b962abbf6ac27a414)
|
||||
|
||||
#### [0.8.3](https://git.odit.services/lfk/selfservice/compare/0.8.2...0.8.3)
|
||||
|
||||
> 3 February 2023
|
||||
|
||||
- fix: registration code (broke in merge) [`123509d`](https://git.odit.services/lfk/selfservice/commit/123509d0a6d15fe254e28f7a316bd6c260fe7bd2)
|
||||
- 🚀Bumped version to v0.8.3 [`4a5b9d2`](https://git.odit.services/lfk/selfservice/commit/4a5b9d25698931158a602b2159b4e6c4fa129e8e)
|
||||
- wip: fix registration code [`51f8d0f`](https://git.odit.services/lfk/selfservice/commit/51f8d0fb42d0dbba268799eb9385686d22fd2284)
|
||||
|
||||
#### [0.8.2](https://git.odit.services/lfk/selfservice/compare/0.8.1...0.8.2)
|
||||
|
@@ -1,9 +1,10 @@
|
||||
FROM registry.odit.services/hub/library/node:15.9.0-alpine3.13
|
||||
FROM registry.odit.services/hub/library/node:19.5.0-alpine3.17
|
||||
WORKDIR /app
|
||||
RUN npm i -g pnpm@7
|
||||
COPY . .
|
||||
RUN yarn
|
||||
RUN yarn build
|
||||
RUN yarn postbuild
|
||||
RUN pnpm i --frozen-lockfile
|
||||
RUN pnpm build
|
||||
RUN pnpm postbuild
|
||||
# final image
|
||||
FROM registry.odit.services/library/nginx-brotli:3.15
|
||||
COPY --from=0 /app/dist /usr/share/nginx/html
|
||||
|
52
nginx.conf
52
nginx.conf
@@ -7,15 +7,21 @@ http {
|
||||
error_page 404 /index.html;
|
||||
root /usr/share/nginx/html;
|
||||
location / {
|
||||
rewrite /register/(.*) /$1 break;
|
||||
rewrite /profile/(.*) /$1 break;
|
||||
rewrite /register/(.*) /$1 break;
|
||||
rewrite /profile/(.*) /$1 break;
|
||||
|
||||
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)$ {
|
||||
rewrite /register/(.*) /$1 break;
|
||||
rewrite /profile/(.*) /$1 break;
|
||||
rewrite /register/(.*) /$1 break;
|
||||
rewrite /profile/(.*) /$1 break;
|
||||
|
||||
expires 1y;
|
||||
add_header Pragma public;
|
||||
@@ -35,24 +41,24 @@ http {
|
||||
gzip_buffers 16 8k;
|
||||
gzip_http_version 1.1;
|
||||
gzip_types application/javascript
|
||||
application/rss+xml
|
||||
application/vnd.ms-fontobject
|
||||
application/x-font
|
||||
application/x-font-opentype
|
||||
application/x-font-otf
|
||||
application/x-font-truetype
|
||||
application/x-font-ttf
|
||||
application/x-javascript
|
||||
application/xhtml+xml
|
||||
application/xml
|
||||
font/opentype
|
||||
font/otf
|
||||
font/ttf
|
||||
image/svg+xml
|
||||
image/x-icon
|
||||
text/css
|
||||
text/javascript
|
||||
text/plain
|
||||
text/xml;
|
||||
application/rss+xml
|
||||
application/vnd.ms-fontobject
|
||||
application/x-font
|
||||
application/x-font-opentype
|
||||
application/x-font-otf
|
||||
application/x-font-truetype
|
||||
application/x-font-ttf
|
||||
application/x-javascript
|
||||
application/xhtml+xml
|
||||
application/xml
|
||||
font/opentype
|
||||
font/otf
|
||||
font/ttf
|
||||
image/svg+xml
|
||||
image/x-icon
|
||||
text/css
|
||||
text/javascript
|
||||
text/plain
|
||||
text/xml;
|
||||
}
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@odit/lfk-selfservice",
|
||||
"version": "0.8.3",
|
||||
"version": "0.11.1",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
|
9
pnpm-lock.yaml
generated
9
pnpm-lock.yaml
generated
@@ -9,8 +9,7 @@ specifiers:
|
||||
'@vitejs/plugin-vue': 1.2.1
|
||||
'@vue/compiler-sfc': 3.0.11
|
||||
autoprefixer: 10.2.5
|
||||
bwip-js: ^3.2.2
|
||||
jsbarcode: ^3.11.5
|
||||
bwip-js: 3.2.2
|
||||
marked: 2.0.3
|
||||
redaxios: 0.4.1
|
||||
release-it: 14.6.1
|
||||
@@ -25,7 +24,6 @@ specifiers:
|
||||
|
||||
dependencies:
|
||||
bwip-js: 3.2.2
|
||||
jsbarcode: 3.11.5
|
||||
marked: 2.0.3
|
||||
redaxios: 0.4.1
|
||||
toastify-js: 1.10.0
|
||||
@@ -1865,11 +1863,6 @@ packages:
|
||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
||||
dev: true
|
||||
|
||||
/jsbarcode/3.11.5:
|
||||
resolution: {integrity: sha512-zv3KsH51zD00I/LrFzFSM6dst7rDn0vIMzaiZFL7qusTjPZiPtxg3zxetp0RR7obmjTw4f6NyGgbdkBCgZUIrA==}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/json-buffer/3.0.0:
|
||||
resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
|
||||
dev: true
|
||||
|
@@ -5,7 +5,7 @@
|
||||
"apartment_suite_etc": "Addresszeile 2",
|
||||
"cancel_keep_my_data": "Abbrechen, meine Daten behalten",
|
||||
"configuration_error": "Konfigurationsfehler",
|
||||
"confirm_delete_all_of_my_data": "Bestätigung, meine gesamten Daten löschen",
|
||||
"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",
|
||||
"current_total_amount_in_eur": "Aktueller Gesamtbetrag (in €)",
|
||||
"delete_all_of_my_data": "Meine gesamten Daten löschen",
|
||||
|
@@ -3,7 +3,6 @@ import Home from './views/Home.vue';
|
||||
import Imprint from './views/Imprint.vue';
|
||||
import Privacy from './views/Privacy.vue';
|
||||
import Register from './views/Register.vue';
|
||||
import Registered from './views/Registered.vue';
|
||||
import Profile from './views/Profile.vue';
|
||||
import ProfileNone from './views/ProfileNone.vue';
|
||||
|
||||
@@ -18,7 +17,6 @@ export const routes = [
|
||||
{ path: config.baseurl_selfservice + 'privacy/', component: Privacy },
|
||||
{ path: config.baseurl_selfservice + 'register', component: Register },
|
||||
{ path: config.baseurl_selfservice + 'register/', component: Register },
|
||||
{ path: config.baseurl_selfservice + 'registered/:mail', component: Registered, props: true },
|
||||
{ path: config.baseurl_selfservice + 'register/:token', component: Register, props: true },
|
||||
{ path: config.baseurl_selfservice + 'profile', component: Profile },
|
||||
{ path: config.baseurl_selfservice + 'profile/', component: ProfileNone },
|
||||
|
@@ -150,6 +150,10 @@
|
||||
py-2.5
|
||||
px-5
|
||||
rounded-md
|
||||
mb-1
|
||||
md:mb-auto
|
||||
w-full
|
||||
md:w-auto
|
||||
bg-blue-500
|
||||
hover:bg-blue-600 hover:shadow-lg
|
||||
"
|
||||
@@ -188,9 +192,11 @@
|
||||
py-2.5
|
||||
px-5
|
||||
rounded-md
|
||||
w-full
|
||||
md:w-auto
|
||||
bg-red-600
|
||||
hover:bg-red-700 hover:shadow-lg
|
||||
ml-1
|
||||
md:ml-1
|
||||
"
|
||||
@click="delete_me"
|
||||
>
|
||||
@@ -220,7 +226,7 @@
|
||||
</div>
|
||||
</section>
|
||||
<div class="flex flex-wrap">
|
||||
<div class="w-full p-4">
|
||||
<div class="w-full">
|
||||
<div class="flex flex-wrap flex-col w-full tabs">
|
||||
<div class="flex lg:flex-wrap flex-row lg:space-x-2">
|
||||
<div class="flex-none">
|
||||
@@ -282,7 +288,11 @@
|
||||
<div class="w-full">
|
||||
<div class="form-element">
|
||||
<div class="text-lg">{{ $t("registrierungscode") }}</div>
|
||||
<img alt="Registrierungscode" :src="state.barcode" />
|
||||
<img
|
||||
class="w-full md:w-auto mb-2"
|
||||
alt="Registrierungscode"
|
||||
:src="state.barcode"
|
||||
/>
|
||||
<div class="text-lg">{{ $t("vorname") }}</div>
|
||||
<p
|
||||
class="
|
||||
@@ -301,7 +311,7 @@
|
||||
duration-200
|
||||
ease-in-out
|
||||
"
|
||||
v-text="state.firstname"
|
||||
v-text="state.firstname || '---'"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-element">
|
||||
@@ -323,7 +333,7 @@
|
||||
duration-200
|
||||
ease-in-out
|
||||
"
|
||||
v-text="state.middlename"
|
||||
v-text="state.middlename || '---'"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-element">
|
||||
@@ -345,7 +355,7 @@
|
||||
duration-200
|
||||
ease-in-out
|
||||
"
|
||||
v-text="state.lastname"
|
||||
v-text="state.lastname || '---'"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-element">
|
||||
@@ -367,7 +377,7 @@
|
||||
duration-200
|
||||
ease-in-out
|
||||
"
|
||||
v-text="state.email"
|
||||
v-text="state.email || '---'"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-element">
|
||||
@@ -389,7 +399,7 @@
|
||||
duration-200
|
||||
ease-in-out
|
||||
"
|
||||
v-text="state.phone"
|
||||
v-text="state.phone || '---'"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -628,6 +638,52 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- -->
|
||||
<footer
|
||||
class="
|
||||
p-4
|
||||
bg-white
|
||||
rounded-lg
|
||||
shadow
|
||||
md:flex md:items-center md:justify-between md:p-6
|
||||
dark:bg-gray-800
|
||||
"
|
||||
>
|
||||
<span class="text-sm text-gray-500 sm:text-center dark:text-gray-400"
|
||||
><span class="font-bold">LfK! 2023</span> -
|
||||
<a
|
||||
class="underline"
|
||||
href="https://odit.services/?ref=lfk"
|
||||
target="_blank"
|
||||
>powered by ODIT.Services</a
|
||||
>
|
||||
</span>
|
||||
<ul
|
||||
class="
|
||||
flex flex-wrap
|
||||
items-center
|
||||
mt-3
|
||||
text-sm text-gray-500
|
||||
dark:text-gray-400
|
||||
sm:mt-0
|
||||
"
|
||||
>
|
||||
<li>
|
||||
<a
|
||||
href="https://lauf-fuer-kaya.de/impressum/"
|
||||
class="mr-4 hover:underline md:mr-6"
|
||||
>Impressum</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="https://lauf-fuer-kaya.de/datenschutz/"
|
||||
class="mr-4 hover:underline md:mr-6"
|
||||
>Datenschutz</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</footer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -647,7 +703,11 @@ function textToBase64Barcode(text) {
|
||||
textxalign: "center",
|
||||
backgroundcolor: "ffffff",
|
||||
};
|
||||
if (codeconfig.bcid === "code39" || codeconfig.bcid === "code128"|| codeconfig.bcid === "ean13") {
|
||||
if (
|
||||
codeconfig.bcid === "code39" ||
|
||||
codeconfig.bcid === "code128" ||
|
||||
codeconfig.bcid === "ean13"
|
||||
) {
|
||||
codeconfig.height = 10;
|
||||
}
|
||||
bwipjs.toCanvas(canvas, codeconfig);
|
||||
|
@@ -1,33 +1,73 @@
|
||||
<template>
|
||||
<div class="min-h-screen flex items-center justify-center">
|
||||
<div
|
||||
class="min-h-screen flex items-center justify-center"
|
||||
v-if="registrationState === 'registered'"
|
||||
>
|
||||
<div class="max-w-md w-full py-12 px-6">
|
||||
<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('registrieren') }}</h1>
|
||||
<p class="mx-auto leading-relaxed text-base text-center">{{ $t('register.register_now') }}</p>
|
||||
<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">{{ userdetails.mail }}</b> geschickt haben.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="min-h-screen flex items-center justify-center" v-else>
|
||||
<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("registrieren") }}
|
||||
</h1>
|
||||
<p class="mx-auto leading-relaxed text-base text-center">
|
||||
{{ $t("register.register_now") }}
|
||||
</p>
|
||||
<p
|
||||
v-if="state.org_name !== ''"
|
||||
class="mx-auto leading-relaxed text-base text-center"
|
||||
>{{ $t('organization') }}: {{ state.org_name }}</p>
|
||||
>
|
||||
{{ $t("organization") }}: {{ state.org_name }}
|
||||
</p>
|
||||
<p
|
||||
v-if="state.org_name !== '' && state.org_teams.length > 0"
|
||||
class="mx-auto leading-relaxed text-base text-center"
|
||||
>Team:</p>
|
||||
>
|
||||
Team:
|
||||
</p>
|
||||
<select
|
||||
v-model="org_team"
|
||||
v-if="state.org_name !== '' && state.org_teams.length > 0"
|
||||
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"
|
||||
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
|
||||
"
|
||||
>
|
||||
<option v-for="t in state.org_teams" :key="t.id" :value="t.id">{{ t.name }}</option>
|
||||
<option v-for="t in state.org_teams" :key="t.id" :value="t.id">
|
||||
{{ t.name }}
|
||||
</option>
|
||||
</select>
|
||||
<p
|
||||
v-if="state.org_name === ''"
|
||||
class="mx-auto leading-relaxed text-base text-center"
|
||||
>Bürgerlauf</p>
|
||||
>
|
||||
Bürgerlauf
|
||||
</p>
|
||||
<div class="mt-4">
|
||||
<label for="first_name" class="block font-medium">
|
||||
{{ $t('vorname') }}
|
||||
{{ $t("vorname") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -37,11 +77,28 @@
|
||||
autocomplete="off"
|
||||
:placeholder="[[$t('vorname')]]"
|
||||
type="text"
|
||||
:class="{ 'border-red-500': (!userdetails.firstname.trim()), 'border-green-300': (userdetails.firstname.trim()) }"
|
||||
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"
|
||||
:class="{
|
||||
'border-red-500': !userdetails.firstname.trim(),
|
||||
'border-green-300': userdetails.firstname.trim(),
|
||||
}"
|
||||
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
|
||||
"
|
||||
/>
|
||||
<!-- -->
|
||||
<label for="middle_name" class="block font-medium">{{ $t('mittelname') }}</label>
|
||||
<label for="middle_name" class="block font-medium">{{
|
||||
$t("mittelname")
|
||||
}}</label>
|
||||
<input
|
||||
v-model="userdetails.middlename"
|
||||
name="middlename"
|
||||
@@ -49,11 +106,23 @@
|
||||
autocomplete="off"
|
||||
:placeholder="[[$t('mittelname')]]"
|
||||
type="text"
|
||||
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"
|
||||
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
|
||||
"
|
||||
/>
|
||||
<!-- -->
|
||||
<label for="last_name" class="block font-medium">
|
||||
{{ $t('nachname') }}
|
||||
{{ $t("nachname") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -63,12 +132,27 @@
|
||||
autocomplete="off"
|
||||
:placeholder="[[$t('nachname')]]"
|
||||
type="text"
|
||||
:class="{ 'border-red-500': (!userdetails.lastname.trim()), 'border-green-300': (userdetails.lastname.trim()) }"
|
||||
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"
|
||||
:class="{
|
||||
'border-red-500': !userdetails.lastname.trim(),
|
||||
'border-green-300': userdetails.lastname.trim(),
|
||||
}"
|
||||
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
|
||||
"
|
||||
/>
|
||||
<!-- -->
|
||||
<label for="email_address" class="block font-medium">
|
||||
{{ $t('e_mail_adress') }}
|
||||
{{ $t("e_mail_adress") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -78,12 +162,31 @@
|
||||
autocomplete="off"
|
||||
:placeholder="[[$t('e_mail_adress')]]"
|
||||
type="email"
|
||||
:class="{ 'border-red-500': (!isEmail(userdetails.mail)), 'border-green-300': (isEmail(userdetails.mail)) }"
|
||||
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="{
|
||||
'border-red-500': !isEmail(userdetails.mail),
|
||||
'border-green-300': isEmail(userdetails.mail),
|
||||
}"
|
||||
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(userdetails.mail)" class="text-sm">{{ $t('please_provide_valid_mail') }}</p>
|
||||
<p v-if="!isEmail(userdetails.mail)" class="text-sm">
|
||||
{{ $t("please_provide_valid_mail") }}
|
||||
</p>
|
||||
<!-- -->
|
||||
<label for="phone" class="select-none block font-medium">{{ $t('phone_number') }}</label>
|
||||
<label for="phone" class="select-none block font-medium">{{
|
||||
$t("phone_number")
|
||||
}}</label>
|
||||
<input
|
||||
v-model="userdetails.phone"
|
||||
name="phone"
|
||||
@@ -91,13 +194,32 @@
|
||||
autocomplete="off"
|
||||
:placeholder="[[$t('phone_number')]]"
|
||||
type="text"
|
||||
:class="{ 'border-red-500': (!isMobilePhone(userdetails.phone) && userdetails.phone.trim()), 'border-green-300': (isMobilePhone(userdetails.phone) && userdetails.phone.trim()) }"
|
||||
class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-2 bg-gray-50 text-gray-500 rounded-md p-2"
|
||||
:class="{
|
||||
'border-red-500':
|
||||
!isMobilePhone(userdetails.phone) && userdetails.phone.trim(),
|
||||
'border-green-300':
|
||||
isMobilePhone(userdetails.phone) && userdetails.phone.trim(),
|
||||
}"
|
||||
class="
|
||||
dark:bg-gray-800
|
||||
mt-1
|
||||
block
|
||||
w-full
|
||||
shadow-sm
|
||||
sm:text-sm
|
||||
border-2
|
||||
bg-gray-50
|
||||
text-gray-500
|
||||
rounded-md
|
||||
p-2
|
||||
"
|
||||
/>
|
||||
<p
|
||||
v-if="(!isMobilePhone(userdetails.phone) && userdetails.phone.trim())"
|
||||
v-if="!isMobilePhone(userdetails.phone) && userdetails.phone.trim()"
|
||||
class="text-sm"
|
||||
>{{ $t('this_is_not_a_valid_international_phone_number') }}</p>
|
||||
>
|
||||
{{ $t("this_is_not_a_valid_international_phone_number") }}
|
||||
</p>
|
||||
<!-- -->
|
||||
<div class="grid grid-cols-6 mt-6">
|
||||
<div class="col-span-6"></div>
|
||||
@@ -115,13 +237,14 @@
|
||||
<label
|
||||
for="address_activated"
|
||||
class="font-medium text-gray-400 select-none"
|
||||
>{{ $t('provide_address') }}</label>
|
||||
>{{ $t("provide_address") }}</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="provide_address === true" class="col-span-6">
|
||||
<div class="col-span-6">
|
||||
<label for="street" class="block font-medium">
|
||||
{{ $t('strasse') }}
|
||||
{{ $t("strasse") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -131,12 +254,29 @@
|
||||
:placeholder="[[$t('strasse')]]"
|
||||
id="street"
|
||||
autocomplete="street-address"
|
||||
:class="{ 'border-red-500': (!userdetails.address.street.trim()), 'border-green-300': (userdetails.address.street.trim()) }"
|
||||
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"
|
||||
:class="{
|
||||
'border-red-500': !userdetails.address.street.trim(),
|
||||
'border-green-300': userdetails.address.street.trim(),
|
||||
}"
|
||||
class="
|
||||
dark:bg-gray-800
|
||||
mt-1
|
||||
block
|
||||
w-full
|
||||
shadow-sm
|
||||
sm:text-sm
|
||||
border-gray-300 border-2
|
||||
bg-gray-50
|
||||
text-gray-500
|
||||
rounded-md
|
||||
p-2
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-span-6">
|
||||
<label for="address2" class="block font-medium">{{ $t('apartment_suite_etc') }}</label>
|
||||
<label for="address2" class="block font-medium">{{
|
||||
$t("apartment_suite_etc")
|
||||
}}</label>
|
||||
<input
|
||||
v-model="userdetails.address.address2"
|
||||
type="text"
|
||||
@@ -144,12 +284,24 @@
|
||||
:placeholder="[[$t('apartment_suite_etc')]]"
|
||||
id="address2"
|
||||
autocomplete="street-address"
|
||||
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"
|
||||
class="
|
||||
dark:bg-gray-800
|
||||
mt-1
|
||||
block
|
||||
w-full
|
||||
shadow-sm
|
||||
sm:text-sm
|
||||
border-gray-300 border-2
|
||||
bg-gray-50
|
||||
text-gray-500
|
||||
rounded-md
|
||||
p-2
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-span-6 sm:col-span-6 lg:col-span-2">
|
||||
<label for="city" class="block font-medium">
|
||||
{{ $t('ort') }}
|
||||
{{ $t("ort") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -158,13 +310,28 @@
|
||||
name="city"
|
||||
:placeholder="[[$t('ort')]]"
|
||||
id="city"
|
||||
:class="{ 'border-red-500': (!userdetails.address.city.trim()), 'border-green-300': (userdetails.address.city.trim()) }"
|
||||
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"
|
||||
:class="{
|
||||
'border-red-500': !userdetails.address.city.trim(),
|
||||
'border-green-300': userdetails.address.city.trim(),
|
||||
}"
|
||||
class="
|
||||
dark:bg-gray-800
|
||||
mt-1
|
||||
block
|
||||
w-full
|
||||
shadow-sm
|
||||
sm:text-sm
|
||||
border-gray-300 border-2
|
||||
bg-gray-50
|
||||
text-gray-500
|
||||
rounded-md
|
||||
p-2
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-span-6 sm:col-span-3 lg:col-span-2">
|
||||
<label for="postal_code" class="block font-medium">
|
||||
{{ $t('plz') }}
|
||||
{{ $t("plz") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -174,14 +341,37 @@
|
||||
: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"
|
||||
: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>
|
||||
>
|
||||
{{ $t("please_provide_a_valid_zipcode") }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-start mt-6">
|
||||
@@ -195,15 +385,19 @@
|
||||
/>
|
||||
</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') }) }}
|
||||
<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') }}
|
||||
>{{ $t("tos") }}</a
|
||||
>
|
||||
{{ $t("i_accept_end") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
</div>
|
||||
@@ -219,8 +413,11 @@
|
||||
/>
|
||||
</div>
|
||||
<div class="ml-3 text-sm">
|
||||
<label for="data_confirmed" class="font-medium text-gray-400 select-none">
|
||||
{{ $t('confirm_personal_data') }}
|
||||
<label
|
||||
for="data_confirmed"
|
||||
class="font-medium text-gray-400 select-none"
|
||||
>
|
||||
{{ $t("confirm_personal_data") }}
|
||||
<span class="font-bold">*</span>
|
||||
</label>
|
||||
</div>
|
||||
@@ -228,10 +425,30 @@
|
||||
<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>
|
||||
: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>
|
||||
@@ -241,16 +458,17 @@
|
||||
<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";
|
||||
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
|
||||
})
|
||||
token: String,
|
||||
});
|
||||
if (props.token) {
|
||||
axios.get(`${config.baseurl}api/organizations/selfservice/${props.token}`)
|
||||
axios
|
||||
.get(`${config.baseurl}api/organizations/selfservice/${props.token}`)
|
||||
.then(({ data }) => {
|
||||
state.org_name = data.name;
|
||||
state.org_teams = data.teams;
|
||||
@@ -261,31 +479,51 @@ if (props.token) {
|
||||
});
|
||||
}
|
||||
|
||||
let userdetails = ref({ firstname: "", lastname: "", middlename: "", mail: "", phone: "", address: { street: "", address2: "", city: "", zipcode: "" } });
|
||||
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"))))
|
||||
})
|
||||
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": {}
|
||||
}
|
||||
email: userdetails.mail,
|
||||
firstname: userdetails.firstname,
|
||||
middlename: userdetails.middlename,
|
||||
lastname: userdetails.lastname,
|
||||
address: {},
|
||||
};
|
||||
if (isMobilePhone(userdetails.phone)) {
|
||||
postdata.phone = userdetails.phone;
|
||||
}
|
||||
@@ -296,23 +534,31 @@ function login() {
|
||||
city: userdetails.address.city,
|
||||
postalcode: userdetails.address.zipcode,
|
||||
country: "DE",
|
||||
}
|
||||
};
|
||||
}
|
||||
if (state.org_name !== '' && state.org_teams.length > 0) {
|
||||
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);
|
||||
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}`
|
||||
url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}`;
|
||||
}
|
||||
axios.post(url, postdata)
|
||||
registrationState.value = "loading";
|
||||
axios
|
||||
.post(url, postdata)
|
||||
.then(() => {
|
||||
location.replace(`${config.baseurl_selfservice}registered/?mail=${encodeURIComponent(postdata.email)}`);
|
||||
registrationState.value = "registered";
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error);
|
||||
if (error.data.message === "E-Mail already registered") {
|
||||
toast("bereits registriert...", { type: TYPE.ERROR });
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user