2 Commits

Author SHA1 Message Date
theis.gaedigk d8e8062990 fixed number input 2026-06-10 13:45:13 +02:00
theis.gaedigk 470fe75d86 added chocolates box 2026-06-09 17:43:56 +02:00
6 changed files with 44 additions and 84 deletions
+3 -1
View File
@@ -51,6 +51,7 @@ export const confirmUser = async (username) => {
EMail Varchar(100) NOT NULL, EMail Varchar(100) NOT NULL,
Telefonnummer Varchar(100) NOT NULL, Telefonnummer Varchar(100) NOT NULL,
Lose INT NOT NULL, Lose INT NOT NULL,
Schokolade BOOLEAN NOT NULL,
Firmenname Varchar(100), Firmenname Varchar(100),
Vorname_Geschaeftlich Varchar(100), Vorname_Geschaeftlich Varchar(100),
Nachname_Geschaeftlich Varchar(100), Nachname_Geschaeftlich Varchar(100),
@@ -93,7 +94,7 @@ export const newEntry = async (formData, username, prizeDraw) => {
const tableName = confirmation.tableName; const tableName = confirmation.tableName;
const [result] = await pool.query( const [result] = await pool.query(
`INSERT INTO ?? (Verlosung, Vorname, Nachname, EMail, Telefonnummer, Lose, Firmenname, Vorname_Geschaeftlich, Nachname_Geschaeftlich, EMail_Geschaeftlich, Telefonnummer_Geschaeftlich, Strasse_Hausnr, Plz_Ort, Zahlungsmethode) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, `INSERT INTO ?? (Verlosung, Vorname, Nachname, EMail, Telefonnummer, Lose, Schokolade, Firmenname, Vorname_Geschaeftlich, Nachname_Geschaeftlich, EMail_Geschaeftlich, Telefonnummer_Geschaeftlich, Strasse_Hausnr, Plz_Ort, Zahlungsmethode) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[ [
tableName, tableName,
prizeDraw, prizeDraw,
@@ -102,6 +103,7 @@ export const newEntry = async (formData, username, prizeDraw) => {
formData.email, formData.email,
formData.phoneNumber, formData.phoneNumber,
formData.tickets, formData.tickets,
formData.chocolates,
formData.companyName, formData.companyName,
formData.cmpFirstName, formData.cmpFirstName,
formData.cpmLastName, formData.cpmLastName,
+12 -72
View File
@@ -1,19 +1,16 @@
services: services:
frontend: # frontend:
container_name: ca-lose-frontend # container_name: ca-lose-frontend
hostname: lose-verkaufen # build: ./frontend
build: ./frontend # ports:
depends_on: # - "8002:80"
- backend # restart: unless-stopped
networks:
ca-lose-internal:
ipv4_address: 172.25.0.2
restart: unless-stopped
backend: backend:
container_name: ca-lose-backend container_name: ca-lose-backend
hostname: backend
build: ./backend build: ./backend
ports:
- "8004:8004"
environment: environment:
NODE_ENV: production NODE_ENV: production
DB_HOST: ca-lose-mysql DB_HOST: ca-lose-mysql
@@ -22,78 +19,21 @@ services:
DB_NAME: ca_lose DB_NAME: ca_lose
depends_on: depends_on:
- database - database
networks:
ca-lose-internal:
ipv4_address: 172.25.0.3
restart: unless-stopped restart: unless-stopped
database: database:
container_name: ca-lose-mysql container_name: ca-lose-mysql
hostname: database
image: mysql:8.0 image: mysql:8.0
restart: unless-stopped restart: unless-stopped
ports:
- "3311:3306"
environment: environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ca_lose MYSQL_DATABASE: ca_lose
TZ: Europe/Berlin TZ: Europe/Berlin
volumes: volumes:
- ../docker/volumes/ca-lose_mysql:/var/lib/mysql - ./.docker/volumes/ca-lose_mysql:/var/lib/mysql
- ./mysql-timezone.cnf:/etc/mysql/conf.d/timezone.cnf:ro - ./mysql-timezone.cnf:/etc/mysql/conf.d/timezone.cnf:ro
networks:
ca-lose-internal:
ipv4_address: 172.25.0.4
# DNS Server for hostname resolution within the Docker network
dnsmasq:
container_name: ca-lose-dns
image: andyshinn/dnsmasq:latest
restart: unless-stopped
cap_add:
- NET_ADMIN
command: >
--no-daemon
--log-queries
--address=/lose-verkaufen/172.25.0.2
--address=/frontend/172.25.0.2
--address=/backend/172.25.0.3
--address=/database/172.25.0.4
--address=/wireguard/172.25.0.6
networks:
ca-lose-internal:
ipv4_address: 172.25.0.5
# WireGuard VPN server for secure remote access to the Docker network
wireguard:
build: ./wg-easy-ca-lose
container_name: ca-lose-wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
WG_HOST: dus3.the1s.de
INSECURE: "true"
HOST: "172.25.0.6"
PORT: "80"
volumes: volumes:
- ../docker/volumes/ca-lose-wireguard-v15:/etc/wireguard ca-lose_mysql:
- /lib/modules:/lib/modules:ro
ports:
- "51830:51830/udp"
# - "51831:51821/tcp" Public Web-UI Port
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
depends_on:
- dnsmasq
networks:
ca-lose-internal:
ipv4_address: 172.25.0.6
networks:
ca-lose-internal:
driver: bridge
ipam:
config:
- subnet: 172.25.0.0/24
gateway: 172.25.0.1
+1
View File
@@ -46,6 +46,7 @@ export const createFormSchema = (
email: z.email(t("email-error")), email: z.email(t("email-error")),
phoneNumber: z.string(t("phone-error")).refine(validator.isMobilePhone), phoneNumber: z.string(t("phone-error")).refine(validator.isMobilePhone),
tickets: z.number(t("ticket-error")).min(1), tickets: z.number(t("ticket-error")).min(1),
chocolates: z.boolean(t("chocolates-error")),
companyName: invoice companyName: invoice
? z.string().min(1, t("name-error")) ? z.string().min(1, t("name-error"))
: z.string().optional(), : z.string().optional(),
+21 -8
View File
@@ -72,7 +72,8 @@ export const MainForm = () => {
lastName: "", lastName: "",
email: "", email: "",
phoneNumber: "", phoneNumber: "",
tickets: 1, tickets: 0,
chocolates: false,
companyName: "", companyName: "",
cmpFirstName: "", cmpFirstName: "",
cpmLastName: "", cpmLastName: "",
@@ -316,7 +317,7 @@ export const MainForm = () => {
)} )}
</Field> </Field>
{/* Tickets + Invoice toggle */} {/* Tickets + Invoice + Chocolate toggle */}
<div className="grid grid-cols-2 gap-3 items-end"> <div className="grid grid-cols-2 gap-3 items-end">
<FormControl required> <FormControl required>
<FormLabel>{t("tickets")}</FormLabel> <FormLabel>{t("tickets")}</FormLabel>
@@ -330,12 +331,14 @@ export const MainForm = () => {
<> <>
<Input <Input
type="number" type="number"
value={field.state.value ?? ""} value={
onBlur={field.handleBlur} field.state.value === 0 ? "" : field.state.value
onChange={(e) =>
field.handleChange(Number(e.target.value))
} }
slotProps={{ input: { min: 1 } }} onBlur={field.handleBlur}
onChange={(e) => {
const val = e.target.value;
field.handleChange(val === "" ? 0 : Number(val));
}}
variant="soft" variant="soft"
sx={{ borderRadius: "10px" }} sx={{ borderRadius: "10px" }}
/> />
@@ -349,7 +352,7 @@ export const MainForm = () => {
}} }}
</Field> </Field>
</FormControl> </FormControl>
<div className="flex items-center pb-2"> <div className="flex flex-col gap-2 pb-2">
<Checkbox <Checkbox
checked={invoice} checked={invoice}
onChange={(e) => { onChange={(e) => {
@@ -368,6 +371,16 @@ export const MainForm = () => {
label={t("invoice")} label={t("invoice")}
variant="outlined" variant="outlined"
/> />
<Field name="chocolates">
{(field) => (
<Checkbox
checked={!!field.state.value}
onChange={(e) => field.handleChange(e.target.checked)}
label={t("chocolates")}
variant="outlined"
/>
)}
</Field>
</div> </div>
</div> </div>
+3 -1
View File
@@ -35,5 +35,7 @@
"name-error": "Sie müssen einen Namen eingeben!", "name-error": "Sie müssen einen Namen eingeben!",
"email-error": "Sie müssen eine gültige E-Mail Adresse eingeben!", "email-error": "Sie müssen eine gültige E-Mail Adresse eingeben!",
"phone-error": "Sie müssen eine gültige Telefonnummer eingeben!", "phone-error": "Sie müssen eine gültige Telefonnummer eingeben!",
"footer-headline": "Dieses System wurde vollständig konzipiert und entwickelt von Theis Gaedigk. - Portfolio: " "footer-headline": "Dieses System wurde vollständig konzipiert und entwickelt von Theis Gaedigk. - Portfolio: ",
"chocolates": "Schokoladen",
"chocolates-error": "Dieses Feld kann nur wahr oder falsch sein."
} }
+3 -1
View File
@@ -36,5 +36,7 @@
"name-error": "You have to enter a name!", "name-error": "You have to enter a name!",
"email-error": "You have to enter a valid E-Mail adress!", "email-error": "You have to enter a valid E-Mail adress!",
"phone-error": "You have to enter a vaild phone number!", "phone-error": "You have to enter a vaild phone number!",
"footer-headline": "This system was fully designed and developed by Theis Gaedigk. - Portfolio: " "footer-headline": "This system was fully designed and developed by Theis Gaedigk. - Portfolio: ",
"chocolates": "Chocolates",
"chocolates-error": "This field can only be true or false."
} }