From 500971583574241bb7a88be51947cefb890f5438 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Wed, 9 Aug 2023 19:33:46 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20fix(PaginatorComponent):=20remov?= =?UTF-8?q?e=20unused=20imports=20and=20replace=20lucide-react=20icons=20w?= =?UTF-8?q?ith=20IconComponent=20for=20better=20modularity=20and=20reusabi?= =?UTF-8?q?lity=20=E2=9C=A8=20feat(PaginatorComponent):=20add=20support=20?= =?UTF-8?q?for=20custom=20icons=20using=20IconComponent=20for=20better=20c?= =?UTF-8?q?ustomization=20options=20=F0=9F=94=A7=20fix(UserManagementModal?= =?UTF-8?q?):=20remove=20unused=20imports=20and=20fix=20import=20order=20f?= =?UTF-8?q?or=20better=20organization=20=E2=9C=A8=20feat(UserManagementMod?= =?UTF-8?q?al):=20add=20password=20confirmation=20validation=20and=20reset?= =?UTF-8?q?=20form=20on=20modal=20open=20for=20better=20user=20experience?= =?UTF-8?q?=20=F0=9F=94=A7=20fix(UserManagementModal):=20fix=20modal=20siz?= =?UTF-8?q?e=20to=20be=20full=20height=20for=20better=20visibility=20and?= =?UTF-8?q?=20usability=20=E2=9C=A8=20feat(UserManagementModal):=20add=20f?= =?UTF-8?q?orm=20fields=20for=20username=20and=20password=20with=20validat?= =?UTF-8?q?ion=20for=20better=20user=20input=20handling=20=F0=9F=94=A7=20f?= =?UTF-8?q?ix(UserManagementModal):=20fix=20form=20field=20labels=20and=20?= =?UTF-8?q?error=20messages=20for=20better=20clarity=20and=20user=20guidan?= =?UTF-8?q?ce=20=E2=9C=A8=20feat(UserManagementModal):=20add=20form=20subm?= =?UTF-8?q?ission=20and=20confirmation=20handling=20for=20better=20user=20?= =?UTF-8?q?interaction=20and=20data=20management=20=F0=9F=94=A7=20fix(User?= =?UTF-8?q?ManagementModal):=20fix=20cancel=20button=20styling=20for=20bet?= =?UTF-8?q?ter=20consistency=20and=20user=20experience?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔧 fix(baseModal): add missing size options to the size prop to support additional modal sizes ✨ feat(baseModal): add support for "small-h-full" and "medium-h-full" sizes to allow modals with smaller height and full width 🔧 fix(AdminPage): import missing IconComponent and ShadTooltip components ✨ feat(AdminPage): add functionality to handle editing and adding new users 🔧 fix(applies.css): add missing semicolon to .field-invalid and .label-invalid classes 🔧 fix(styleUtils.ts): import missing Pencil, ChevronsRight, and ChevronsLeft icons --- .../components/PaginatorComponent/index.tsx | 17 +- .../components/genericIconComponent/index.tsx | 2 +- .../src/modals/UserManagementModal/index.tsx | 257 ++++++++++++++---- src/frontend/src/modals/baseModal/index.tsx | 8 +- src/frontend/src/pages/AdminPage/index.tsx | 108 ++++---- src/frontend/src/style/applies.css | 8 + src/frontend/src/utils/styleUtils.ts | 8 +- 7 files changed, 291 insertions(+), 117 deletions(-) diff --git a/src/frontend/src/components/PaginatorComponent/index.tsx b/src/frontend/src/components/PaginatorComponent/index.tsx index 29921c60a..8fcd8683f 100644 --- a/src/frontend/src/components/PaginatorComponent/index.tsx +++ b/src/frontend/src/components/PaginatorComponent/index.tsx @@ -1,9 +1,3 @@ -import { - ChevronLeft, - ChevronRight, - ChevronsLeft, - ChevronsRight, -} from "lucide-react"; import { useState } from "react"; import { Select, @@ -13,6 +7,7 @@ import { SelectValue, } from "../../components/ui/select"; import { PaginatorComponentType } from "../../types/components"; +import IconComponent from "../genericIconComponent"; import { Button } from "../ui/button"; export default function PaginatorComponent({ @@ -20,7 +15,7 @@ export default function PaginatorComponent({ pageIndex = 1, rowsCount = [10, 20, 30], totalRowsCount = 0, - paginate + paginate, }: PaginatorComponentType) { const [size, setPageSize] = useState(pageSize); const [index, setPageIndex] = useState(pageIndex); @@ -68,7 +63,7 @@ export default function PaginatorComponent({ }} > Go to first page - + diff --git a/src/frontend/src/components/genericIconComponent/index.tsx b/src/frontend/src/components/genericIconComponent/index.tsx index 32647f159..681835f44 100644 --- a/src/frontend/src/components/genericIconComponent/index.tsx +++ b/src/frontend/src/components/genericIconComponent/index.tsx @@ -7,5 +7,5 @@ export default function IconComponent({ iconColor, }: IconComponentProps): JSX.Element { const TargetIcon = nodeIconsLucide[name] ?? nodeIconsLucide["unknown"]; - return ; + return ; } diff --git a/src/frontend/src/modals/UserManagementModal/index.tsx b/src/frontend/src/modals/UserManagementModal/index.tsx index 1ab661223..22595faf3 100644 --- a/src/frontend/src/modals/UserManagementModal/index.tsx +++ b/src/frontend/src/modals/UserManagementModal/index.tsx @@ -1,9 +1,9 @@ -import { useState } from "react"; +import * as Form from "@radix-ui/react-form"; +import { useEffect, useState } from "react"; import { Button } from "../../components/ui/button"; -import { ConfirmationModalType, UserManagementType } from "../../types/components"; +import { UserManagementType } from "../../types/components"; import { nodeIconsLucide } from "../../utils/styleUtils"; import BaseModal from "../baseModal"; -import * as Form from '@radix-ui/react-form'; export default function UserManagementModal({ title, @@ -19,8 +19,25 @@ export default function UserManagementModal({ const Icon: any = nodeIconsLucide[icon]; const [open, setOpen] = useState(false); + + const [password, setPassword] = useState(data?.password ?? ""); + const [username, setUserName] = useState(data?.user ?? ""); + const [confirmPassword, setConfirmPassword] = useState(data?.password ?? ""); + + useEffect(() => { + if (!data) { + resetForm(); + } + }, [data, open]); + + function resetForm() { + setPassword(""); + setUserName(""); + setConfirmPassword(""); + } + return ( - + {children} {title} @@ -31,64 +48,190 @@ export default function UserManagementModal({ /> + { + if (password !== confirmPassword) { + event.preventDefault(); + return; + } + const data = Object.fromEntries(new FormData(event.currentTarget)); + resetForm(); + onConfirm(index ?? -1, data); + setOpen(false); + event.preventDefault(); + }} + > +
+ +
+ + Username{" "} + * + +
+ + { + setUserName(input.target.value); + }} + value={username} + className="primary-input" + required + /> + + + Please enter your username + +
- - -
- Email - - Please enter your email - - - Please provide a valid email - -
- - - -
- -
- Question - - Please enter a question - -
- -