Merged in bug-fixing-140223 (pull request #7)

Bug fixing 140223
This commit is contained in:
João Ramos
2023-12-15 15:52:07 +00:00
committed by Tiago Ribeiro
5 changed files with 110 additions and 90 deletions

View File

@@ -9,6 +9,7 @@ import moment from "moment";
import MobileMenu from "./MobileMenu"; import MobileMenu from "./MobileMenu";
import {useState} from "react"; import {useState} from "react";
import {Type} from "@/interfaces/user"; import {Type} from "@/interfaces/user";
import {USER_TYPE_LABELS} from "@/resources/user";
interface Props { interface Props {
user: User; user: User;
@@ -43,8 +44,6 @@ export default function Navbar({user, path, navDisabled = false, focusMode = fal
return today.add(7, "days").isAfter(momentDate); return today.add(7, "days").isAfter(momentDate);
}; };
const uppercaseFirstLetter = (string: Type) => string.charAt(0).toUpperCase() + string.slice(1);
return ( return (
<> <>
{user && <MobileMenu path={path} isOpen={isMenuOpen} onClose={() => setIsMenuOpen(false)} user={user} />} {user && <MobileMenu path={path} isOpen={isMenuOpen} onClose={() => setIsMenuOpen(false)} user={user} />}
@@ -72,7 +71,9 @@ export default function Navbar({user, path, navDisabled = false, focusMode = fal
)} )}
<Link href={disableNavigation ? "" : "/profile"} className="flex gap-6 items-center justify-end -md:hidden"> <Link href={disableNavigation ? "" : "/profile"} className="flex gap-6 items-center justify-end -md:hidden">
<img src={user.profilePicture} alt={user.name} className="w-10 h-10 rounded-full object-cover" /> <img src={user.profilePicture} alt={user.name} className="w-10 h-10 rounded-full object-cover" />
<span className="text-right -md:hidden">{user.name} | {uppercaseFirstLetter(user.type)}</span> <span className="text-right -md:hidden">
{user.name} | {USER_TYPE_LABELS[user.type]}
</span>
</Link> </Link>
<div className="cursor-pointer md:hidden" onClick={() => setIsMenuOpen(true)}> <div className="cursor-pointer md:hidden" onClick={() => setIsMenuOpen(true)}>
<BsList className="text-mti-purple-light w-8 h-8" /> <BsList className="text-mti-purple-light w-8 h-8" />

View File

@@ -90,7 +90,7 @@ const UserCard = ({user, loggedInUser, onClose, onViewStudents, onViewTeachers,
agentInformation: agentInformation:
type === "agent" type === "agent"
? { ? {
companyName, name: companyName,
commercialRegistration, commercialRegistration,
} }
: undefined, : undefined,
@@ -100,13 +100,13 @@ const UserCard = ({user, loggedInUser, onClose, onViewStudents, onViewTeachers,
referralAgent, referralAgent,
monthlyDuration, monthlyDuration,
companyInformation: { companyInformation: {
companyName, name: companyName,
userAmount, userAmount,
}, },
payment: { payment: {
value: paymentValue, value: paymentValue,
currency: paymentCurrency, currency: paymentCurrency,
...referralAgent === '' ? {} : { commission: commissionValue } ...(referralAgent === "" ? {} : {commission: commissionValue}),
}, },
} }
: undefined, : undefined,
@@ -253,7 +253,7 @@ const UserCard = ({user, loggedInUser, onClose, onViewStudents, onViewTeachers,
)} )}
</div> </div>
<div className="flex flex-col gap-3 w-4/12"> <div className="flex flex-col gap-3 w-4/12">
{referralAgent !== '' ? ( {referralAgent !== "" ? (
<> <>
<label className="font-normal text-base text-mti-gray-dim">Commission</label> <label className="font-normal text-base text-mti-gray-dim">Commission</label>
<Input <Input
@@ -264,7 +264,9 @@ const UserCard = ({user, loggedInUser, onClose, onViewStudents, onViewTeachers,
className="col-span-3" className="col-span-3"
/> />
</> </>
) : <div />} ) : (
<div />
)}
</div> </div>
</div> </div>
<Divider className="w-full !m-0" /> <Divider className="w-full !m-0" />

View File

@@ -7,11 +7,7 @@ import UserList from "@/pages/(admin)/Lists/UserList";
import {dateSorter} from "@/utils"; import {dateSorter} from "@/utils";
import moment from "moment"; import moment from "moment";
import {useEffect, useState} from "react"; import {useEffect, useState} from "react";
import { import {BsArrowLeft, BsPersonFill, BsBank} from "react-icons/bs";
BsArrowLeft,
BsPersonFill,
BsBank
} from "react-icons/bs";
import UserCard from "@/components/UserCard"; import UserCard from "@/components/UserCard";
import useGroups from "@/hooks/useGroups"; import useGroups from "@/hooks/useGroups";
import {calculateAverageLevel, calculateBandScore} from "@/utils/score"; import {calculateAverageLevel, calculateBandScore} from "@/utils/score";
@@ -41,7 +37,8 @@ export default function AgentDashboard({user}: Props) {
const corporateFilter = (user: User) => user.type === "corporate"; const corporateFilter = (user: User) => user.type === "corporate";
const referredCorporateFilter = (x: User) => const referredCorporateFilter = (x: User) =>
x.type === "corporate" && !!x.corporateInformation && x.corporateInformation.referralAgent === user.id; x.type === "corporate" && !!x.corporateInformation && x.corporateInformation.referralAgent === user.id;
const inactiveReferredCorporateFilter = (x: User) => referredCorporateFilter(x) && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); const inactiveReferredCorporateFilter = (x: User) =>
referredCorporateFilter(x) && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate));
const UserDisplay = (displayUser: User) => ( const UserDisplay = (displayUser: User) => (
<div <div

View File

@@ -25,7 +25,7 @@ import Input from "@/components/Low/Input";
import ReactDatePicker from "react-datepicker"; import ReactDatePicker from "react-datepicker";
import moment from "moment"; import moment from "moment";
import PaymentAssetManager from "@/components/PaymentAssetManager"; import PaymentAssetManager from "@/components/PaymentAssetManager";
import { toFixedNumber } from "@/utils/number"; import {toFixedNumber} from "@/utils/number";
export const getServerSideProps = withIronSessionSsr(({req, res}) => { export const getServerSideProps = withIronSessionSsr(({req, res}) => {
const user = req.session.user; const user = req.session.user;
@@ -59,7 +59,7 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => {
const columnHelper = createColumnHelper<Payment>(); const columnHelper = createColumnHelper<Payment>();
const PaymentCreator = ({onClose, reload}: {onClose: () => void; reload: () => void}) => { const PaymentCreator = ({onClose, reload, showComission = false}: {onClose: () => void; reload: () => void; showComission: boolean}) => {
const [corporate, setCorporate] = useState<CorporateUser>(); const [corporate, setCorporate] = useState<CorporateUser>();
const [price, setPrice] = useState<number>(0); const [price, setPrice] = useState<number>(0);
const [currency, setCurrency] = useState<string>("EUR"); const [currency, setCurrency] = useState<string>("EUR");
@@ -175,7 +175,7 @@ const PaymentCreator = ({onClose, reload}: {onClose: () => void; reload: () => v
/> />
</div> </div>
</div> </div>
{showComission && (
<div className="flex gap-4 w-full"> <div className="flex gap-4 w-full">
<div className="flex flex-col w-full gap-3"> <div className="flex flex-col w-full gap-3">
<label className="font-normal text-base text-mti-gray-dim">Commission *</label> <label className="font-normal text-base text-mti-gray-dim">Commission *</label>
@@ -193,6 +193,7 @@ const PaymentCreator = ({onClose, reload}: {onClose: () => void; reload: () => v
/> />
</div> </div>
</div> </div>
)}
<div className="flex gap-4"> <div className="flex gap-4">
<div className="flex flex-col w-full gap-3"> <div className="flex flex-col w-full gap-3">
@@ -244,8 +245,13 @@ export default function PaymentRecord() {
const [agent, setAgent] = useState<User>(); const [agent, setAgent] = useState<User>();
const {user} = useUser({redirectTo: "/login"}); const {user} = useUser({redirectTo: "/login"});
const {users} = useUsers(); const {users, reload: reloadUsers} = useUsers();
const {payments, reload} = usePayments(); const {payments, reload: reloadPayment} = usePayments();
const reload = () => {
reloadUsers();
reloadPayment();
};
useEffect(() => { useEffect(() => {
setDisplayPayments( setDisplayPayments(
@@ -415,14 +421,18 @@ export default function PaymentRecord() {
}), }),
columnHelper.accessor("corporate", { columnHelper.accessor("corporate", {
header: "Corporate", header: "Corporate",
cell: (info) => ( cell: (info) => {
const user = users.find((x) => x.id === info.row.original.corporate) as CorporateUser;
return (
<div <div
className={clsx("underline text-mti-purple-light hover:text-mti-purple-dark transition ease-in-out duration-300 cursor-pointer")} className={clsx(
onClick={() => setSelectedUser(users.find((x) => x.id === info.row.original.corporate))}> "underline text-mti-purple-light hover:text-mti-purple-dark transition ease-in-out duration-300 cursor-pointer",
{(users.find((x) => x.id === info.row.original.corporate) as CorporateUser)?.corporateInformation.companyInformation.name || )}
(users.find((x) => x.id === info.row.original.corporate) as CorporateUser)?.name} onClick={() => setSelectedUser(user)}>
{user?.corporateInformation.companyInformation.name || user?.name}
</div> </div>
), );
},
}), }),
columnHelper.accessor("date", { columnHelper.accessor("date", {
header: "Date", header: "Date",
@@ -524,7 +534,11 @@ export default function PaymentRecord() {
</Modal> </Modal>
<Modal isOpen={isCreatingPayment} onClose={() => setIsCreatingPayment(false)}> <Modal isOpen={isCreatingPayment} onClose={() => setIsCreatingPayment(false)}>
<PaymentCreator onClose={() => setIsCreatingPayment(false)} reload={reload} /> <PaymentCreator
onClose={() => setIsCreatingPayment(false)}
reload={reload}
showComission={user.type === "developer" || user.type === "admin"}
/>
</Modal> </Modal>
<div className="w-full flex flex-end justify-between p-2"> <div className="w-full flex flex-end justify-between p-2">

View File

@@ -64,6 +64,8 @@ export default function Home() {
const [gender, setGender] = useState<Gender>(); const [gender, setGender] = useState<Gender>();
const [employment, setEmployment] = useState<EmploymentStatus>(); const [employment, setEmployment] = useState<EmploymentStatus>();
const [position, setPosition] = useState<string>(); const [position, setPosition] = useState<string>();
const [companyName, setCompanyName] = useState<string>("");
const [commercialRegistration, setCommercialRegistration] = useState<string>("");
const profilePictureInput = useRef(null); const profilePictureInput = useRef(null);
@@ -89,6 +91,10 @@ export default function Home() {
setGender(user.demographicInformation?.gender); setGender(user.demographicInformation?.gender);
setEmployment(user.type === "corporate" ? undefined : user.demographicInformation?.employment); setEmployment(user.type === "corporate" ? undefined : user.demographicInformation?.employment);
setPosition(user.type === "corporate" ? user.demographicInformation?.position : undefined); setPosition(user.type === "corporate" ? user.demographicInformation?.position : undefined);
if(user.type === 'agent') {
setCompanyName(user.agentInformation?.companyName)
setCommercialRegistration(user.agentInformation?.commercialRegistration)
}
} }
}, [user]); }, [user]);
@@ -219,7 +225,7 @@ export default function Home() {
name="companyName" name="companyName"
onChange={() => null} onChange={() => null}
placeholder="Enter corporate name" placeholder="Enter corporate name"
defaultValue={user.agentInformation.companyName} defaultValue={companyName}
disabled disabled
/> />
<Input <Input
@@ -228,7 +234,7 @@ export default function Home() {
name="commercialRegistration" name="commercialRegistration"
onChange={() => null} onChange={() => null}
placeholder="Enter commercial registration" placeholder="Enter commercial registration"
defaultValue={user.agentInformation.commercialRegistration} defaultValue={commercialRegistration}
disabled disabled
/> />
</div> </div>