feat: add user confirmation functionality and dynamic table creation; enhance MainForm with user selection and next ID display

This commit is contained in:
2026-01-19 13:51:33 +01:00
parent 1208d731ca
commit 3c5ec1923f
5 changed files with 97 additions and 4 deletions

View File

@@ -22,4 +22,59 @@ export const getUser = async () => {
} }
}; };
export const confirmUser = async (username) => {
const [rows] = await pool.query("SELECT * FROM usersNEW WHERE username = ?", [
username,
]);
if (rows.length > 0) {
// creating userTicketTable
const d = new Date();
const day = d.getDate();
const month = d.getMonth() + 1;
const year = d.getFullYear();
const date = `${day}_${month}_${year}`;
const tableName = `${username}_${date}`;
console.log(tableName);
const [createTable] = await pool.query(
`CREATE TABLE IF NOT EXISTS ${tableName} (
id INT AUTO_INCREMENT PRIMARY KEY,
Vorname VARCHAR(100) NOT NULL,
Nachname Varchar(100) NOT NULL,
EMail Varchar(100) NOT NULL,
Telefonnummer Varchar(100) NOT NULL,
Lose INT NOT NULL,
Firmenname Varchar(100),
Vorname_Geschaeftlich Varchar(100),
Nachname_Geschaeftlich Varchar(100),
EMail_Geschaeftlich Varchar(100),
Telefonnummer_Geschaeftlich Varchar(100),
Strasse_Hausnr Varchar(100),
Plz_Ort Varchar(100),
Zahlungsmethode Varchar(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)`
);
if (createTable) {
let nextID;
const getNextID = async () => {
const [rows] = await pool.query(
`SELECT id FROM ${tableName} ORDER BY id DESC LIMIT 1`
);
nextID = rows.length > 0 ? rows[0].id + 1 : 1;
};
await getNextID();
return { success: true, nextID };
} else {
return { success: false, message: "Table creation failed" };
}
} else {
return null;
}
};
export const confirmData = async (data) => {}; export const confirmData = async (data) => {};

View File

@@ -3,7 +3,7 @@ import dotenv from "dotenv";
const router = express.Router(); const router = express.Router();
dotenv.config(); dotenv.config();
import { getUser, confirmData } from "./frontend.data.js"; import { getUser, confirmData, confirmUser } from "./frontend.data.js";
router.post("/frontend", async (req, res) => { router.post("/frontend", async (req, res) => {
const result = await confirmData(req.body); const result = await confirmData(req.body);
@@ -11,7 +11,6 @@ router.post("/frontend", async (req, res) => {
return res.status(500).json({ message: "Form Data Invalid" }); return res.status(500).json({ message: "Form Data Invalid" });
} }
console.log(req.body); console.log(req.body);
const user = await getUser(req.body.code);
console.log(user); console.log(user);
res.sendStatus(204); res.sendStatus(204);
}); });
@@ -21,4 +20,16 @@ router.get("/users", async (req, res) => {
res.json(users); res.json(users);
}); });
router.get("/confirm-user", async (req, res) => {
const username = req.query.username;
if (!username) {
return res.status(400).json({ message: "Username is required" });
}
const user = await confirmUser(username);
if (!user) {
return res.status(404).json({ message: "User not found" });
}
res.json(user);
});
export default router; export default router;

View File

@@ -6,6 +6,7 @@ import {
Alert, Alert,
CircularProgress, CircularProgress,
Autocomplete, Autocomplete,
Chip,
} from "@mui/material"; } from "@mui/material";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
@@ -22,6 +23,7 @@ export const MainForm = () => {
const [invoice, setInvoice] = useState(false); const [invoice, setInvoice] = useState(false);
const [msg, setMsg] = useState<Message | null>(null); const [msg, setMsg] = useState<Message | null>(null);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [nextID, setNextID] = useState<number | null>(null);
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
firstName: "", firstName: "",
lastName: "", lastName: "",
@@ -63,6 +65,22 @@ export const MainForm = () => {
setFormData({ ...formData, [e.target.name]: e.target.value }); setFormData({ ...formData, [e.target.name]: e.target.value });
}; };
const handleUserSelection = (selectedUser: string | null) => {
if (!selectedUser) return;
const confirmUser = async () => {
try {
const response = await fetch(
`http://localhost:8004/default/confirm-user?username=${selectedUser}`
);
const data = await response.json();
setNextID(data.nextID);
} catch (error) {
console.error("Error confirming user:", error);
}
};
confirmUser();
};
const handleSubmit = async () => { const handleSubmit = async () => {
setIsLoading(true); setIsLoading(true);
try { try {
@@ -87,6 +105,7 @@ export const MainForm = () => {
return ( return (
<> <>
<Chip label={`${t("next-id")}#${nextID ?? "N/A"}`} />
<form <form
onSubmit={(e) => { onSubmit={(e) => {
e.preventDefault(); e.preventDefault();
@@ -98,6 +117,12 @@ export const MainForm = () => {
options={users} options={users}
sx={{ width: 300 }} sx={{ width: 300 }}
renderInput={(params) => <TextField {...params} label={t("user")} />} renderInput={(params) => <TextField {...params} label={t("user")} />}
onChange={(_event, value) => handleUserSelection(value)}
onKeyDown={(event) => {
if (event.key === "Enter") {
event.defaultMuiPrevented = true;
}
}}
/> />
<TextField <TextField
required required

View File

@@ -10,5 +10,6 @@
"email": "E-Mail", "email": "E-Mail",
"submit": "Kaufen", "submit": "Kaufen",
"failed-to-load-users": "Das Laden der Benutzer ist fehlgeschlagen.", "failed-to-load-users": "Das Laden der Benutzer ist fehlgeschlagen.",
"user": "Benutzer" "user": "Benutzer",
"next-id": "Nächste Eintragsnummer: "
} }

View File

@@ -10,5 +10,6 @@
"email": "Email", "email": "Email",
"submit": "Buy", "submit": "Buy",
"failed-to-load-users": "Failed to load users.", "failed-to-load-users": "Failed to load users.",
"user": "User" "user": "User",
"next-id": "Next Entry Number: "
} }