✨ Add a loader to users
This commit is contained in:
parent
b14a7a5fbf
commit
ee2b018c2c
@ -83,3 +83,15 @@
|
|||||||
.remove-my-vote {
|
.remove-my-vote {
|
||||||
margin-top: 16px;
|
margin-top: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader-container {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100%;
|
||||||
|
.loader {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -18,6 +18,7 @@ import { useCallback, useEffect, useState } from "react";
|
|||||||
|
|
||||||
import classes from "./classes.module.scss";
|
import classes from "./classes.module.scss";
|
||||||
import OfficeRoles from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles";
|
import OfficeRoles from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles";
|
||||||
|
import Loader from "@Front/Components/DesignSystem/Loader";
|
||||||
|
|
||||||
type IProps = {};
|
type IProps = {};
|
||||||
export default function UserInformations(props: IProps) {
|
export default function UserInformations(props: IProps) {
|
||||||
@ -36,10 +37,12 @@ export default function UserInformations(props: IProps) {
|
|||||||
|
|
||||||
const [currentAppointment, setCurrentAppointment] = useState<Appointment | null>(null);
|
const [currentAppointment, setCurrentAppointment] = useState<Appointment | null>(null);
|
||||||
|
|
||||||
|
const [isLoading, setIsLoading] = useState<boolean>(true);
|
||||||
/** When page change, get the user of the page */
|
/** When page change, get the user of the page */
|
||||||
|
|
||||||
const getUser = useCallback(async () => {
|
const getUser = useCallback(async () => {
|
||||||
if (!userUid) return;
|
if (!userUid) return;
|
||||||
|
setIsLoading(true);
|
||||||
const user = await Users.getInstance().getByUid(userUid as string, {
|
const user = await Users.getInstance().getByUid(userUid as string, {
|
||||||
q: {
|
q: {
|
||||||
contact: true,
|
contact: true,
|
||||||
@ -66,6 +69,7 @@ export default function UserInformations(props: IProps) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
if (!roles) return;
|
if (!roles) return;
|
||||||
|
setIsLoading(false);
|
||||||
setUserSelected(user);
|
setUserSelected(user);
|
||||||
}, [userUid]);
|
}, [userUid]);
|
||||||
|
|
||||||
@ -201,135 +205,146 @@ export default function UserInformations(props: IProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<DefaultUserDashboard mobileBackText={"Liste des utilisateurs"}>
|
<DefaultUserDashboard mobileBackText={"Liste des utilisateurs"}>
|
||||||
<div className={classes["root"]}>
|
{!isLoading && (
|
||||||
<div className={classes["header"]}>
|
<div className={classes["root"]}>
|
||||||
<Typography typo={ITypo.H1Bis}>{userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name}</Typography>
|
<div className={classes["header"]}>
|
||||||
<Typography typo={ITypo.H3} color={ITypoColor.GREY}>
|
<Typography typo={ITypo.H1Bis}>
|
||||||
Office {userSelected?.office_membership?.name.toLocaleUpperCase()}
|
{userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name}
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
<div className={classes["user-infos"]}>
|
|
||||||
<div className={classes["user-infos-row"]}>
|
|
||||||
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
|
||||||
Nom
|
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography typo={ITypo.P_18}>{userSelected?.contact?.first_name}</Typography>
|
<Typography typo={ITypo.H3} color={ITypoColor.GREY}>
|
||||||
</div>
|
Office {userSelected?.office_membership?.name.toLocaleUpperCase()}
|
||||||
<div className={classes["user-infos-row"]}>
|
|
||||||
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
|
||||||
Prénom
|
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography typo={ITypo.P_18}>{userSelected?.contact?.last_name}</Typography>
|
|
||||||
</div>
|
</div>
|
||||||
<div className={classes["user-infos-row"]}>
|
<div className={classes["user-infos"]}>
|
||||||
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
<div className={classes["user-infos-row"]}>
|
||||||
Numéro de téléphone
|
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
||||||
</Typography>
|
Nom
|
||||||
<Typography typo={ITypo.P_18}>{userSelected?.contact?.phone_number}</Typography>
|
</Typography>
|
||||||
</div>
|
<Typography typo={ITypo.P_18}>{userSelected?.contact?.first_name}</Typography>
|
||||||
<div className={classes["user-infos-row"]}>
|
|
||||||
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
|
||||||
Email
|
|
||||||
</Typography>
|
|
||||||
<Typography typo={ITypo.P_18}>{userSelected?.contact?.email}</Typography>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className={classes["role-container"]}>
|
|
||||||
<div className={classes["part"]}>
|
|
||||||
<div className={classes["first-line"]}>
|
|
||||||
<Typography typo={ITypo.P_SB_18}>Rôle au sein de son office</Typography>
|
|
||||||
</div>
|
</div>
|
||||||
<div className={classes["second-line"]}>
|
<div className={classes["user-infos-row"]}>
|
||||||
<Typography typo={ITypo.P_18}>
|
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
||||||
{userSelected?.office_role ? userSelected?.office_role?.name : "Utilisateur restreint"}
|
Prénom
|
||||||
|
</Typography>
|
||||||
|
<Typography typo={ITypo.P_18}>{userSelected?.contact?.last_name}</Typography>
|
||||||
|
</div>
|
||||||
|
<div className={classes["user-infos-row"]}>
|
||||||
|
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
||||||
|
Numéro de téléphone
|
||||||
|
</Typography>
|
||||||
|
<Typography typo={ITypo.P_18}>{userSelected?.contact?.phone_number}</Typography>
|
||||||
|
</div>
|
||||||
|
<div className={classes["user-infos-row"]}>
|
||||||
|
<Typography typo={ITypo.NAV_INPUT_16} color={ITypoColor.GREY}>
|
||||||
|
Email
|
||||||
|
</Typography>
|
||||||
|
<Typography typo={ITypo.P_18}>{userSelected?.contact?.email}</Typography>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={classes["role-container"]}>
|
||||||
|
<div className={classes["part"]}>
|
||||||
|
<div className={classes["first-line"]}>
|
||||||
|
<Typography typo={ITypo.P_SB_18}>Rôle au sein de son office</Typography>
|
||||||
|
</div>
|
||||||
|
<div className={classes["second-line"]}>
|
||||||
|
<Typography typo={ITypo.P_18}>
|
||||||
|
{userSelected?.office_role ? userSelected?.office_role?.name : "Utilisateur restreint"}
|
||||||
|
</Typography>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={classes["part"]}>
|
||||||
|
<div className={classes["first-line"]}>
|
||||||
|
<Typography typo={ITypo.P_SB_18}>Attribuer un titre</Typography>
|
||||||
|
</div>
|
||||||
|
<div className={classes["second-line"]}>
|
||||||
|
{!isSuperAdminChecked && !currentAppointment && (
|
||||||
|
<Switch label="Admin de son office" checked={isAdminChecked} onChange={handleAdminChanged} />
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
label="Super-admin LeCoffre.io"
|
||||||
|
checked={isSuperAdminChecked}
|
||||||
|
disabled={userHasVoted()}
|
||||||
|
onChange={handleSuperAdminChanged}
|
||||||
|
/>
|
||||||
|
{currentAppointment && (
|
||||||
|
<div className={classes["votes-block"]}>
|
||||||
|
<div className={classes["left"]}>
|
||||||
|
<Image src={WarningIcon} alt="warning" width={28} height={28} />
|
||||||
|
</div>
|
||||||
|
<div className={classes["right"]}>
|
||||||
|
<div>
|
||||||
|
<Typography typo={ITypo.P_SB_18}>{currentAppointment.votes?.length}/3</Typography>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Typography typo={ITypo.CAPTION_14}>
|
||||||
|
{currentAppointment.choice === EVote.NOMINATE
|
||||||
|
? `Un ou des collaborateurs souhaitent attribuer le titre de Super Admin à ce collaborateur. Il manque ${
|
||||||
|
3 - currentAppointment.votes?.length!
|
||||||
|
} vote(s) pour que le collaborateur se voit attribuer le titre.`
|
||||||
|
: `Un ou des collaborateurs souhaitent retirer le titre de Super Admin à ce collaborateur. Il manque ${
|
||||||
|
3 - currentAppointment.votes?.length!
|
||||||
|
} vote(s) pour que le collaborateur se voit retirer le titre.`}
|
||||||
|
</Typography>
|
||||||
|
</div>
|
||||||
|
{userHasVoted() && (
|
||||||
|
<div className={classes["remove-my-vote"]}>
|
||||||
|
<Button variant={EButtonVariant.SECONDARY} onClick={deleteMyVote}>
|
||||||
|
Retirer mon vote
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Confirm
|
||||||
|
isOpen={isSuperAdminModalOpened}
|
||||||
|
onClose={closeSuperAdminModal}
|
||||||
|
onAccept={handleSuperAdminModalAccepted}
|
||||||
|
closeBtn
|
||||||
|
header={`Souhaitez-vous attribuer un vote à ${
|
||||||
|
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
|
||||||
|
} pour ${superAdminModalType === "add" ? "devenir" : "retirer son rôle de"} Super Administrateur ?`}
|
||||||
|
confirmText={"Attribuer un vote"}
|
||||||
|
cancelText={"Annuler"}>
|
||||||
|
<div className={classes["modal-content"]}>
|
||||||
|
<Typography typo={ITypo.P_16} className={classes["text"]}>
|
||||||
|
{superAdminModalType === "add" ? "Nommer" : "Retirer"} une personne Super Administrateur nécessite 3 votes
|
||||||
|
de super administrateurs existants. Souhaitez-vous attribuer un vote ?
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Confirm>
|
||||||
<div className={classes["part"]}>
|
<Confirm
|
||||||
<div className={classes["first-line"]}>
|
isOpen={isAdminModalOpened}
|
||||||
<Typography typo={ITypo.P_SB_18}>Attribuer un titre</Typography>
|
onClose={closeAdminModal}
|
||||||
</div>
|
onAccept={handleAdminModalAccepted}
|
||||||
<div className={classes["second-line"]}>
|
closeBtn
|
||||||
{!isSuperAdminChecked && !currentAppointment && (
|
header={
|
||||||
<Switch label="Admin de son office" checked={isAdminChecked} onChange={handleAdminChanged} />
|
adminModalType === "add"
|
||||||
)}
|
? `Souhaitez-vous nommer ${
|
||||||
|
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
|
||||||
<Switch
|
} administrateur de son office ?`
|
||||||
label="Super-admin LeCoffre.io"
|
: `Souhaitez-vous retirer le rôle administrateur de son office à ${
|
||||||
checked={isSuperAdminChecked}
|
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
|
||||||
disabled={userHasVoted()}
|
} ?`
|
||||||
onChange={handleSuperAdminChanged}
|
}
|
||||||
/>
|
confirmText={adminModalType === "add" ? "Ajouter" : "Retirer"}
|
||||||
{currentAppointment && (
|
cancelText={"Annuler"}>
|
||||||
<div className={classes["votes-block"]}>
|
<div className={classes["modal-content"]}></div>
|
||||||
<div className={classes["left"]}>
|
</Confirm>
|
||||||
<Image src={WarningIcon} alt="warning" width={28} height={28} />
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className={classes["right"]}>
|
{isLoading && (
|
||||||
<div>
|
<div className={classes["loader-container"]}>
|
||||||
<Typography typo={ITypo.P_SB_18}>{currentAppointment.votes?.length}/3</Typography>
|
<div className={classes["loader"]}>
|
||||||
</div>
|
<Loader />
|
||||||
<div>
|
|
||||||
<Typography typo={ITypo.CAPTION_14}>
|
|
||||||
{currentAppointment.choice === EVote.NOMINATE
|
|
||||||
? `Un ou des collaborateurs souhaitent attribuer le titre de Super Admin à ce collaborateur. Il manque ${
|
|
||||||
3 - currentAppointment.votes?.length!
|
|
||||||
} vote(s) pour que le collaborateur se voit attribuer le titre.`
|
|
||||||
: `Un ou des collaborateurs souhaitent retirer le titre de Super Admin à ce collaborateur. Il manque ${
|
|
||||||
3 - currentAppointment.votes?.length!
|
|
||||||
} vote(s) pour que le collaborateur se voit retirer le titre.`}
|
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
{userHasVoted() && (
|
|
||||||
<div className={classes["remove-my-vote"]}>
|
|
||||||
<Button variant={EButtonVariant.SECONDARY} onClick={deleteMyVote}>
|
|
||||||
Retirer mon vote
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Confirm
|
)}
|
||||||
isOpen={isSuperAdminModalOpened}
|
|
||||||
onClose={closeSuperAdminModal}
|
|
||||||
onAccept={handleSuperAdminModalAccepted}
|
|
||||||
closeBtn
|
|
||||||
header={`Souhaitez-vous attribuer un vote à ${
|
|
||||||
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
|
|
||||||
} pour ${superAdminModalType === "add" ? "devenir" : "retirer son rôle de"} Super Administrateur ?`}
|
|
||||||
confirmText={"Attribuer un vote"}
|
|
||||||
cancelText={"Annuler"}>
|
|
||||||
<div className={classes["modal-content"]}>
|
|
||||||
<Typography typo={ITypo.P_16} className={classes["text"]}>
|
|
||||||
{superAdminModalType === "add" ? "Nommer" : "Retirer"} une personne Super Administrateur nécessite 3 votes de
|
|
||||||
super administrateurs existants. Souhaitez-vous attribuer un vote ?
|
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
</Confirm>
|
|
||||||
<Confirm
|
|
||||||
isOpen={isAdminModalOpened}
|
|
||||||
onClose={closeAdminModal}
|
|
||||||
onAccept={handleAdminModalAccepted}
|
|
||||||
closeBtn
|
|
||||||
header={
|
|
||||||
adminModalType === "add"
|
|
||||||
? `Souhaitez-vous nommer ${
|
|
||||||
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
|
|
||||||
} administrateur de son office ?`
|
|
||||||
: `Souhaitez-vous retirer le rôle administrateur de son office à ${
|
|
||||||
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
|
|
||||||
} ?`
|
|
||||||
}
|
|
||||||
confirmText={adminModalType === "add" ? "Ajouter" : "Retirer"}
|
|
||||||
cancelText={"Annuler"}>
|
|
||||||
<div className={classes["modal-content"]}></div>
|
|
||||||
</Confirm>
|
|
||||||
</div>
|
|
||||||
</DefaultUserDashboard>
|
</DefaultUserDashboard>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user