Merged in ENCOA-183_MasterCorporateGrouping (pull request #96)
ENCOA-183 MasterCorporateGrouping Approved-by: Tiago Ribeiro
This commit is contained in:
@@ -55,6 +55,7 @@ import MasterStatistical from "./MasterStatistical";
|
|||||||
import {futureAssignmentFilter, pastAssignmentFilter, archivedAssignmentFilter, activeAssignmentFilter} from "@/utils/assignments";
|
import {futureAssignmentFilter, pastAssignmentFilter, archivedAssignmentFilter, activeAssignmentFilter} from "@/utils/assignments";
|
||||||
import useUserBalance from "@/hooks/useUserBalance";
|
import useUserBalance from "@/hooks/useUserBalance";
|
||||||
import AssignmentsPage from "./views/AssignmentsPage";
|
import AssignmentsPage from "./views/AssignmentsPage";
|
||||||
|
import { group } from "console";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
user: MasterCorporateUser;
|
user: MasterCorporateUser;
|
||||||
@@ -360,8 +361,14 @@ export default function MasterCorporateDashboard({user}: Props) {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
const corporateUserFilter = (x: User) => x.type === "corporate";
|
const groupedByNameCorporates = groupBy(corporates, (x: CorporateUser) => x.corporateInformation?.companyInformation?.name || 'N/A');
|
||||||
|
const groupedByNameCorporatesKeys = Object.keys(groupedByNameCorporates);
|
||||||
|
const groupedByNameCorporateIds = groupedByNameCorporatesKeys.reduce((accm, x) => {
|
||||||
|
const corporateUserIds = (groupedByNameCorporates[x] as CorporateUser[]).map((y) => y.id);
|
||||||
|
return { ...accm, [x]: corporateUserIds };
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
console.log("groupedByNameCorporates", groupedByNameCorporates, groupedByNameCorporateIds);
|
||||||
const GroupsList = () => {
|
const GroupsList = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -414,7 +421,7 @@ export default function MasterCorporateDashboard({user}: Props) {
|
|||||||
</div>
|
</div>
|
||||||
<h2 className="text-2xl font-semibold">Master Statistical</h2>
|
<h2 className="text-2xl font-semibold">Master Statistical</h2>
|
||||||
</div>
|
</div>
|
||||||
<MasterStatistical users={users} corporateUsers={corporates} />
|
<MasterStatistical users={users} corporateUsers={groupedByNameCorporateIds} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -468,12 +475,20 @@ export default function MasterCorporateDashboard({user}: Props) {
|
|||||||
/>
|
/>
|
||||||
<IconCard
|
<IconCard
|
||||||
Icon={BsBank}
|
Icon={BsBank}
|
||||||
label="Corporate"
|
label="Corporate Accounts"
|
||||||
value={corporates.length}
|
value={corporates.length}
|
||||||
isLoading={isCorporatesLoading}
|
isLoading={isCorporatesLoading}
|
||||||
color="purple"
|
color="purple"
|
||||||
onClick={() => router.push("/#corporate")}
|
onClick={() => router.push("/#corporate")}
|
||||||
/>
|
/>
|
||||||
|
<IconCard
|
||||||
|
Icon={BsBank}
|
||||||
|
label="Corporate"
|
||||||
|
value={groupedByNameCorporatesKeys.length}
|
||||||
|
isLoading={isCorporatesLoading}
|
||||||
|
color="purple"
|
||||||
|
// onClick={() => router.push("/#corporate")}
|
||||||
|
/>
|
||||||
<IconCard
|
<IconCard
|
||||||
Icon={BsPersonFillGear}
|
Icon={BsPersonFillGear}
|
||||||
isLoading={isStudentsLoading}
|
isLoading={isStudentsLoading}
|
||||||
|
|||||||
@@ -19,8 +19,14 @@ import { useListSearch } from "@/hooks/useListSearch";
|
|||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
import Button from "@/components/Low/Button";
|
import Button from "@/components/Low/Button";
|
||||||
|
|
||||||
|
interface GroupedCorporateUsers {
|
||||||
|
// list of user Ids
|
||||||
|
[key: string]: string[];
|
||||||
|
}
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
corporateUsers: User[];
|
corporateUsers: GroupedCorporateUsers;
|
||||||
users: User[];
|
users: User[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,14 +51,14 @@ const searchFilters = [["email"], ["user"], ["userId"]];
|
|||||||
const MasterStatistical = (props: Props) => {
|
const MasterStatistical = (props: Props) => {
|
||||||
const { users, corporateUsers } = props;
|
const { users, corporateUsers } = props;
|
||||||
|
|
||||||
const corporateRelevantUsers = React.useMemo(
|
// const corporateRelevantUsers = React.useMemo(
|
||||||
() => corporateUsers.filter((x) => x.type !== "student") as CorporateUser[],
|
// () => corporateUsers.filter((x) => x.type !== "student") as CorporateUser[],
|
||||||
[corporateUsers]
|
// [corporateUsers]
|
||||||
);
|
// );
|
||||||
|
|
||||||
const corporates = React.useMemo(
|
const corporates = React.useMemo(
|
||||||
() => corporateRelevantUsers.map((x) => x.id),
|
() => Object.values(corporateUsers).flat(),
|
||||||
[corporateRelevantUsers]
|
[corporateUsers]
|
||||||
);
|
);
|
||||||
|
|
||||||
const [selectedCorporates, setSelectedCorporates] =
|
const [selectedCorporates, setSelectedCorporates] =
|
||||||
@@ -126,7 +132,8 @@ const MasterStatistical = (props: Props) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const corporateScores = corporates.reduce(
|
const getCorporatesScoresHash = (data: string[]) =>
|
||||||
|
data.reduce(
|
||||||
(accm, id) => ({
|
(accm, id) => ({
|
||||||
...accm,
|
...accm,
|
||||||
[id]: getCorporateScores(id),
|
[id]: getCorporateScores(id),
|
||||||
@@ -134,7 +141,8 @@ const MasterStatistical = (props: Props) => {
|
|||||||
{}
|
{}
|
||||||
) as Record<string, UserCount>;
|
) as Record<string, UserCount>;
|
||||||
|
|
||||||
const consolidateScore = Object.values(corporateScores).reduce(
|
const getConsolidateScore = (data: Record<string, UserCount>) =>
|
||||||
|
Object.values(data).reduce(
|
||||||
(acc: UserCount, { userCount, maxUserCount }: UserCount) => ({
|
(acc: UserCount, { userCount, maxUserCount }: UserCount) => ({
|
||||||
userCount: acc.userCount + userCount,
|
userCount: acc.userCount + userCount,
|
||||||
maxUserCount: acc.maxUserCount + maxUserCount,
|
maxUserCount: acc.maxUserCount + maxUserCount,
|
||||||
@@ -142,6 +150,9 @@ const MasterStatistical = (props: Props) => {
|
|||||||
{ userCount: 0, maxUserCount: 0 }
|
{ userCount: 0, maxUserCount: 0 }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const corporateScores = getCorporatesScoresHash(corporates);
|
||||||
|
const consolidateScore = getConsolidateScore(corporateScores);
|
||||||
|
|
||||||
const getConsolidateScoreStr = (data: UserCount) =>
|
const getConsolidateScoreStr = (data: UserCount) =>
|
||||||
`${data.userCount}/${data.maxUserCount}`;
|
`${data.userCount}/${data.maxUserCount}`;
|
||||||
|
|
||||||
@@ -286,23 +297,31 @@ const MasterStatistical = (props: Props) => {
|
|||||||
}}
|
}}
|
||||||
isSelected={areAllSelected}
|
isSelected={areAllSelected}
|
||||||
/>
|
/>
|
||||||
{corporateRelevantUsers.map((group) => {
|
{Object.keys(corporateUsers).map((corporateName) => {
|
||||||
const isSelected = selectedCorporates.includes(group.id);
|
const group = corporateUsers[corporateName];
|
||||||
|
const isSelected = group.every((id) =>
|
||||||
|
selectedCorporates.includes(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
const valueHash = getCorporatesScoresHash(group);
|
||||||
|
const value = getConsolidateScoreStr(getConsolidateScore(valueHash));
|
||||||
return (
|
return (
|
||||||
<IconCard
|
<IconCard
|
||||||
key={group.id}
|
key={corporateName}
|
||||||
Icon={BsBank}
|
Icon={BsBank}
|
||||||
label={group.corporateInformation?.companyInformation?.name}
|
label={corporateName}
|
||||||
value={getConsolidateScoreStr(corporateScores[group.id])}
|
value={value}
|
||||||
color="purple"
|
color="purple"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (isSelected) {
|
if (isSelected) {
|
||||||
setSelectedCorporates(
|
setSelectedCorporates((prev) =>
|
||||||
selectedCorporates.filter((x) => x !== group.id)
|
prev.filter((x) => !group.includes(x))
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setSelectedCorporates([...selectedCorporates, group.id]);
|
setSelectedCorporates((prev) => [
|
||||||
|
...new Set([...prev, ...group]),
|
||||||
|
]);
|
||||||
}}
|
}}
|
||||||
isSelected={isSelected}
|
isSelected={isSelected}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user