Now uses new input types and checks if input is allowed + alerts and design changes
This commit is contained in:
parent
2f3f7261a0
commit
f66b6a0f0a
2 changed files with 145 additions and 60 deletions
|
@ -3,7 +3,14 @@ import { NewUser } from "../Types/goTypes";
|
||||||
import { api } from "../API/API";
|
import { api } from "../API/API";
|
||||||
import Logo from "../assets/Logo.svg";
|
import Logo from "../assets/Logo.svg";
|
||||||
import Button from "./Button";
|
import Button from "./Button";
|
||||||
import InputField from "./InputField";
|
import UsernameInput from "./Inputs/UsernameInput";
|
||||||
|
import PasswordInput from "./Inputs/PasswordInput";
|
||||||
|
import { alphanumeric, lowercase } from "../Data/regex";
|
||||||
|
import {
|
||||||
|
passwordLength,
|
||||||
|
usernameLowLimit,
|
||||||
|
usernameUpLimit,
|
||||||
|
} from "../Data/constants";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders a registration form for the admin to add new users in.
|
* Renders a registration form for the admin to add new users in.
|
||||||
|
@ -15,9 +22,25 @@ export default function Register(): JSX.Element {
|
||||||
const [errMessage, setErrMessage] = useState<string>();
|
const [errMessage, setErrMessage] = useState<string>();
|
||||||
|
|
||||||
const handleRegister = async (): Promise<void> => {
|
const handleRegister = async (): Promise<void> => {
|
||||||
if (username === "" || password === "") {
|
if (username !== undefined) {
|
||||||
alert("Must provide username and password");
|
if (
|
||||||
return;
|
username.length > usernameUpLimit ||
|
||||||
|
username.length < usernameLowLimit ||
|
||||||
|
!alphanumeric.test(username)
|
||||||
|
) {
|
||||||
|
alert(
|
||||||
|
"Please provide valid username: \n-Between 5-10 characters \n-No special characters (.-!?/*)",
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (password !== undefined) {
|
||||||
|
if (password.length !== passwordLength || !lowercase.test(password)) {
|
||||||
|
alert(
|
||||||
|
"Please provide valid password: \n-Exactly 6 characters \n-No uppercase letters \n-No numbers \n-No special characters (.-!?/*)",
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const newUser: NewUser = {
|
const newUser: NewUser = {
|
||||||
username: username?.replace(/ /g, "") ?? "",
|
username: username?.replace(/ /g, "") ?? "",
|
||||||
|
@ -39,7 +62,7 @@ export default function Register(): JSX.Element {
|
||||||
<div className="flex flex-col h-fit w-screen items-center justify-center">
|
<div className="flex flex-col h-fit w-screen items-center justify-center">
|
||||||
<div className="border-4 border-black bg-white flex flex-col items-center justify-center h-fit w-fit rounded-3xl content-center pl-20 pr-20">
|
<div className="border-4 border-black bg-white flex flex-col items-center justify-center h-fit w-fit rounded-3xl content-center pl-20 pr-20">
|
||||||
<form
|
<form
|
||||||
className="bg-white rounded px-8 pt-6 pb-8 mb-4 items-center justify-center flex flex-col w-fit h-fit"
|
className="bg-white rounded px-8 pt-6 pb-8 mb-4 justify-center flex flex-col w-fit h-fit"
|
||||||
onSubmit={(e) => {
|
onSubmit={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
void handleRegister();
|
void handleRegister();
|
||||||
|
@ -47,33 +70,28 @@ export default function Register(): JSX.Element {
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={Logo}
|
src={Logo}
|
||||||
className="logo w-[7vw] mb-10 mt-10"
|
className="logo self-center w-[7vw] mb-10 mt-10"
|
||||||
alt="TTIME Logo"
|
alt="TTIME Logo"
|
||||||
/>
|
/>
|
||||||
<h3 className="pb-4 mb-2 text-center font-bold text-[18px]">
|
<h3 className="pb-4 mb-2 text-center font-bold text-[18px]">
|
||||||
Register New User
|
Register New User
|
||||||
</h3>
|
</h3>
|
||||||
<div className="space-y-3">
|
|
||||||
<InputField
|
<UsernameInput
|
||||||
label="Username"
|
username={username ?? ""}
|
||||||
type="text"
|
onChange={(e) => {
|
||||||
value={username ?? ""}
|
setUsername(e.target.value);
|
||||||
onChange={(e) => {
|
}}
|
||||||
setUsername(e.target.value);
|
/>
|
||||||
}}
|
<div className="py-2" />
|
||||||
placeholder={"Username"}
|
<PasswordInput
|
||||||
/>
|
password={password ?? ""}
|
||||||
<InputField
|
onChange={(e) => {
|
||||||
label="Password"
|
setPassword(e.target.value);
|
||||||
type="password"
|
}}
|
||||||
value={password ?? ""}
|
/>
|
||||||
onChange={(e) => {
|
|
||||||
setPassword(e.target.value);
|
<div className="flex self-center justify-between">
|
||||||
}}
|
|
||||||
placeholder={"Password"}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center justify-between">
|
|
||||||
<Button
|
<Button
|
||||||
text="Register"
|
text="Register"
|
||||||
onClick={(): void => {
|
onClick={(): void => {
|
||||||
|
|
|
@ -2,32 +2,72 @@ import Button from "./Button";
|
||||||
import DeleteUser from "./DeleteUser";
|
import DeleteUser from "./DeleteUser";
|
||||||
import UserProjectListAdmin from "./UserProjectListAdmin";
|
import UserProjectListAdmin from "./UserProjectListAdmin";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import InputField from "./InputField";
|
|
||||||
import ChangeUsername from "./ChangeUsername";
|
import ChangeUsername from "./ChangeUsername";
|
||||||
import { StrNameChange } from "../Types/goTypes";
|
import { StrNameChange } from "../Types/goTypes";
|
||||||
|
import UsernameInput from "./Inputs/UsernameInput";
|
||||||
|
import PasswordInput from "./Inputs/PasswordInput";
|
||||||
|
import { alphanumeric, lowercase } from "../Data/regex";
|
||||||
|
import {
|
||||||
|
passwordLength,
|
||||||
|
usernameLowLimit,
|
||||||
|
usernameUpLimit,
|
||||||
|
} from "../Data/constants";
|
||||||
|
|
||||||
function UserInfoModal(props: {
|
function UserInfoModal(props: {
|
||||||
isVisible: boolean;
|
isVisible: boolean;
|
||||||
username: string;
|
username: string;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
}): JSX.Element {
|
}): JSX.Element {
|
||||||
const [showInput, setShowInput] = useState(false);
|
const [showNameInput, setShowNameInput] = useState(false);
|
||||||
|
const [showPwordInput, setShowPwordInput] = useState(false);
|
||||||
const [newUsername, setNewUsername] = useState("");
|
const [newUsername, setNewUsername] = useState("");
|
||||||
const [newPassword, setNewPassword] = useState("");
|
const [newPassword, setNewPassword] = useState("");
|
||||||
if (!props.isVisible) {
|
if (!props.isVisible) {
|
||||||
return <></>;
|
return <></>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleChangeNameView = (): void => {
|
/*
|
||||||
if (showInput) {
|
* Switches name input between visible/invisible
|
||||||
setShowInput(false);
|
* and makes password input invisible
|
||||||
|
*/
|
||||||
|
const handleShowNameInput = (): void => {
|
||||||
|
if (showPwordInput) setShowPwordInput(false);
|
||||||
|
if (showNameInput) {
|
||||||
|
setShowNameInput(false);
|
||||||
|
setNewUsername("");
|
||||||
} else {
|
} else {
|
||||||
setShowInput(true);
|
setShowNameInput(true);
|
||||||
|
setNewPassword("");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switches password input between visible/invisible
|
||||||
|
* and makes username input invisible
|
||||||
|
*/
|
||||||
|
const handleShowPwordInput = (): void => {
|
||||||
|
if (showNameInput) setShowNameInput(false);
|
||||||
|
if (showPwordInput) {
|
||||||
|
setShowPwordInput(false);
|
||||||
|
setNewPassword("");
|
||||||
|
} else {
|
||||||
|
setShowPwordInput(true);
|
||||||
|
setNewUsername("");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Handles name change and checks if new name meets requirements
|
||||||
const handleClickChangeName = (): void => {
|
const handleClickChangeName = (): void => {
|
||||||
if (newUsername === "") return;
|
if (
|
||||||
|
!alphanumeric.test(newUsername) ||
|
||||||
|
newUsername.length > usernameUpLimit ||
|
||||||
|
newUsername.length < usernameLowLimit
|
||||||
|
) {
|
||||||
|
alert(
|
||||||
|
"Please provide valid username: \n-Between 5-10 characters \n-No special characters (.-!?/*)",
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
confirm(
|
confirm(
|
||||||
`Do you really want to change username of ${props.username} to ${newUsername}?`,
|
`Do you really want to change username of ${props.username} to ${newUsername}?`,
|
||||||
|
@ -43,9 +83,14 @@ function UserInfoModal(props: {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Handles password change and checks if new password meets requirements
|
||||||
const handleClickChangePassword = (): void => {
|
const handleClickChangePassword = (): void => {
|
||||||
if (newPassword === "") return;
|
if (newPassword.length !== passwordLength || !lowercase.test(newPassword)) {
|
||||||
|
alert(
|
||||||
|
"Please provide valid password: \n-Exactly 6 characters \n-No uppercase letters \n-No numbers \n-No special characters (.-!?/*)",
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
confirm(`Are you sure you want to change password of ${props.username}?`)
|
confirm(`Are you sure you want to change password of ${props.username}?`)
|
||||||
) {
|
) {
|
||||||
|
@ -65,37 +110,57 @@ function UserInfoModal(props: {
|
||||||
<div className="border-4 border-black bg-white rounded-2xl text-center flex flex-col">
|
<div className="border-4 border-black bg-white rounded-2xl text-center flex flex-col">
|
||||||
<div className="mx-10">
|
<div className="mx-10">
|
||||||
<p className="font-bold text-[30px]">{props.username}</p>
|
<p className="font-bold text-[30px]">{props.username}</p>
|
||||||
<p
|
<p className="mt-2 font-bold text-[20px]">Change:</p>
|
||||||
className="mb-[10px] hover:font-bold hover:cursor-pointer underline"
|
<p className="mt-2 space-x-3 mb-[10px]">
|
||||||
onClick={handleChangeNameView}
|
<span
|
||||||
>
|
className={
|
||||||
(Change Username or Password)
|
showNameInput
|
||||||
|
? "items-start font-semibold py-1 px-2 border-2 border-transparent rounded-full bg-orange-500 transition-all hover:bg-orange-600 text-white hover:cursor-pointer ring-2 ring-black"
|
||||||
|
: "items-start font-medium py-1 px-2 border-2 border-gray-500 text-white rounded-full bg-orange-300 hover:bg-orange-400 transition-all hover:text-gray-100 hover:border-gray-600 hover:cursor-pointer"
|
||||||
|
}
|
||||||
|
onClick={handleShowNameInput}
|
||||||
|
>
|
||||||
|
Username
|
||||||
|
</span>{" "}
|
||||||
|
<span
|
||||||
|
className={
|
||||||
|
showPwordInput
|
||||||
|
? "items-start font-semibold py-1 px-2 border-2 border-transparent rounded-full bg-orange-500 transition-all hover:bg-orange-600 text-white hover:cursor-pointer ring-2 ring-black"
|
||||||
|
: "items-start font-medium py-1 px-2 border-2 border-gray-500 text-white rounded-full bg-orange-300 hover:bg-orange-400 transition-all hover:text-gray-100 hover:border-gray-600 hover:cursor-pointer"
|
||||||
|
}
|
||||||
|
onClick={handleShowPwordInput}
|
||||||
|
>
|
||||||
|
Password
|
||||||
|
</span>
|
||||||
</p>
|
</p>
|
||||||
{showInput && (
|
{showNameInput && (
|
||||||
<div>
|
<div className="mt-7">
|
||||||
<InputField
|
<UsernameInput
|
||||||
label={"New username"}
|
username={newUsername}
|
||||||
type={"text"}
|
onChange={(e) => {
|
||||||
value={newUsername}
|
|
||||||
onChange={function (e): void {
|
|
||||||
setNewUsername(e.target.value);
|
setNewUsername(e.target.value);
|
||||||
}}
|
}}
|
||||||
placeholder={"Username"}
|
|
||||||
/>
|
|
||||||
<div className="m-4"></div>
|
|
||||||
<InputField
|
|
||||||
label={"New password"}
|
|
||||||
type={"password"}
|
|
||||||
value={newPassword}
|
|
||||||
onChange={function (e): void {
|
|
||||||
setNewPassword(e.target.value);
|
|
||||||
}}
|
|
||||||
placeholder={"Password"}
|
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
text={"Change"}
|
text={"Change"}
|
||||||
onClick={function (): void {
|
onClick={function (): void {
|
||||||
handleClickChangeName();
|
handleClickChangeName();
|
||||||
|
}}
|
||||||
|
type={"submit"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{showPwordInput && (
|
||||||
|
<div className="mt-7">
|
||||||
|
<PasswordInput
|
||||||
|
password={newPassword}
|
||||||
|
onChange={(e) => {
|
||||||
|
setNewPassword(e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
text={"Change"}
|
||||||
|
onClick={function (): void {
|
||||||
handleClickChangePassword();
|
handleClickChangePassword();
|
||||||
}}
|
}}
|
||||||
type={"submit"}
|
type={"submit"}
|
||||||
|
@ -122,7 +187,9 @@ function UserInfoModal(props: {
|
||||||
text={"Close"}
|
text={"Close"}
|
||||||
onClick={function (): void {
|
onClick={function (): void {
|
||||||
setNewUsername("");
|
setNewUsername("");
|
||||||
setShowInput(false);
|
setNewPassword("");
|
||||||
|
setShowNameInput(false);
|
||||||
|
setShowPwordInput(false);
|
||||||
props.onClose();
|
props.onClose();
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
|
|
Loading…
Reference in a new issue