Skip to content

Commit

Permalink
Added CC Approver Functionality - for which new CC Approving Page made
Browse files Browse the repository at this point in the history
  • Loading branch information
bhavberi committed Mar 17, 2024
1 parent 92dceac commit 46b097d
Show file tree
Hide file tree
Showing 7 changed files with 280 additions and 59 deletions.
10 changes: 5 additions & 5 deletions src/app/about/clubs-council/cc-members/page.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export default async function AllMembers() {
},
});

const techMembers = members
const ccMembers = members
?.map((member) => {
const { roles } = member;
const techTeamRoles = filterRoles(roles, techTeamWords);
Expand All @@ -30,11 +30,11 @@ export default async function AllMembers() {
return member.roles.length > 0;
});

const currentYear = (new Date().getFullYear() + 1).toString();
// const currentYear = (new Date().getFullYear() + 1).toString();

// construct dict of { year: [members] } where each year is a key
const targetMembers = techMembers
? techMembers.reduce((acc, member) => {
const targetMembers = ccMembers
? ccMembers.reduce((acc, member) => {
const latestYear = extractFirstYear(member);
if (!acc[latestYear]) {
acc[latestYear] = [];
Expand All @@ -52,7 +52,7 @@ export default async function AllMembers() {
</Typography>
</center>

{techMembers?.length ? (
{ccMembers?.length ? (
Object.keys(targetMembers)
?.sort((a, b) => {
if (a === -1) {
Expand Down
2 changes: 1 addition & 1 deletion src/app/about/clubs-council/tech-members/page.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export default async function TechTeam() {
return member.roles.length > 0;
});

const currentYear = (new Date().getFullYear() + 1).toString();
// const currentYear = (new Date().getFullYear() + 1).toString();

// construct dict of { year: [members] } where each year is a key
const targetMembers = techMembers
Expand Down
3 changes: 2 additions & 1 deletion src/app/actions/events/progress/route.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import { PROGRESS_EVENT } from "gql/mutations/events";

export async function POST(request) {
const response = { ok: false, error: null };
const { eventid, cc_progress_budget, cc_progress_room } =
const { eventid, cc_progress_budget, cc_progress_room, cc_approver } =
await request.json();

const { error } = await getClient().mutation(PROGRESS_EVENT, {
eventid,
ccProgressBudget: cc_progress_budget,
ccProgressRoom: cc_progress_room,
ccApprover: cc_approver,
});
if (error) {
response.error = {
Expand Down
79 changes: 79 additions & 0 deletions src/app/manage/events/[id]/approve_cc/page.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { getClient } from "gql/client";
import { GET_USER } from "gql/queries/auth";
import { GET_MEMBERS } from "gql/queries/members";
import { GET_FULL_EVENT } from "gql/queries/events";
import { redirect } from "next/navigation";

import { Container, Typography } from "@mui/material";

import { techTeamWords } from "constants/ccMembersFilterWords";
import { extractFirstYear } from "components/members/MembersGrid";
import EventApproveForm from "components/events/EventApproveForm";

export const metadata = {
title: "Approve Event | CC",
};

export default async function ApproveEventCC({ params }) {
const { id } = params;
const { data: { event } = {} } = await getClient().query(GET_FULL_EVENT, {
eventid: id,
});
const { data: { userMeta, userProfile } = {} } = await getClient().query(
GET_USER,
{ userInput: null }
);
const user = { ...userMeta, ...userProfile };

const { data: { members } = {} } = await getClient().query(GET_MEMBERS, {
clubInput: {
cid: "cc",
},
});

const ccMembers = members
?.map((member) => {
const { roles } = member;
const techTeamRoles = filterRoles(roles, techTeamWords);
const newMember = { ...member, roles: techTeamRoles };
return newMember;
})
?.filter((member) => {
return member.roles.length > 0;
});

// construct dict of { year: [members] } where each year is a key
const currentccMembers = ccMembers
? ccMembers.filter((member) => {
const latestYear = extractFirstYear(member);
if (latestYear === -1) {
return true;
}
return false;
})
: [];

return (
user?.role !== "cc" && redirect("/404"),
event?.status?.state !== "pending_cc" && redirect("/404"),
(
<Container>
<center>
<Typography variant="h3" gutterBottom mb={3}>
Approve Event | Clubs Council
</Typography>
</center>

<EventApproveForm event={event} members={currentccMembers} />
</Container>
)
);
}

const filterRoles = (roles, filterWords) => {
return roles?.filter((role) => {
const { name } = role;
const lowercaseName = name.toLowerCase();
return !filterWords.some((word) => lowercaseName.includes(word));
});
};
89 changes: 37 additions & 52 deletions src/components/events/EventActions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useRouter, useParams } from "next/navigation";

import { useState } from "react";

import { Box, Button, Checkbox, FormControlLabel } from "@mui/material";
import { Button } from "@mui/material";

import Icon from "components/Icon";
import ConfirmDialog from "components/ConfirmDialog";
Expand Down Expand Up @@ -152,38 +152,6 @@ export function ApproveEvent({ sx }) {
const { triggerToast } = useToast();
const [dialog, setDialog] = useState(false);

// approval checks
const [SLC, setSLC] = useState(false);
const [SLO, setSLO] = useState(false);

const approvalDialog =
user?.role === "cc" ? (
<Box>
<FormControlLabel
control={
<Checkbox
checked={SLC}
onClick={(e) => setSLC(e.target.checked)}
color="success"
/>
}
label="Request SLC approval"
/>
<FormControlLabel
control={
<Checkbox
checked={SLO}
onClick={(e) => setSLO(e.target.checked)}
color="success"
/>
}
label="Request SLO approval"
/>
</Box>
) : (
"This action cannot be undone."
);

const approveEvent = async () => {
// console.log("requested approvals:", SLC, SLO);
let res = await fetch("/actions/events/progress", {
Expand All @@ -192,6 +160,7 @@ export function ApproveEvent({ sx }) {
eventid: id,
cc_progress_budget: !SLC,
cc_progress_room: !SLO,
cc_approver: null,
}),
});
res = await res.json();
Expand All @@ -215,25 +184,41 @@ export function ApproveEvent({ sx }) {

return (
<>
<Button
variant="contained"
color="success"
startIcon={<Icon variant="done" />}
onClick={() => setDialog(true)}
sx={sx}
>
Approve
</Button>

<ConfirmDialog
open={dialog}
title="Are you sure you want to approve this event?"
description={approvalDialog}
onConfirm={approveEvent}
onClose={() => setDialog(false)}
confirmProps={{ color: "success" }}
confirmText="Yes, approve it"
/>
{/* If user?.role === "cc", then redirect to /manage/events/id/approve_cc */}
{user && user.role === "cc" ? (
<Button
component={Link}
href={`/manage/events/${id}/approve_cc`}
variant="contained"
color="success"
startIcon={<Icon variant="done" />}
sx={sx}
>
Approve
</Button>
) : (
<>
<Button
variant="contained"
color="success"
startIcon={<Icon variant="done" />}
onClick={() => setDialog(true)}
sx={sx}
>
Approve
</Button>

<ConfirmDialog
open={dialog}
title="Are you sure you want to approve this event?"
description="This action cannot be undone."
onConfirm={approveEvent}
onClose={() => setDialog(false)}
confirmProps={{ color: "success" }}
confirmText="Yes, approve it"
/>
</>
)}
</>
);
}
Loading

0 comments on commit 46b097d

Please sign in to comment.