Skip to content

Commit

Permalink
Fix sidebar initial state
Browse files Browse the repository at this point in the history
change senior name to first name and last name

Co-authored-by: Tyler <[email protected]>

finish first draft

Co-authored-by: Tyler <[email protected]>

reverted senior firstname/lastname field
  • Loading branch information
nickbar01234 committed Mar 7, 2024
1 parent 367e5dd commit 00aba53
Show file tree
Hide file tree
Showing 18 changed files with 468 additions and 37 deletions.
40 changes: 20 additions & 20 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ model Session {
}

model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
id String @id @default(auto()) @map("_id") @db.ObjectId
// https://github.com/nextauthjs/next-auth/blob/v4/packages/next-auth/src/providers/google.ts
// Fields mappable from PrismaAdapter. We can map the value return from profle() in [...nextauth].
Expand Down Expand Up @@ -86,7 +86,7 @@ enum Role {

model Senior {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String
name String @default("")
location String
description String
StudentIDs String[] @db.ObjectId
Expand All @@ -98,13 +98,13 @@ model Senior {
}

model File {
id String @id @default(auto()) @map("_id") @db.ObjectId
date DateTime // will zero out the hours
filetype String
url String
seniorId String @db.ObjectId
senior Senior @relation(fields: [seniorId], references: [id], onDelete: Cascade)
Tags String[]
id String @id @default(auto()) @map("_id") @db.ObjectId
date DateTime // will zero out the hours
filetype String
url String
seniorId String @db.ObjectId
senior Senior @relation(fields: [seniorId], references: [id], onDelete: Cascade)
Tags String[]
@@unique([seniorId, date])
}
Expand Down Expand Up @@ -134,20 +134,20 @@ model Chapter {
}

model Resource {
id String @id @default(auto()) @map("_id") @db.ObjectId
access Role[]
link String
title String
id String @id @default(auto()) @map("_id") @db.ObjectId
access Role[]
link String
title String
}

model Email {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
}

model UserRequest {
id String @id @default(auto()) @map("_id") @db.ObjectId
approved Approval @default(PENDING)
uid String @db.ObjectId @unique
chapterId String @db.ObjectId
}
id String @id @default(auto()) @map("_id") @db.ObjectId
approved Approval @default(PENDING)
uid String @unique @db.ObjectId
chapterId String @db.ObjectId
}
20 changes: 20 additions & 0 deletions src/app/private/[uid]/chapter-leader/edit-profile/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { HeaderContainer } from "@components/container/index";
import { faUser } from "@fortawesome/free-regular-svg-icons";

interface IEditProfileLayout {
children: React.ReactNode;
}

const EditProfileLayout = ({ children }: IEditProfileLayout) => {
return (
<HeaderContainer
header="Profile"
headerIcon={faUser}
showHorizontalLine={true}
>
{children}
</HeaderContainer>
);
};

export default EditProfileLayout;
3 changes: 3 additions & 0 deletions src/app/private/[uid]/chapter-leader/edit-profile/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { EditProfileForm } from "@components/user";

export default EditProfileForm;
31 changes: 31 additions & 0 deletions src/app/private/[uid]/chapter-leader/home/@joinChapter/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { UserJoinRequest } from "@components/user";
import { prisma } from "@server/db/client";

interface UserHomePageParams {
params: {
uid: string;
};
}

const UserJoinChapterPage = async ({ params }: UserHomePageParams) => {
const chapters = await prisma.chapter.findMany({
include: {
students: true,
},
});
const joinRequest = await prisma.userRequest.findFirst({
where: {
uid: params.uid,
},
});

return (
<UserJoinRequest
chapters={chapters}
joinRequest={joinRequest}
uid={params.uid}
/>
);
};

export default UserJoinChapterPage;
42 changes: 42 additions & 0 deletions src/app/private/[uid]/chapter-leader/home/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { prisma } from "@server/db/client";
import TabButtons from "@components/TabButtons";
import { HeaderContainer } from "@components/container/index";
import { faHouse } from "@fortawesome/free-solid-svg-icons";

interface LayoutProps {
children: React.ReactNode;
joinChapter: React.ReactNode;
params: {
uid: string;
};
}

const Layout = async ({ children, params, joinChapter }: LayoutProps) => {
const user = await prisma.user.findFirstOrThrow({
where: {
id: params.uid,
},
});

if (user.ChapterID != null) {
return (
<HeaderContainer
header="Home"
headerIcon={faHouse}
showHorizontalLine={false}
>
<TabButtons
queries={[
{ segment: "home", name: "My Chapter" },
{ segment: "home/resources", name: "resources" },
]}
/>
{children}
</HeaderContainer>
);
} else {
return joinChapter;
}
};

export default Layout;
55 changes: 55 additions & 0 deletions src/app/private/[uid]/chapter-leader/home/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { UserTile } from "@components/TileGrid";
import DisplayChapterInfo from "@components/DisplayChapterInfo";
import { prisma } from "@server/db/client";
import { CardGrid } from "@components/container";

interface UserHomePageParams {
params: {
uid: string;
};
}

const UserHomePage = async ({ params }: UserHomePageParams) => {
const user = await prisma.user.findFirstOrThrow({
where: {
id: params.uid,
},
});
const chapter = await prisma.chapter.findFirstOrThrow({
where: {
id: user.ChapterID ?? "",
},
include: {
students: true,
},
});

return (
<div className="mt-6 flex flex-col gap-y-6">
<div className="font-merriweather text-2xl font-bold text-[#000022]">
{chapter.chapterName}
</div>
<DisplayChapterInfo
location={chapter.location}
noMembers={
chapter.students.filter((user) => user.role == "USER").length
}
dateCreated={chapter.dateCreated}
/>
<CardGrid
title={
<div className="font-merriweather text-xl font-bold">
Executive Board
</div>
}
tiles={chapter.students
.filter((user) => user.role == "CHAPTER_LEADER")
.map((user) => (
<UserTile key={user.id} student={user} link="" />
))}
/>
</div>
);
};

export default UserHomePage;
55 changes: 55 additions & 0 deletions src/app/private/[uid]/chapter-leader/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"use client";

import Sidebar, { ISideBar } from "@components/Sidebar";
import {
faHome,
faUser,
faUserGroup,
faUserPlus,
} from "@fortawesome/free-solid-svg-icons";
import React, { useContext } from "react";
import { UserContext } from "src/context/UserProvider";

interface IUserLayout {
children: React.ReactNode;
}

const UserLayout = ({ children }: IUserLayout) => {
const { user } = useContext(UserContext);
const buttons: ISideBar["buttons"] = React.useMemo(
() => [
{
name: "Home",
link: `/private/${user.id}/chapter-leader/home`,
icon: faHome,
},
{
name: "Members",
link: `/private/${user.id}/chapter-leader/members`,
icon: faUserGroup,
},
{
name: "Pending",
link: `/private/${user.id}/chapter-leader/pending`,
icon: faUserPlus,
},
{
name: "Profile",
link: `/private/${user.id}/chapter-leader/edit-profile`,
icon: faUser,
},
],
[user.id]
);

return (
<div className="grid h-full w-full grid-cols-12">
<div className="col-span-2 bg-[#E7E0D6]">
<Sidebar buttons={buttons} />
</div>
<div className="col-span-10 bg-[#F4F0EB]">{children}</div>
</div>
);
};

export default UserLayout;
52 changes: 52 additions & 0 deletions src/app/private/[uid]/chapter-leader/members/MembersHomePage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"use client";

import { useState } from "react";
import { UserTile } from "@components/TileGrid";
import { CardGrid } from "@components/container";
import SearchBar from "@components/SearchBar";
import { User } from "@prisma/client";

type MembersHomePageProps = {
members: User[];
user: User;
};

const MembersHomePage = ({ members, user }: MembersHomePageProps) => {
const [filter, setFilter] = useState("");

return (
<>
<h1 className="font-merriweather text-3xl">
{`Members (${members.length})`}
</h1>
<div className="mb-6 mt-6 flex w-full gap-2.5">
<SearchBar setFilter={setFilter} />
</div>
{members.length > 0 ? (
<CardGrid
tiles={members
.filter((member) =>
(member.firstName + " " + member.lastName)
.toLowerCase()
.includes(filter.toLowerCase())
)
.map((member, index) => {
return (
<UserTile
key={index}
student={member}
link={`/private/${user.id}/chapter-leader/members/${member.id}`}
/>
);
})}
/>
) : (
<h1 className="text-2xl font-light">
{"This chapter has no members."}
</h1>
)}
</>
);
};

export default MembersHomePage;
20 changes: 20 additions & 0 deletions src/app/private/[uid]/chapter-leader/members/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { HeaderContainer } from "@components/container";
import { faUserGroup } from "@fortawesome/free-solid-svg-icons";

interface LayoutProps {
children?: React.ReactNode;
}

const Layout = (props: LayoutProps) => {
return (
<HeaderContainer
showHorizontalLine
header="Members"
headerIcon={faUserGroup}
>
{props.children}
</HeaderContainer>
);
};

export default Layout;
24 changes: 24 additions & 0 deletions src/app/private/[uid]/chapter-leader/members/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import React from "react";
import { prisma } from "@server/db/client";
import MembersHomePage from "./MembersHomePage";

const MembersPage = async ({ params }: { params: { uid: string } }) => {
const user = await prisma.user.findFirstOrThrow({
where: {
id: params.uid,
},
});

const chapter = await prisma.chapter.findFirstOrThrow({
where: {
id: user.ChapterID ?? "",
},
include: {
students: true,
},
});

return <MembersHomePage members={chapter.students} user={user} />;
};

export default MembersPage;
Loading

0 comments on commit 00aba53

Please sign in to comment.