From c1f59b84a63047db4056b60689d8d583e331e644 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Mon, 3 Feb 2025 21:32:31 -0500 Subject: [PATCH 01/14] started ticket --- .../src/app/_components/reviews/review-card-preview.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/apps/web/src/app/_components/reviews/review-card-preview.tsx b/apps/web/src/app/_components/reviews/review-card-preview.tsx index 8c3d161..5708d0a 100644 --- a/apps/web/src/app/_components/reviews/review-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/review-card-preview.tsx @@ -16,8 +16,6 @@ import { ReviewCardStars } from "~/app/_components/reviews/review-card-stars"; import { api } from "~/trpc/react"; import { truncateText } from "~/utils/stringHelpers"; -// todo: add this attribution in a footer somewhere -// Logos provided by Clearbit interface ReviewCardPreviewProps { className?: string; @@ -49,7 +47,7 @@ export function ReviewCardPreview({
- {company.data ? ( + {/* {company.data ? ( ) : (
- )} + )} */}
{role.data?.title} @@ -80,9 +78,6 @@ export function ReviewCardPreview({

{reviewText}

- - see more... - ); } From 2936ef4af6538c425c9467354e84a185d5823922 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Mon, 3 Feb 2025 22:20:30 -0500 Subject: [PATCH 02/14] changed review preview --- .../reviews/review-card-preview.tsx | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/apps/web/src/app/_components/reviews/review-card-preview.tsx b/apps/web/src/app/_components/reviews/review-card-preview.tsx index 5708d0a..206c2c3 100644 --- a/apps/web/src/app/_components/reviews/review-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/review-card-preview.tsx @@ -37,45 +37,55 @@ export function ReviewCardPreview({ // Truncate Review Text const reviewText = truncateText(reviewObj.textReview, 80); + const yellowStar = ( + + + + ); + return (
- {/* {company.data ? ( - {`Logo - ) : ( -
- )} */}
- - {role.data?.title} + +
+
+ {role.data?.title} +
+
+ Co-op +
+
+
-

- {company.data?.name} -

+
+ {company.data?.name} + + {reviewObj.location} +
-
-

- {reviewObj.reviewHeadline} -

- +
+ {yellowStar} {(reviewObj.overallRating).toFixed(1)}
-

{reviewText}

From 74806d6baf86d2dee0e074d9065da91bbf5d4362 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Tue, 4 Feb 2025 08:34:34 -0500 Subject: [PATCH 03/14] renamed cards --- .../app/(pages)/(dashboard)/roles/page.tsx | 8 +++--- ...card-preview.tsx => role-card-preview.tsx} | 12 ++++----- .../{review-card.tsx => role-card.tsx} | 25 +++++++++++++++---- 3 files changed, 30 insertions(+), 15 deletions(-) rename apps/web/src/app/_components/reviews/{review-card-preview.tsx => role-card-preview.tsx} (89%) rename apps/web/src/app/_components/reviews/{review-card.tsx => role-card.tsx} (85%) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index e47adbe..61a36db 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -14,8 +14,8 @@ import { useToast } from "@cooper/ui/hooks/use-toast"; import LoadingResults from "~/app/_components/loading-results"; import NoResults from "~/app/_components/no-results"; -import { ReviewCard } from "~/app/_components/reviews/review-card"; -import { ReviewCardPreview } from "~/app/_components/reviews/review-card-preview"; +import { RoleCard } from "~/app/_components/reviews/role-card"; +import { RoleCardPreview } from "~/app/_components/reviews/role-card-preview"; import SearchFilter from "~/app/_components/search/search-filter"; import { api } from "~/trpc/react"; @@ -87,7 +87,7 @@ export default function Roles({ {reviews.data.map((review, i) => { return (
setSelectedReview(review)}> -
{reviews.data.length > 0 && reviews.data[0] && ( - + )}
diff --git a/apps/web/src/app/_components/reviews/review-card-preview.tsx b/apps/web/src/app/_components/reviews/role-card-preview.tsx similarity index 89% rename from apps/web/src/app/_components/reviews/review-card-preview.tsx rename to apps/web/src/app/_components/reviews/role-card-preview.tsx index 206c2c3..a0daafe 100644 --- a/apps/web/src/app/_components/reviews/review-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/role-card-preview.tsx @@ -17,15 +17,15 @@ import { api } from "~/trpc/react"; import { truncateText } from "~/utils/stringHelpers"; -interface ReviewCardPreviewProps { +interface RoleCardPreviewProps { className?: string; reviewObj: ReviewType; } -export function ReviewCardPreview({ +export function RoleCardPreview({ className, reviewObj, -}: ReviewCardPreviewProps) { +}: RoleCardPreviewProps) { // ===== COMPANY DATA ===== // const company = api.company.getById.useQuery({ id: reviewObj.companyId, @@ -75,9 +75,9 @@ export function ReviewCardPreview({
- {company.data?.name} - - {reviewObj.location} + {company.data?.name} + + {reviewObj.location}
diff --git a/apps/web/src/app/_components/reviews/review-card.tsx b/apps/web/src/app/_components/reviews/role-card.tsx similarity index 85% rename from apps/web/src/app/_components/reviews/review-card.tsx rename to apps/web/src/app/_components/reviews/role-card.tsx index 61fbc5c..b64bed6 100644 --- a/apps/web/src/app/_components/reviews/review-card.tsx +++ b/apps/web/src/app/_components/reviews/role-card.tsx @@ -27,7 +27,7 @@ interface ReviewCardProps { reviewObj: ReviewType; } -export function ReviewCard({ className, reviewObj }: ReviewCardProps) { +export function RoleCard({ className, reviewObj }: ReviewCardProps) { // ===== COMPANY DATA ===== // const company = api.company.getById.useQuery({ id: reviewObj.companyId }); @@ -61,11 +61,26 @@ export function ReviewCard({ className, reviewObj }: ReviewCardProps) {
)}
- {role.data?.title} -

{company.data?.name}

- {company.data && role.data && ( + + +
+
+ {role.data?.title} +
+
+ Co-op +
+
+
+
+ {company.data?.name} + + {reviewObj.location} +
+ {/*

{company.data?.name}

*/} + {/* {company.data && role.data && ( - )} + )} */}
From f4de13a074135bd9ea7e2f23dedf6300c41c290c Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Wed, 5 Feb 2025 22:33:07 -0500 Subject: [PATCH 04/14] more frontend changes --- .../app/(pages)/(dashboard)/roles/page.tsx | 21 +- .../app/_components/reviews/review-card.tsx | 108 ++++++++++ .../src/app/_components/reviews/role-card.tsx | 171 ---------------- .../src/app/_components/reviews/role-info.tsx | 189 ++++++++++++++++++ 4 files changed, 315 insertions(+), 174 deletions(-) create mode 100644 apps/web/src/app/_components/reviews/review-card.tsx delete mode 100644 apps/web/src/app/_components/reviews/role-card.tsx create mode 100644 apps/web/src/app/_components/reviews/role-info.tsx diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 61a36db..a4abb7c 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -14,10 +14,11 @@ import { useToast } from "@cooper/ui/hooks/use-toast"; import LoadingResults from "~/app/_components/loading-results"; import NoResults from "~/app/_components/no-results"; -import { RoleCard } from "~/app/_components/reviews/role-card"; +import { RoleInfo } from "~/app/_components/reviews/role-info"; import { RoleCardPreview } from "~/app/_components/reviews/role-card-preview"; import SearchFilter from "~/app/_components/search/search-filter"; import { api } from "~/trpc/react"; +import { ReviewCard } from "~/app/_components/reviews/review-card"; export default function Roles({ searchParams, @@ -68,6 +69,16 @@ export default function Roles({ options: validationResult.success ? validationResult.data : {}, }); + let myMap = new Map(); + + // for (review : reviews) { + // if (myMap.has({review.})) + // } + + // myMap.set("Alice", 30); + // myMap.set("Bob", 25); + // myMap.has("Bob") + const [selectedReview, setSelectedReview] = useState( reviews.isSuccess ? reviews.data[0] : undefined, ); @@ -103,8 +114,12 @@ export default function Roles({
{reviews.data.length > 0 && reviews.data[0] && ( - - )} + + ) } + {reviews.data.length > 0 && reviews.data[0] && ( + + ) } +
)} diff --git a/apps/web/src/app/_components/reviews/review-card.tsx b/apps/web/src/app/_components/reviews/review-card.tsx new file mode 100644 index 0000000..a6776ed --- /dev/null +++ b/apps/web/src/app/_components/reviews/review-card.tsx @@ -0,0 +1,108 @@ +"use client"; + +import Image from "next/image"; + +import type { ReviewType, WorkEnvironmentType } from "@cooper/db/schema"; +import { cn } from "@cooper/ui"; +import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; + +import { api } from "~/trpc/react"; +import { listBenefits } from "~/utils/reviewsAggregationHelpers"; +import { prettyWorkEnviornment } from "~/utils/stringHelpers"; +import { ReviewCardStars } from "./review-card-stars"; + + +const InterviewDifficulty = [ + { des: "Very Easy", color: "text-[#4bc92e]" }, + { des: "Easy", color: "text-[#09b52b]" }, + { des: "Neither Easy Nor Difficult", color: "text-cooper-blue-400" }, + { des: "Difficult", color: "text-[#f27c38]" }, + { des: "Very Difficult", color: "text-[#f52536]" }, +]; + +const yellowStar = ( + + + +); + +interface ReviewCardProps { + className?: string; + reviewObj: ReviewType; +} + +export function ReviewCard({ className, reviewObj }: ReviewCardProps) { + // ===== COMPANY DATA ===== // + const company = api.company.getById.useQuery({ id: reviewObj.companyId }); + + // ===== ROLE DATA ===== // + const role = api.role.getById.useQuery({ id: reviewObj.roleId }); + + // ===== REVIEW TEXT ===== // + const reviewText = reviewObj.textReview; + + // Benefits + const benefits = listBenefits(reviewObj); + return ( + + Search goes here +
+ + + +
+ +
+
+ {reviewObj.location} • + {reviewObj.workTerm} +
+
+ date posted +
+
+ posted by: +
+
+

Position type: Co-op

+
+
+

Work model: {reviewObj.workEnvironment}

+
+
+

Pay: ${reviewObj.hourlyPay}/hr

+
+
+
+ + +
+
+

Company Culture

+ +
+
+

Supervisor

+ +
+
+

Interview Rating

+ +
+
+
{reviewObj.textReview}
+
+
+
+
+ ); +} diff --git a/apps/web/src/app/_components/reviews/role-card.tsx b/apps/web/src/app/_components/reviews/role-card.tsx deleted file mode 100644 index b64bed6..0000000 --- a/apps/web/src/app/_components/reviews/role-card.tsx +++ /dev/null @@ -1,171 +0,0 @@ -"use client"; - -import Image from "next/image"; - -import type { ReviewType, WorkEnvironmentType } from "@cooper/db/schema"; -import { cn } from "@cooper/ui"; -import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; - -import { api } from "~/trpc/react"; -import { listBenefits } from "~/utils/reviewsAggregationHelpers"; -import { prettyWorkEnviornment } from "~/utils/stringHelpers"; -import { ReviewCardStars } from "./review-card-stars"; - -// todo: add this attribution in a footer somewhere -// Logos provided by Clearbit - -const InterviewDifficulty = [ - { des: "Very Easy", color: "text-[#4bc92e]" }, - { des: "Easy", color: "text-[#09b52b]" }, - { des: "Neither Easy Nor Difficult", color: "text-cooper-blue-400" }, - { des: "Difficult", color: "text-[#f27c38]" }, - { des: "Very Difficult", color: "text-[#f52536]" }, -]; - -interface ReviewCardProps { - className?: string; - reviewObj: ReviewType; -} - -export function RoleCard({ className, reviewObj }: ReviewCardProps) { - // ===== COMPANY DATA ===== // - const company = api.company.getById.useQuery({ id: reviewObj.companyId }); - - // ===== ROLE DATA ===== // - const role = api.role.getById.useQuery({ id: reviewObj.roleId }); - - // ===== REVIEW TEXT ===== // - const reviewText = reviewObj.textReview; - - // Benefits - const benefits = listBenefits(reviewObj); - return ( - -
- -
- {company.data ? ( - {`Logo - ) : ( -
- )} -
- - -
-
- {role.data?.title} -
-
- Co-op -
-
-
-
- {company.data?.name} - - {reviewObj.location} -
- {/*

{company.data?.name}

*/} - {/* {company.data && role.data && ( - - )} */} -
-
-
- -

- {reviewObj.reviewHeadline} -

-

{reviewText}

-
- -

Ratings

-
-
-

Company Culture

- -
-
-

Supervisor

- -
-
-

Interview Rating

- -
-
-
- -

- Interview Difficulty -

-

- {InterviewDifficulty[reviewObj.interviewDifficulty - 1]?.des} -

-

{reviewObj.interviewReview}

-
- -

Role Details

-
-
-

Location

-

{reviewObj.location}

-
-
-

Hourly Pay

-

${reviewObj.hourlyPay?.toString()}

-
-
-

Work Model

-

- {prettyWorkEnviornment( - reviewObj.workEnvironment as WorkEnvironmentType, - )} -

-
-
-

Drug Test?

-

{reviewObj.drugTest ? "Yes" : "No"}

-
-
-

Overtime Common?

-

{reviewObj.overtimeNormal ? "Yes" : "No"}

-
-
-
- -

Benefits

-
- {benefits.map((benefit) => { - return ( -
- {benefit} -
- ); - })} -
-

{reviewObj.otherBenefits}

-
-
-
- ); -} diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx new file mode 100644 index 0000000..6a1daf1 --- /dev/null +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -0,0 +1,189 @@ +"use client"; + +import Image from "next/image"; + +import type { ReviewType, WorkEnvironmentType } from "@cooper/db/schema"; +import { cn } from "@cooper/ui"; +import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; + +import { api } from "~/trpc/react"; +import { listBenefits } from "~/utils/reviewsAggregationHelpers"; +import { prettyWorkEnviornment } from "~/utils/stringHelpers"; +import { ReviewCardStars } from "./review-card-stars"; + + +const InterviewDifficulty = [ + { des: "Very Easy", color: "text-[#4bc92e]" }, + { des: "Easy", color: "text-[#09b52b]" }, + { des: "Neither Easy Nor Difficult", color: "text-cooper-blue-400" }, + { des: "Difficult", color: "text-[#f27c38]" }, + { des: "Very Difficult", color: "text-[#f52536]" }, +]; + +const yellowStar = ( + + + +); + +interface ReviewCardProps { + className?: string; + reviewObj: ReviewType; +} + +export function RoleInfo({ className, reviewObj }: ReviewCardProps) { + // ===== COMPANY DATA ===== // + const company = api.company.getById.useQuery({ id: reviewObj.companyId }); + + // ===== ROLE DATA ===== // + const role = api.role.getById.useQuery({ id: reviewObj.roleId }); + + // ===== REVIEW TEXT ===== // + const reviewText = reviewObj.textReview; + + // Benefits + const benefits = listBenefits(reviewObj); + return ( + +
+
+ +
+ {company.data ? ( + {`Logo + ) : ( +
+ )} +
+ + +
+
+ {role.data?.title} +
+
+ Co-op +
+
+
+
+ {company.data?.name} + + {reviewObj.location} +
+
+
+
+ +
+ {yellowStar} {(reviewObj.overallRating).toFixed(1)} +
+
+
+ +
+ + About the Job +
+ +
+ Pay Range +
+
+ ${reviewObj.hourlyPay}/hr +
+
+ +
+ Interview Difficulty +
+
+ {(reviewObj.interviewDifficulty).toFixed(1)} +
+
+ +
+ Interview Difficulty +
+
+ {(reviewObj.interviewDifficulty).toFixed(1)} +
+
+
+
+ + +
+ +
+ Drug Test {reviewObj.drugTest} +
+
+ Federal holidays {reviewObj.federalHolidays} +
+
+ Free merch {reviewObj.freeMerch} +
+
+ Overtime {reviewObj.overtimeNormal} +
+
+ Lunch provided {reviewObj.freeLunch} +
+
+ Other benefits {reviewObj.otherBenefits} +
+
+ PTO {reviewObj.pto} +
+
+ Transportation {reviewObj.freeTransport} +
+
+
+
+ + + +

Ratings

+
+
+

Company Culture

+ +
+
+

Supervisor

+ +
+
+

Interview Rating

+ +
+
+
+
+
+
+
+ ); +} From b3304ca83de711f28f55794cea3661c2fbd3c31b Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Thu, 6 Feb 2025 23:28:06 -0500 Subject: [PATCH 05/14] changed to role card --- .../app/(pages)/(dashboard)/roles/page.tsx | 51 +++--- .../app/_components/reviews/review-card.tsx | 4 +- .../_components/reviews/role-card-preview.tsx | 28 ++-- .../src/app/_components/reviews/role-info.tsx | 154 +++++++++++++----- 4 files changed, 152 insertions(+), 85 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index a4abb7c..4c4e055 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -5,6 +5,7 @@ import { z } from "zod"; import type { ReviewType, + RoleType, WorkEnvironmentType, WorkTermType, } from "@cooper/db/schema"; @@ -64,46 +65,35 @@ export default function Roles({ } }, [toast, mounted, validationResult]); - const reviews = api.review.list.useQuery({ - search: searchParams?.search, - options: validationResult.success ? validationResult.data : {}, - }); - - let myMap = new Map(); - - // for (review : reviews) { - // if (myMap.has({review.})) - // } + const roles = api.role.list.useQuery(); - // myMap.set("Alice", 30); - // myMap.set("Bob", 25); - // myMap.has("Bob") - const [selectedReview, setSelectedReview] = useState( - reviews.isSuccess ? reviews.data[0] : undefined, + const [selectedRole, setSelectedRole] = useState( + roles.isSuccess ? roles.data[0] : undefined, ); + useEffect(() => { - if (reviews.isSuccess) { - setSelectedReview(reviews.data[0]); + if (roles.isSuccess) { + setSelectedRole(roles.data[0]); } - }, [reviews.isSuccess, reviews.data]); + }, [roles.isSuccess, roles.data]); return ( <> - {reviews.isSuccess && reviews.data.length > 0 && ( -
+ {roles.isSuccess && roles.data.length > 0 && ( +
- {reviews.data.map((review, i) => { + {roles.data.map((role, i) => { return ( -
setSelectedReview(review)}> +
setSelectedRole(role)}>
- {reviews.data.length > 0 && reviews.data[0] && ( - - ) } - {reviews.data.length > 0 && reviews.data[0] && ( - + {roles.data.length > 0 && roles.data[0] && ( + ) }
)} - {reviews.isSuccess && reviews.data.length === 0 && } - {reviews.isPending && } + {roles.isSuccess && roles.data.length === 0 && } + {roles.isPending && } ); } diff --git a/apps/web/src/app/_components/reviews/review-card.tsx b/apps/web/src/app/_components/reviews/review-card.tsx index a6776ed..2e081db 100644 --- a/apps/web/src/app/_components/reviews/review-card.tsx +++ b/apps/web/src/app/_components/reviews/review-card.tsx @@ -2,7 +2,7 @@ import Image from "next/image"; -import type { ReviewType, WorkEnvironmentType } from "@cooper/db/schema"; +import type { ReviewType, RoleType, WorkEnvironmentType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; @@ -41,6 +41,8 @@ interface ReviewCardProps { } export function ReviewCard({ className, reviewObj }: ReviewCardProps) { + + // ===== COMPANY DATA ===== // const company = api.company.getById.useQuery({ id: reviewObj.companyId }); diff --git a/apps/web/src/app/_components/reviews/role-card-preview.tsx b/apps/web/src/app/_components/reviews/role-card-preview.tsx index a0daafe..16d9f98 100644 --- a/apps/web/src/app/_components/reviews/role-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/role-card-preview.tsx @@ -2,7 +2,7 @@ import Image from "next/image"; -import type { ReviewType } from "@cooper/db/schema"; +import type { ReviewType, RoleType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, @@ -19,7 +19,7 @@ import { truncateText } from "~/utils/stringHelpers"; interface RoleCardPreviewProps { className?: string; - reviewObj: ReviewType; + reviewObj: RoleType; } export function RoleCardPreview({ @@ -32,10 +32,8 @@ export function RoleCardPreview({ }); // ===== ROLE DATA ===== // - const role = api.role.getById.useQuery({ id: reviewObj.roleId }); - - // Truncate Review Text - const reviewText = truncateText(reviewObj.textReview, 80); + const role = api.role.getById.useQuery({ id: reviewObj.id }); + const reviews = api.review.getByRole.useQuery({id: reviewObj.id}) const yellowStar = (
{company.data?.name} - - {reviewObj.location} + {reviews.isSuccess && reviews.data.length > 0 && } + {reviews.isSuccess && reviews.data.length > 0 && {reviews.data[0]?.location} }
-
- {yellowStar} {(reviewObj.overallRating).toFixed(1)} -
+ {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalRating = reviews.data.reduce((sum, review) => sum + review.overallRating, 0); + const averageRating = (totalRating / reviews.data.length).toFixed(1); + + return ( +
+ {yellowStar} {averageRating} +
+ ); + })()} +
diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index 6a1daf1..0c85a42 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -2,7 +2,7 @@ import Image from "next/image"; -import type { ReviewType, WorkEnvironmentType } from "@cooper/db/schema"; +import type { ReviewType, RoleType, WorkEnvironmentType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; @@ -10,6 +10,7 @@ import { api } from "~/trpc/react"; import { listBenefits } from "~/utils/reviewsAggregationHelpers"; import { prettyWorkEnviornment } from "~/utils/stringHelpers"; import { ReviewCardStars } from "./review-card-stars"; +import { ReviewCard } from "./review-card"; const InterviewDifficulty = [ @@ -35,23 +36,29 @@ const yellowStar = ( ); -interface ReviewCardProps { +interface RoleCardProps { className?: string; - reviewObj: ReviewType; + roleObj: RoleType; } -export function RoleInfo({ className, reviewObj }: ReviewCardProps) { +export function RoleInfo({ className, roleObj }: RoleCardProps) { + const reviews = api.review.getByRole.useQuery({id: roleObj.id}) + let company = null; + console.log(reviews.data) + // ===== COMPANY DATA ===== // - const company = api.company.getById.useQuery({ id: reviewObj.companyId }); + if (reviews.isSuccess && reviews.data.length > 0 && reviews.data[0]) { + company = api.company.getById.useQuery({ id: reviews.data[0].companyId }); + } + if (!company) { + throw new Error("no company") + } + // ===== ROLE DATA ===== // - const role = api.role.getById.useQuery({ id: reviewObj.roleId }); + const role = api.role.getById.useQuery({ id: roleObj.id }); - // ===== REVIEW TEXT ===== // - const reviewText = reviewObj.textReview; - // Benefits - const benefits = listBenefits(reviewObj); return (
{company.data?.name} - - {reviewObj.location} + {reviews.isSuccess && reviews.data.length > 0 && } + {reviews.isSuccess && reviews.data.length > 0 && {reviews.data[0]?.location}}
-
- {yellowStar} {(reviewObj.overallRating).toFixed(1)} -
-
+ {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalRating = reviews.data.reduce((sum, review) => sum + review.overallRating, 0); + const averageRating = (totalRating / reviews.data.length).toFixed(1); + + return ( +
+ {yellowStar} {averageRating} +
+ ); + })()} +
@@ -106,35 +120,61 @@ export function RoleInfo({ className, reviewObj }: ReviewCardProps) { About the Job
-
+ {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalPay = reviews.data.reduce((sum, review) => sum + parseFloat(review.hourlyPay || "0"), 0.0); + const averagePay = (totalPay / reviews.data.length); + + return ( + <> +
Pay Range -
-
- ${reviewObj.hourlyPay}/hr -
+
+
+ ${averagePay}/hr +
+ + ); + })()} +
-
- Interview Difficulty -
-
- {(reviewObj.interviewDifficulty).toFixed(1)} -
+ {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalInterviewDifficulty = reviews.data.reduce((sum, review) => sum + review.interviewDifficulty, 0); + const averageInterviewDifficulty = (totalInterviewDifficulty / reviews.data.length); + return ( + <> +
+ Interview Difficulty +
+
+ {averageInterviewDifficulty} +
+ + ); + })()}
-
- Interview Difficulty -
-
- {(reviewObj.interviewDifficulty).toFixed(1)} -
+ {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalInterviewDifficulty = reviews.data.reduce((sum, review) => sum + review.interviewDifficulty, 0); + const averageInterviewDifficulty = (totalInterviewDifficulty / reviews.data.length); + return ( + <> +
+ Interview Difficulty +
+
+ {averageInterviewDifficulty} +
+ + ); + })()}
- + {/*
Drug Test {reviewObj.drugTest}
@@ -159,7 +199,7 @@ export function RoleInfo({ className, reviewObj }: ReviewCardProps) {
Transportation {reviewObj.freeTransport}
-
+
*/}
@@ -167,21 +207,53 @@ export function RoleInfo({ className, reviewObj }: ReviewCardProps) {

Ratings

-
+ {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalCultureRating = reviews.data.reduce((sum, review) => sum + review.cultureRating, 0); + const averageCultureRating = (totalCultureRating / reviews.data.length); + return ( + <> +

Company Culture

- +
-
+ + ); + })()} + {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalSupervisorRating = reviews.data.reduce((sum, review) => sum + review.supervisorRating, 0); + const averageSupervisorRating = (totalSupervisorRating / reviews.data.length); + return ( + <> +

Supervisor

- +
-
+ + ); + })()} + {reviews.isSuccess && reviews.data.length > 0 && (() => { + const totalInterviewRating = reviews.data.reduce((sum, review) => sum + review.interviewRating, 0); + const averageInterviewRating = (totalInterviewRating / reviews.data.length); + return ( + <> +

Interview Rating

- +
+ + ); + })()}
+ {reviews.isSuccess && reviews.data.length > 0 && ( +
+ + {reviews.data.map((review) => { + return + })} +
+ ) }
From 9ac26322e911c98d1e843e58cacb253152dbdcf3 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Sat, 8 Feb 2025 14:29:02 -0500 Subject: [PATCH 06/14] fixed fetching roles --- .../app/(pages)/(dashboard)/roles/page.tsx | 2 +- .../app/_components/reviews/review-card.tsx | 3 +- .../_components/reviews/role-card-preview.tsx | 2 +- .../src/app/_components/reviews/role-info.tsx | 39 +++++++++---------- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 4c4e055..ac86f8e 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -83,7 +83,7 @@ export default function Roles({ <> {roles.isSuccess && roles.data.length > 0 && ( -
+
{roles.data.map((role, i) => { return ( diff --git a/apps/web/src/app/_components/reviews/review-card.tsx b/apps/web/src/app/_components/reviews/review-card.tsx index 2e081db..bf36c2d 100644 --- a/apps/web/src/app/_components/reviews/review-card.tsx +++ b/apps/web/src/app/_components/reviews/review-card.tsx @@ -56,8 +56,7 @@ export function ReviewCard({ className, reviewObj }: ReviewCardProps) { const benefits = listBenefits(reviewObj); return ( - Search goes here -
+
diff --git a/apps/web/src/app/_components/reviews/role-card-preview.tsx b/apps/web/src/app/_components/reviews/role-card-preview.tsx index 16d9f98..6f63da5 100644 --- a/apps/web/src/app/_components/reviews/role-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/role-card-preview.tsx @@ -87,7 +87,7 @@ export function RoleCardPreview({ return (
- {yellowStar} {averageRating} + {yellowStar} {averageRating} ({reviews.data.length} reviews)
); })()} diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index 0c85a42..26b7db8 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -5,6 +5,8 @@ import Image from "next/image"; import type { ReviewType, RoleType, WorkEnvironmentType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; +import type { inferRouterOutputs } from "@trpc/server"; +import type { AppRouter } from "@cooper/api"; import { api } from "~/trpc/react"; import { listBenefits } from "~/utils/reviewsAggregationHelpers"; @@ -42,22 +44,17 @@ interface RoleCardProps { } export function RoleInfo({ className, roleObj }: RoleCardProps) { - const reviews = api.review.getByRole.useQuery({id: roleObj.id}) - let company = null; - console.log(reviews.data) - - // ===== COMPANY DATA ===== // - if (reviews.isSuccess && reviews.data.length > 0 && reviews.data[0]) { - company = api.company.getById.useQuery({ id: reviews.data[0].companyId }); - } - if (!company) { - throw new Error("no company") - } + const reviews = api.review.getByRole.useQuery({id: roleObj.id}); + const companyQuery = api.company.getById.useQuery( + { id: reviews.data?.[0]?.companyId ?? "" }, + { enabled: !!reviews.data?.[0]?.companyId } + ); // ===== ROLE DATA ===== // const role = api.role.getById.useQuery({ id: roleObj.id }); + const companyData = companyQuery.data; return (
- {company.data ? ( + {companyData ? ( {`Logo ) : ( @@ -94,7 +91,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) {
- {company.data?.name} + {companyData?.name} {reviews.isSuccess && reviews.data.length > 0 && } {reviews.isSuccess && reviews.data.length > 0 && {reviews.data[0]?.location}}
@@ -108,7 +105,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { return (
- {yellowStar} {averageRating} + {yellowStar} {averageRating} ({reviews.data.length} reviews)
); })()} @@ -130,7 +127,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { Pay Range
- ${averagePay}/hr + ${Math.round(averagePay * 100) / 100.00}/hr
); @@ -147,13 +144,13 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { Interview Difficulty
- {averageInterviewDifficulty} + {Math.round(averageInterviewDifficulty * 100) / 100.00}
); })()} - + {/* {reviews.isSuccess && reviews.data.length > 0 && (() => { const totalInterviewDifficulty = reviews.data.reduce((sum, review) => sum + review.interviewDifficulty, 0); const averageInterviewDifficulty = (totalInterviewDifficulty / reviews.data.length); @@ -168,7 +165,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { ); })()} - + */}
@@ -247,7 +244,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { {reviews.isSuccess && reviews.data.length > 0 && ( -
+
{reviews.data.map((review) => { return From 08188383e0899d8cf02bf3780a38ea35548cd04c Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Sun, 9 Feb 2025 21:24:50 -0500 Subject: [PATCH 07/14] changed styling --- .../web/src/app/(pages)/(dashboard)/roles/page.tsx | 14 +++++++------- apps/web/src/app/_components/form/rating.tsx | 2 +- .../src/app/_components/reviews/review-card.tsx | 2 +- .../app/_components/reviews/role-card-preview.tsx | 2 +- apps/web/src/app/_components/reviews/role-info.tsx | 7 +++++-- apps/web/tailwind.config.ts | 3 ++- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index ac86f8e..cf9137d 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -81,28 +81,28 @@ export default function Roles({ return ( <> - + {/* */} {roles.isSuccess && roles.data.length > 0 && ( -
-
+
+
{roles.data.map((role, i) => { return (
setSelectedRole(role)}>
); })}
-
+
{roles.data.length > 0 && roles.data[0] && ( ) } diff --git a/apps/web/src/app/_components/form/rating.tsx b/apps/web/src/app/_components/form/rating.tsx index 445070e..cdd138a 100644 --- a/apps/web/src/app/_components/form/rating.tsx +++ b/apps/web/src/app/_components/form/rating.tsx @@ -36,7 +36,7 @@ export const Rating = forwardRef( "size-20", i < hoveredIndex || i < +getValues(name) ? "fill-cooper-yellow-500" - : "fill-cooper-gray-100", + : "fill-cooper-gray-200", "pr-2 hover:cursor-pointer", )} onMouseEnter={() => setHoveredIndex(i + 1)} diff --git a/apps/web/src/app/_components/reviews/review-card.tsx b/apps/web/src/app/_components/reviews/review-card.tsx index bf36c2d..c412754 100644 --- a/apps/web/src/app/_components/reviews/review-card.tsx +++ b/apps/web/src/app/_components/reviews/review-card.tsx @@ -55,7 +55,7 @@ export function ReviewCard({ className, reviewObj }: ReviewCardProps) { // Benefits const benefits = listBenefits(reviewObj); return ( - +
diff --git a/apps/web/src/app/_components/reviews/role-card-preview.tsx b/apps/web/src/app/_components/reviews/role-card-preview.tsx index 6f63da5..b392387 100644 --- a/apps/web/src/app/_components/reviews/role-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/role-card-preview.tsx @@ -53,7 +53,7 @@ export function RoleCardPreview({ return ( diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index 26b7db8..1b4292f 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -113,7 +113,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) {
- + About the Job
@@ -169,7 +169,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) {
- +
{/*
@@ -245,6 +245,9 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { {reviews.isSuccess && reviews.data.length > 0 && (
+
+ Reviews: +
{reviews.data.map((review) => { return diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts index 518bf93..e0a4566 100644 --- a/apps/web/tailwind.config.ts +++ b/apps/web/tailwind.config.ts @@ -21,7 +21,8 @@ export default { sans: ["var(--font-sans)", ...fontFamily.sans], }, colors: { - "cooper-gray-100": "#DDE8F0", + "cooper-gray-100": "#F9F9F9", + "cooper-gray-200": "#F7F7F7", "cooper-blue-800": "#5A9478", "cooper-blue-700": "#1D679C", "cooper-blue-600": "#436F8E", From d551a4e6b0530a944153ab57ec66d31b23037e9c Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Sun, 9 Feb 2025 22:44:02 -0500 Subject: [PATCH 08/14] fixed borders --- apps/web/src/app/(pages)/(dashboard)/roles/page.tsx | 6 +++--- apps/web/src/app/_components/reviews/role-info.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index cf9137d..5af576e 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -83,8 +83,8 @@ export default function Roles({ <> {/* */} {roles.isSuccess && roles.data.length > 0 && ( -
-
+
+
{roles.data.map((role, i) => { return (
setSelectedRole(role)}> @@ -102,7 +102,7 @@ export default function Roles({ ); })}
-
+
{roles.data.length > 0 && roles.data[0] && ( ) } diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index 1b4292f..545b9fb 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -59,7 +59,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { return ( From d4b351603a47f96aaaf65c64a45712ad1d5303b7 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Wed, 12 Feb 2025 22:14:20 -0500 Subject: [PATCH 09/14] added vertical line --- apps/web/src/app/(pages)/(dashboard)/roles/page.tsx | 2 +- apps/web/src/app/_components/reviews/role-info.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 5af576e..277debc 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -83,7 +83,7 @@ export default function Roles({ <> {/* */} {roles.isSuccess && roles.data.length > 0 && ( -
+
{roles.data.map((role, i) => { return ( diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index 545b9fb..45df0d7 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -59,7 +59,7 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { return ( From 03a0c3d7fd54fa9344b4a5cc1a42011fb5d46276 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Thu, 13 Feb 2025 18:40:53 -0500 Subject: [PATCH 10/14] formatting --- .../app/(pages)/(dashboard)/roles/page.tsx | 15 +- .../app/_components/reviews/review-card.tsx | 87 ++--- .../_components/reviews/role-card-preview.tsx | 56 +-- .../src/app/_components/reviews/role-info.tsx | 328 ++++++++++-------- 4 files changed, 265 insertions(+), 221 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 277debc..767e53c 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -15,11 +15,11 @@ import { useToast } from "@cooper/ui/hooks/use-toast"; import LoadingResults from "~/app/_components/loading-results"; import NoResults from "~/app/_components/no-results"; -import { RoleInfo } from "~/app/_components/reviews/role-info"; +import { ReviewCard } from "~/app/_components/reviews/review-card"; import { RoleCardPreview } from "~/app/_components/reviews/role-card-preview"; +import { RoleInfo } from "~/app/_components/reviews/role-info"; import SearchFilter from "~/app/_components/search/search-filter"; import { api } from "~/trpc/react"; -import { ReviewCard } from "~/app/_components/reviews/review-card"; export default function Roles({ searchParams, @@ -67,12 +67,10 @@ export default function Roles({ const roles = api.role.list.useQuery(); - const [selectedRole, setSelectedRole] = useState( roles.isSuccess ? roles.data[0] : undefined, ); - useEffect(() => { if (roles.isSuccess) { setSelectedRole(roles.data[0]); @@ -83,8 +81,8 @@ export default function Roles({ <> {/* */} {roles.isSuccess && roles.data.length > 0 && ( -
-
+
+
{roles.data.map((role, i) => { return (
setSelectedRole(role)}> @@ -102,11 +100,10 @@ export default function Roles({ ); })}
-
+
{roles.data.length > 0 && roles.data[0] && ( - ) } - + )}
)} diff --git a/apps/web/src/app/_components/reviews/review-card.tsx b/apps/web/src/app/_components/reviews/review-card.tsx index c412754..2628e8b 100644 --- a/apps/web/src/app/_components/reviews/review-card.tsx +++ b/apps/web/src/app/_components/reviews/review-card.tsx @@ -2,7 +2,11 @@ import Image from "next/image"; -import type { ReviewType, RoleType, WorkEnvironmentType } from "@cooper/db/schema"; +import type { + ReviewType, + RoleType, + WorkEnvironmentType, +} from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; @@ -11,7 +15,6 @@ import { listBenefits } from "~/utils/reviewsAggregationHelpers"; import { prettyWorkEnviornment } from "~/utils/stringHelpers"; import { ReviewCardStars } from "./review-card-stars"; - const InterviewDifficulty = [ { des: "Very Easy", color: "text-[#4bc92e]" }, { des: "Easy", color: "text-[#09b52b]" }, @@ -41,8 +44,6 @@ interface ReviewCardProps { } export function ReviewCard({ className, reviewObj }: ReviewCardProps) { - - // ===== COMPANY DATA ===== // const company = api.company.getById.useQuery({ id: reviewObj.companyId }); @@ -55,55 +56,55 @@ export function ReviewCard({ className, reviewObj }: ReviewCardProps) { // Benefits const benefits = listBenefits(reviewObj); return ( - -
- - + +
+
- -
-
- {reviewObj.location} • - {reviewObj.workTerm} -
-
- date posted -
+ +
+
+ + {" "} + {reviewObj.location} • + + {reviewObj.workTerm} +
+
date posted
+
posted by:
+
+

Position type: Co-op

+
+
+

Work model: {reviewObj.workEnvironment}

+
+
+

Pay: ${reviewObj.hourlyPay}/hr

+
+ +
+ + +
- posted by: -
-
-

Position type: Co-op

+

Company Culture

+
-

Work model: {reviewObj.workEnvironment}

+

Supervisor

+
-

Pay: ${reviewObj.hourlyPay}/hr

+

Interview Rating

+
+
+
{reviewObj.textReview}
- - -
-
-

Company Culture

- -
-
-

Supervisor

- -
-
-

Interview Rating

- -
-
{reviewObj.textReview}
-
-
-
-
+ ); } diff --git a/apps/web/src/app/_components/reviews/role-card-preview.tsx b/apps/web/src/app/_components/reviews/role-card-preview.tsx index b392387..3f61760 100644 --- a/apps/web/src/app/_components/reviews/role-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/role-card-preview.tsx @@ -16,7 +16,6 @@ import { ReviewCardStars } from "~/app/_components/reviews/review-card-stars"; import { api } from "~/trpc/react"; import { truncateText } from "~/utils/stringHelpers"; - interface RoleCardPreviewProps { className?: string; reviewObj: RoleType; @@ -33,7 +32,7 @@ export function RoleCardPreview({ // ===== ROLE DATA ===== // const role = api.role.getById.useQuery({ id: reviewObj.id }); - const reviews = api.review.getByRole.useQuery({id: reviewObj.id}) + const reviews = api.review.getByRole.useQuery({ id: reviewObj.id }); const yellowStar = ( @@ -62,36 +61,45 @@ export function RoleCardPreview({
-
-
- {role.data?.title} -
-
- Co-op -
+
+
{role.data?.title}
+
Co-op
- -
+
{company.data?.name} - {reviews.isSuccess && reviews.data.length > 0 && } - {reviews.isSuccess && reviews.data.length > 0 && {reviews.data[0]?.location} } + {reviews.isSuccess && reviews.data.length > 0 && ( + + • + + )} + {reviews.isSuccess && reviews.data.length > 0 && ( + {reviews.data[0]?.location} + )}
- {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalRating = reviews.data.reduce((sum, review) => sum + review.overallRating, 0); - const averageRating = (totalRating / reviews.data.length).toFixed(1); + {reviews.isSuccess && + reviews.data.length > 0 && + (() => { + const totalRating = reviews.data.reduce( + (sum, review) => sum + review.overallRating, + 0, + ); + const averageRating = (totalRating / reviews.data.length).toFixed( + 1, + ); - return ( -
- {yellowStar} {averageRating} ({reviews.data.length} reviews) -
- ); - })()} - + return ( +
+ {yellowStar} {averageRating} ({reviews.data.length} reviews) +
+ ); + })()}
diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index 45df0d7..f35f98c 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -1,19 +1,22 @@ "use client"; +import type { inferRouterOutputs } from "@trpc/server"; import Image from "next/image"; -import type { ReviewType, RoleType, WorkEnvironmentType } from "@cooper/db/schema"; +import type { AppRouter } from "@cooper/api"; +import type { + ReviewType, + RoleType, + WorkEnvironmentType, +} from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; -import type { inferRouterOutputs } from "@trpc/server"; -import type { AppRouter } from "@cooper/api"; import { api } from "~/trpc/react"; import { listBenefits } from "~/utils/reviewsAggregationHelpers"; import { prettyWorkEnviornment } from "~/utils/stringHelpers"; -import { ReviewCardStars } from "./review-card-stars"; import { ReviewCard } from "./review-card"; - +import { ReviewCardStars } from "./review-card-stars"; const InterviewDifficulty = [ { des: "Very Easy", color: "text-[#4bc92e]" }, @@ -44,11 +47,11 @@ interface RoleCardProps { } export function RoleInfo({ className, roleObj }: RoleCardProps) { - const reviews = api.review.getByRole.useQuery({id: roleObj.id}); - + const reviews = api.review.getByRole.useQuery({ id: roleObj.id }); + const companyQuery = api.company.getById.useQuery( { id: reviews.data?.[0]?.companyId ?? "" }, - { enabled: !!reviews.data?.[0]?.companyId } + { enabled: !!reviews.data?.[0]?.companyId }, ); // ===== ROLE DATA ===== // @@ -64,93 +67,112 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { )} >
-
- -
- {companyData ? ( - {`Logo - ) : ( -
- )} -
- - -
-
- {role.data?.title} -
-
- Co-op +
+ +
+ {companyData ? ( + {`Logo + ) : ( +
+ )} +
+ +
+
{role.data?.title}
+
Co-op
+
+
+ {companyData?.name} + {reviews.isSuccess && reviews.data.length > 0 && ( + + • + + )} + {reviews.isSuccess && reviews.data.length > 0 && ( + {reviews.data[0]?.location} + )}
- -
- {companyData?.name} - {reviews.isSuccess && reviews.data.length > 0 && } - {reviews.isSuccess && reviews.data.length > 0 && {reviews.data[0]?.location}}
-
-
- - {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalRating = reviews.data.reduce((sum, review) => sum + review.overallRating, 0); - const averageRating = (totalRating / reviews.data.length).toFixed(1); + + + {reviews.isSuccess && + reviews.data.length > 0 && + (() => { + const totalRating = reviews.data.reduce( + (sum, review) => sum + review.overallRating, + 0, + ); + const averageRating = ( + totalRating / reviews.data.length + ).toFixed(1); - return ( -
- {yellowStar} {averageRating} ({reviews.data.length} reviews) -
- ); - })()} -
+ return ( +
+ {yellowStar} {averageRating} ({reviews.data.length} reviews) +
+ ); + })()} +
- - About the Job -
- - {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalPay = reviews.data.reduce((sum, review) => sum + parseFloat(review.hourlyPay || "0"), 0.0); - const averagePay = (totalPay / reviews.data.length); + + About the Job +
+ + {reviews.isSuccess && + reviews.data.length > 0 && + (() => { + const totalPay = reviews.data.reduce( + (sum, review) => + sum + parseFloat(review.hourlyPay || "0"), + 0.0, + ); + const averagePay = totalPay / reviews.data.length; - return ( - <> -
- Pay Range -
-
- ${Math.round(averagePay * 100) / 100.00}/hr -
- - ); - })()} - -
- - {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalInterviewDifficulty = reviews.data.reduce((sum, review) => sum + review.interviewDifficulty, 0); - const averageInterviewDifficulty = (totalInterviewDifficulty / reviews.data.length); - return ( - <> -
- Interview Difficulty -
-
- {Math.round(averageInterviewDifficulty * 100) / 100.00} -
- - ); - })()} -
- {/* + return ( + <> +
Pay Range
+
+ ${Math.round(averagePay * 100) / 100.0}/hr +
+ + ); + })()} +
+ + {reviews.isSuccess && + reviews.data.length > 0 && + (() => { + const totalInterviewDifficulty = reviews.data.reduce( + (sum, review) => sum + review.interviewDifficulty, + 0, + ); + const averageInterviewDifficulty = + totalInterviewDifficulty / reviews.data.length; + return ( + <> +
+ Interview Difficulty +
+
+ {Math.round(averageInterviewDifficulty * 100) / 100.0} +
+ + ); + })()} +
+ {/* {reviews.isSuccess && reviews.data.length > 0 && (() => { const totalInterviewDifficulty = reviews.data.reduce((sum, review) => sum + review.interviewDifficulty, 0); const averageInterviewDifficulty = (totalInterviewDifficulty / reviews.data.length); @@ -166,12 +188,12 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { ); })()} */} -
-
+
+
- -
- {/* + +
+ {/*
Drug Test {reviewObj.drugTest}
@@ -197,63 +219,79 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { Transportation {reviewObj.freeTransport}
*/} -
-
+
+ - - -

Ratings

-
- {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalCultureRating = reviews.data.reduce((sum, review) => sum + review.cultureRating, 0); - const averageCultureRating = (totalCultureRating / reviews.data.length); - return ( - <> -
-

Company Culture

- -
- - ); - })()} - {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalSupervisorRating = reviews.data.reduce((sum, review) => sum + review.supervisorRating, 0); - const averageSupervisorRating = (totalSupervisorRating / reviews.data.length); - return ( - <> -
-

Supervisor

- + + +

Ratings

+
+ {reviews.isSuccess && + reviews.data.length > 0 && + (() => { + const totalCultureRating = reviews.data.reduce( + (sum, review) => sum + review.cultureRating, + 0, + ); + const averageCultureRating = + totalCultureRating / reviews.data.length; + return ( + <> +
+

Company Culture

+ +
+ + ); + })()} + {reviews.isSuccess && + reviews.data.length > 0 && + (() => { + const totalSupervisorRating = reviews.data.reduce( + (sum, review) => sum + review.supervisorRating, + 0, + ); + const averageSupervisorRating = + totalSupervisorRating / reviews.data.length; + return ( + <> +
+

Supervisor

+ +
+ + ); + })()} + {reviews.isSuccess && + reviews.data.length > 0 && + (() => { + const totalInterviewRating = reviews.data.reduce( + (sum, review) => sum + review.interviewRating, + 0, + ); + const averageInterviewRating = + totalInterviewRating / reviews.data.length; + return ( + <> +
+

Interview Rating

+ +
+ + ); + })()}
- - ); - })()} - {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalInterviewRating = reviews.data.reduce((sum, review) => sum + review.interviewRating, 0); - const averageInterviewRating = (totalInterviewRating / reviews.data.length); - return ( - <> -
-

Interview Rating

- -
- - ); - })()} -
- - - {reviews.isSuccess && reviews.data.length > 0 && ( -
-
- Reviews: -
+ + + {reviews.isSuccess && reviews.data.length > 0 && ( +
+
Reviews:
- {reviews.data.map((review) => { - return - })} -
- ) } + {reviews.data.map((review) => { + return ; + })} +
+ )}
From 77c9c613d6e6ebd166ce94781cc00c8dd6b6e925 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Thu, 13 Feb 2025 20:16:50 -0500 Subject: [PATCH 11/14] fixed linting --- .../app/(pages)/(dashboard)/roles/page.tsx | 3 - .../app/_components/reviews/review-card.tsx | 56 +++----------- .../_components/reviews/role-card-preview.tsx | 14 +--- .../src/app/_components/reviews/role-info.tsx | 73 +++---------------- 4 files changed, 21 insertions(+), 125 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 767e53c..6ea32fc 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -4,7 +4,6 @@ import { useEffect, useState } from "react"; import { z } from "zod"; import type { - ReviewType, RoleType, WorkEnvironmentType, WorkTermType, @@ -15,10 +14,8 @@ import { useToast } from "@cooper/ui/hooks/use-toast"; import LoadingResults from "~/app/_components/loading-results"; import NoResults from "~/app/_components/no-results"; -import { ReviewCard } from "~/app/_components/reviews/review-card"; import { RoleCardPreview } from "~/app/_components/reviews/role-card-preview"; import { RoleInfo } from "~/app/_components/reviews/role-info"; -import SearchFilter from "~/app/_components/search/search-filter"; import { api } from "~/trpc/react"; export default function Roles({ diff --git a/apps/web/src/app/_components/reviews/review-card.tsx b/apps/web/src/app/_components/reviews/review-card.tsx index 2628e8b..eca1435 100644 --- a/apps/web/src/app/_components/reviews/review-card.tsx +++ b/apps/web/src/app/_components/reviews/review-card.tsx @@ -1,60 +1,24 @@ "use client"; -import Image from "next/image"; +import type { ReviewType } from "@cooper/db/schema"; +import { Card, CardContent } from "@cooper/ui/card"; -import type { - ReviewType, - RoleType, - WorkEnvironmentType, -} from "@cooper/db/schema"; -import { cn } from "@cooper/ui"; -import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; - -import { api } from "~/trpc/react"; -import { listBenefits } from "~/utils/reviewsAggregationHelpers"; -import { prettyWorkEnviornment } from "~/utils/stringHelpers"; import { ReviewCardStars } from "./review-card-stars"; -const InterviewDifficulty = [ - { des: "Very Easy", color: "text-[#4bc92e]" }, - { des: "Easy", color: "text-[#09b52b]" }, - { des: "Neither Easy Nor Difficult", color: "text-cooper-blue-400" }, - { des: "Difficult", color: "text-[#f27c38]" }, - { des: "Very Difficult", color: "text-[#f52536]" }, -]; - -const yellowStar = ( - - - -); +// const InterviewDifficulty = [ +// { des: "Very Easy", color: "text-[#4bc92e]" }, +// { des: "Easy", color: "text-[#09b52b]" }, +// { des: "Neither Easy Nor Difficult", color: "text-cooper-blue-400" }, +// { des: "Difficult", color: "text-[#f27c38]" }, +// { des: "Very Difficult", color: "text-[#f52536]" }, +// ]; interface ReviewCardProps { className?: string; reviewObj: ReviewType; } -export function ReviewCard({ className, reviewObj }: ReviewCardProps) { - // ===== COMPANY DATA ===== // - const company = api.company.getById.useQuery({ id: reviewObj.companyId }); - - // ===== ROLE DATA ===== // - const role = api.role.getById.useQuery({ id: reviewObj.roleId }); - - // ===== REVIEW TEXT ===== // - const reviewText = reviewObj.textReview; - - // Benefits - const benefits = listBenefits(reviewObj); +export function ReviewCard({ reviewObj }: ReviewCardProps) { return (
diff --git a/apps/web/src/app/_components/reviews/role-card-preview.tsx b/apps/web/src/app/_components/reviews/role-card-preview.tsx index 3f61760..f2d4b77 100644 --- a/apps/web/src/app/_components/reviews/role-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/role-card-preview.tsx @@ -1,20 +1,10 @@ "use client"; -import Image from "next/image"; - -import type { ReviewType, RoleType } from "@cooper/db/schema"; +import type { RoleType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; -import { - Card, - CardContent, - CardFooter, - CardHeader, - CardTitle, -} from "@cooper/ui/card"; +import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; -import { ReviewCardStars } from "~/app/_components/reviews/review-card-stars"; import { api } from "~/trpc/react"; -import { truncateText } from "~/utils/stringHelpers"; interface RoleCardPreviewProps { className?: string; diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index f35f98c..00c7ba7 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -1,30 +1,22 @@ "use client"; -import type { inferRouterOutputs } from "@trpc/server"; import Image from "next/image"; -import type { AppRouter } from "@cooper/api"; -import type { - ReviewType, - RoleType, - WorkEnvironmentType, -} from "@cooper/db/schema"; +import type { RoleType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; import { api } from "~/trpc/react"; -import { listBenefits } from "~/utils/reviewsAggregationHelpers"; -import { prettyWorkEnviornment } from "~/utils/stringHelpers"; import { ReviewCard } from "./review-card"; import { ReviewCardStars } from "./review-card-stars"; -const InterviewDifficulty = [ - { des: "Very Easy", color: "text-[#4bc92e]" }, - { des: "Easy", color: "text-[#09b52b]" }, - { des: "Neither Easy Nor Difficult", color: "text-cooper-blue-400" }, - { des: "Difficult", color: "text-[#f27c38]" }, - { des: "Very Difficult", color: "text-[#f52536]" }, -]; +// const InterviewDifficulty = [ +// { des: "Very Easy", color: "text-[#4bc92e]" }, +// { des: "Easy", color: "text-[#09b52b]" }, +// { des: "Neither Easy Nor Difficult", color: "text-cooper-blue-400" }, +// { des: "Difficult", color: "text-[#f27c38]" }, +// { des: "Very Difficult", color: "text-[#f52536]" }, +// ]; const yellowStar = ( { const totalPay = reviews.data.reduce( (sum, review) => - sum + parseFloat(review.hourlyPay || "0"), + sum + parseFloat(review.hourlyPay ?? "0"), 0.0, ); const averagePay = totalPay / reviews.data.length; @@ -172,53 +164,6 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) { ); })()} - {/* - {reviews.isSuccess && reviews.data.length > 0 && (() => { - const totalInterviewDifficulty = reviews.data.reduce((sum, review) => sum + review.interviewDifficulty, 0); - const averageInterviewDifficulty = (totalInterviewDifficulty / reviews.data.length); - return ( - <> -
- Interview Difficulty -
-
- {averageInterviewDifficulty} -
- - ); - })()} - */} -
-
- - -
- {/* -
- Drug Test {reviewObj.drugTest} -
-
- Federal holidays {reviewObj.federalHolidays} -
-
- Free merch {reviewObj.freeMerch} -
-
- Overtime {reviewObj.overtimeNormal} -
-
- Lunch provided {reviewObj.freeLunch} -
-
- Other benefits {reviewObj.otherBenefits} -
-
- PTO {reviewObj.pto} -
-
- Transportation {reviewObj.freeTransport} -
-
*/}
From e065b68d4f5acbf4e791069db4f978d5b9c7eeb8 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Mon, 17 Feb 2025 10:23:17 -0500 Subject: [PATCH 12/14] small frontend changes --- apps/web/public/svg/star.svg | 3 + .../app/(pages)/(dashboard)/roles/page.tsx | 71 ++++--------------- .../_components/reviews/role-card-preview.tsx | 35 ++++----- .../src/app/_components/reviews/role-info.tsx | 31 ++++---- apps/web/tailwind.config.ts | 1 + 5 files changed, 44 insertions(+), 97 deletions(-) create mode 100644 apps/web/public/svg/star.svg diff --git a/apps/web/public/svg/star.svg b/apps/web/public/svg/star.svg new file mode 100644 index 0000000..9afaa96 --- /dev/null +++ b/apps/web/public/svg/star.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 6ea32fc..27fd38d 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -1,16 +1,9 @@ "use client"; import { useEffect, useState } from "react"; -import { z } from "zod"; -import type { - RoleType, - WorkEnvironmentType, - WorkTermType, -} from "@cooper/db/schema"; -import { WorkEnvironment, WorkTerm } from "@cooper/db/schema"; +import type { RoleType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; -import { useToast } from "@cooper/ui/hooks/use-toast"; import LoadingResults from "~/app/_components/loading-results"; import NoResults from "~/app/_components/no-results"; @@ -18,50 +11,14 @@ import { RoleCardPreview } from "~/app/_components/reviews/role-card-preview"; import { RoleInfo } from "~/app/_components/reviews/role-info"; import { api } from "~/trpc/react"; -export default function Roles({ - searchParams, -}: { - searchParams?: { - search?: string; - cycle?: WorkTermType; - term?: WorkEnvironmentType; - }; -}) { - const { toast } = useToast(); - - const RolesSearchParam = z.object({ - cycle: z - .nativeEnum(WorkTerm, { - message: "Invalid cycle type", - }) - .optional(), - term: z - .nativeEnum(WorkEnvironment, { - message: "Invalid term type", - }) - .optional(), - }); - - const validationResult = RolesSearchParam.safeParse(searchParams); - const [mounted, setMounted] = useState(false); - - useEffect(() => { - setMounted(true); - }, []); - - useEffect(() => { - if (mounted && !validationResult.success) { - toast({ - title: "Invalid Search Parameters", - description: validationResult.error.issues - .map((issue) => issue.message) - .join(", "), - variant: "destructive", - }); - setMounted(false); - } - }, [toast, mounted, validationResult]); - +export default function Roles() { +// { +// // searchParams, +// }: { +// // searchParams?: { +// // search?: string; +// // }; +// } const roles = api.role.list.useQuery(); const [selectedRole, setSelectedRole] = useState( @@ -76,10 +33,9 @@ export default function Roles({ return ( <> - {/* */} {roles.isSuccess && roles.data.length > 0 && ( -
-
+
+
{roles.data.map((role, i) => { return (
setSelectedRole(role)}> @@ -88,9 +44,8 @@ export default function Roles({ className={cn( "mb-4 hover:bg-cooper-gray-100", selectedRole - ? selectedRole.id === role.id && - "border-2 bg-cooper-gray-200" - : !i && "border-2 bg-cooper-gray-200", + ? selectedRole.id === role.id && "bg-cooper-gray-200" + : !i && "bg-cooper-gray-200", )} />
diff --git a/apps/web/src/app/_components/reviews/role-card-preview.tsx b/apps/web/src/app/_components/reviews/role-card-preview.tsx index f2d4b77..85b58e0 100644 --- a/apps/web/src/app/_components/reviews/role-card-preview.tsx +++ b/apps/web/src/app/_components/reviews/role-card-preview.tsx @@ -1,5 +1,7 @@ "use client"; +import Image from "next/image"; + import type { RoleType } from "@cooper/db/schema"; import { cn } from "@cooper/ui"; import { Card, CardContent, CardHeader, CardTitle } from "@cooper/ui/card"; @@ -24,25 +26,10 @@ export function RoleCardPreview({ const role = api.role.getById.useQuery({ id: reviewObj.id }); const reviews = api.review.getByRole.useQuery({ id: reviewObj.id }); - const yellowStar = ( - - - - ); - return ( @@ -53,10 +40,12 @@ export function RoleCardPreview({
{role.data?.title}
-
Co-op
+
+ Co-op +
-
+
{company.data?.name} {reviews.isSuccess && reviews.data.length > 0 && ( - {yellowStar} {averageRating} ({reviews.data.length} reviews) +
+ Star icon + {averageRating} ({reviews.data.length} reviews)
); })()} diff --git a/apps/web/src/app/_components/reviews/role-info.tsx b/apps/web/src/app/_components/reviews/role-info.tsx index 00c7ba7..830c40a 100644 --- a/apps/web/src/app/_components/reviews/role-info.tsx +++ b/apps/web/src/app/_components/reviews/role-info.tsx @@ -18,21 +18,6 @@ import { ReviewCardStars } from "./review-card-stars"; // { des: "Very Difficult", color: "text-[#f52536]" }, // ]; -const yellowStar = ( - - - -); - interface RoleCardProps { className?: string; roleObj: RoleType; @@ -77,10 +62,12 @@ export function RoleInfo({ className, roleObj }: RoleCardProps) {
{role.data?.title}
-
Co-op
+
+ Co-op +
-
+
{companyData?.name} {reviews.isSuccess && reviews.data.length > 0 && ( - {yellowStar} {averageRating} ({reviews.data.length} reviews) +
+ Star icon + {averageRating} ({reviews.data.length} reviews)
); })()} diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts index e0a4566..4341575 100644 --- a/apps/web/tailwind.config.ts +++ b/apps/web/tailwind.config.ts @@ -23,6 +23,7 @@ export default { colors: { "cooper-gray-100": "#F9F9F9", "cooper-gray-200": "#F7F7F7", + "cooper-gray-400": "#5A5A5A", "cooper-blue-800": "#5A9478", "cooper-blue-700": "#1D679C", "cooper-blue-600": "#436F8E", From b3741d8a569f081e3c630f50c0ea7dff8e113318 Mon Sep 17 00:00:00 2001 From: gpalmer27 Date: Mon, 17 Feb 2025 10:30:35 -0500 Subject: [PATCH 13/14] formatting --- apps/web/src/app/(pages)/(dashboard)/roles/page.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 27fd38d..81316c8 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -12,13 +12,6 @@ import { RoleInfo } from "~/app/_components/reviews/role-info"; import { api } from "~/trpc/react"; export default function Roles() { -// { -// // searchParams, -// }: { -// // searchParams?: { -// // search?: string; -// // }; -// } const roles = api.role.list.useQuery(); const [selectedRole, setSelectedRole] = useState( From 5078c76b99a34c16bc52d89aa05201ff83d1b92d Mon Sep 17 00:00:00 2001 From: Alton Banushi Date: Mon, 17 Feb 2025 16:41:35 -0500 Subject: [PATCH 14/14] Update page.tsx small tailwind thing --- apps/web/src/app/(pages)/(dashboard)/roles/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx index 81316c8..9ca95c1 100644 --- a/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx +++ b/apps/web/src/app/(pages)/(dashboard)/roles/page.tsx @@ -27,7 +27,7 @@ export default function Roles() { return ( <> {roles.isSuccess && roles.data.length > 0 && ( -
+
{roles.data.map((role, i) => { return (