Skip to content

Commit

Permalink
Merge branch 'main' into form-error-handling
Browse files Browse the repository at this point in the history
  • Loading branch information
suxls committed Feb 20, 2025
2 parents 061e68e + f1d139a commit 9909b9e
Show file tree
Hide file tree
Showing 23 changed files with 907 additions and 358 deletions.
3 changes: 3 additions & 0 deletions apps/web/public/svg/magnifyingGlass.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions apps/web/public/svg/star.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
108 changes: 26 additions & 82 deletions apps/web/src/app/(pages)/(dashboard)/roles/page.tsx
Original file line number Diff line number Diff line change
@@ -1,115 +1,59 @@
"use client";

import { useEffect, useState } from "react";
import { z } from "zod";

import type {
ReviewType,
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";
import { ReviewCard } from "~/app/_components/reviews/review-card";
import { ReviewCardPreview } from "~/app/_components/reviews/review-card-preview";
import SearchFilter from "~/app/_components/search/search-filter";
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();
export default function Roles() {
const roles = api.role.list.useQuery();

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]);

const reviews = api.review.list.useQuery({
search: searchParams?.search,
options: validationResult.success ? validationResult.data : {},
});

const [selectedReview, setSelectedReview] = useState<ReviewType | undefined>(
reviews.isSuccess ? reviews.data[0] : undefined,
const [selectedRole, setSelectedRole] = useState<RoleType | undefined>(
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 (
<>
<SearchFilter search={searchParams?.search} {...validationResult.data} />
{reviews.isSuccess && reviews.data.length > 0 && (
<div className="mb-8 grid h-[70dvh] w-4/5 grid-cols-5 gap-4 lg:w-3/4">
<div className="col-span-2 gap-3 overflow-scroll pr-4">
{reviews.data.map((review, i) => {
{roles.isSuccess && roles.data.length > 0 && (
<div className="flex h-[100dvh] w-[95%] gap-4 divide-x divide-[#474747] pl-4 pr-4 lg:w-[95%]">
<div className="w-[28%] gap-3">
{roles.data.map((role, i) => {
return (
<div key={review.id} onClick={() => setSelectedReview(review)}>
<ReviewCardPreview
reviewObj={review}
<div key={role.id} onClick={() => setSelectedRole(role)}>
<RoleCardPreview
reviewObj={role}
className={cn(
"mb-4 hover:border-2",
selectedReview
? selectedReview.id === review.id &&
"border-2 bg-cooper-gray-100"
: !i && "border-2 bg-cooper-gray-100",
"mb-4 hover:bg-cooper-gray-100",
selectedRole
? selectedRole.id === role.id && "bg-cooper-gray-200"
: !i && "bg-cooper-gray-200",
)}
/>
</div>
);
})}
</div>
<div className="col-span-3 overflow-scroll">
{reviews.data.length > 0 && reviews.data[0] && (
<ReviewCard reviewObj={selectedReview ?? reviews.data[0]} />
<div className="col-span-3 w-[72%] overflow-auto p-1">
{roles.data.length > 0 && roles.data[0] && (
<RoleInfo roleObj={selectedRole ?? roles.data[0]} />
)}
</div>
</div>
)}
{reviews.isSuccess && reviews.data.length === 0 && <NoResults />}
{reviews.isPending && <LoadingResults />}
{roles.isSuccess && roles.data.length === 0 && <NoResults />}
{roles.isPending && <LoadingResults />}
</>
);
}
12 changes: 10 additions & 2 deletions apps/web/src/app/_components/combo-box.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ interface ComboBoxProps {
valuesAndLabels: ComboBoxOption<string>[];
currLabel: string;
onSelect: (option: string) => void;
triggerClassName?: string;
}

/**
Expand All @@ -39,17 +40,24 @@ export default function ComboBox({
valuesAndLabels,
currLabel,
onSelect,
triggerClassName,
}: ComboBoxProps) {
const [isOpen, setIsOpen] = useState(false);

return (
<Popover open={isOpen} onOpenChange={setIsOpen}>
<PopoverTrigger asChild className="min-w-[400px]">
<PopoverTrigger
asChild
className={cn(
"w-[400px] overflow-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
triggerClassName,
)}
>
<Button
variant="outline"
role="combobox"
aria-expanded={isOpen}
className="w-[180px] justify-between"
className="justify-between"
>
{defaultLabel}
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/_components/form/rating.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export const Rating = forwardRef<HTMLInputElement, RatingProps>(
"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)}
Expand Down
Loading

0 comments on commit 9909b9e

Please sign in to comment.