From f2d2da6de16757f852903ccc8967cd24cfca3e6a Mon Sep 17 00:00:00 2001 From: ketphan02 Date: Mon, 13 May 2024 19:01:35 -0700 Subject: [PATCH 1/4] stash --- .../(components)/ProjectRequirementsTable.tsx | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx diff --git a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx new file mode 100644 index 0000000..71b2daa --- /dev/null +++ b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx @@ -0,0 +1,32 @@ +'use client' + +import {DataTable} from "@/components/ui/data-table" +import {ProjectRequirement} from "@/_temp_types/projects" +import {ColumnDef} from "@tanstack/react-table" +import {DataTableColumnHeader} from "@/components/ui/data-table-column-header" + +const persistedColumnDefs: ColumnDef[] = [ + { + accessorKey: "attribute", + header: ({column}) => ( + + ), + }, + { + accessorKey: "operator", + header: "Operator", + }, + { + accessorKey: "value", + header: "Value", + }, +] + +export const ProjectRequirementsTable = () => { + const columns = [] + + return + columns={columns} + data={currentProject?.requirements ?? []} + /> +} From 684e5d2d98fc077ba68ae5fc7def2ccb073a4132 Mon Sep 17 00:00:00 2001 From: ketphan02 Date: Mon, 13 May 2024 19:04:20 -0700 Subject: [PATCH 2/4] Remove duplicate components --- .../[courseId]/students/(table)/columns.tsx | 2 +- src/components/ui/table-column-header.tsx | 95 ---------------- src/components/ui/table-pagination.tsx | 102 ------------------ 3 files changed, 1 insertion(+), 198 deletions(-) delete mode 100644 src/components/ui/table-column-header.tsx delete mode 100644 src/components/ui/table-pagination.tsx diff --git a/src/app/(app)/course/[courseId]/students/(table)/columns.tsx b/src/app/(app)/course/[courseId]/students/(table)/columns.tsx index 7f12853..c2bc01d 100644 --- a/src/app/(app)/course/[courseId]/students/(table)/columns.tsx +++ b/src/app/(app)/course/[courseId]/students/(table)/columns.tsx @@ -4,7 +4,7 @@ import { Student } from "@/_temp_types/student" import { ColumnDef } from "@tanstack/react-table" import { Text } from "@/components/ui/text" import { Badge } from "@/components/ui/badge" -import { DataTableColumnHeader } from "@/components/ui/table-column-header" +import { DataTableColumnHeader } from "@/components/ui/data-table-column-header" type SectionFilterValue = string[]; diff --git a/src/components/ui/table-column-header.tsx b/src/components/ui/table-column-header.tsx deleted file mode 100644 index 364a55a..0000000 --- a/src/components/ui/table-column-header.tsx +++ /dev/null @@ -1,95 +0,0 @@ -"use client" - -import { - ArrowDownIcon, - ArrowUpIcon, - CaretSortIcon, - ResetIcon, -} from "@radix-ui/react-icons" -import { Column } from "@tanstack/react-table" - -import { Button } from "@/components/ui/button" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu" - -import { cn } from "@/lib/utils" -import React from "react" - -interface DataTableColumnHeaderProps - extends React.HTMLAttributes { - column: Column; - title: string; - hasDropDownMenu?: boolean; -} - -export function DataTableColumnHeader({ - column, - title, - className, - hasDropDownMenu = true, -}: DataTableColumnHeaderProps) { - if (!column.getCanSort()) { - return
{title}
- } - - return ( -
- {hasDropDownMenu ? ( - - - - - - column.toggleSorting(false)}> - - Asc - - column.toggleSorting(true)}> - - Desc - - - column.clearSorting()}> - - Reset - - - - ) : ( - - )} -
- ) -} diff --git a/src/components/ui/table-pagination.tsx b/src/components/ui/table-pagination.tsx deleted file mode 100644 index 006787b..0000000 --- a/src/components/ui/table-pagination.tsx +++ /dev/null @@ -1,102 +0,0 @@ -"use client" - -import { - ChevronLeftIcon, - ChevronRightIcon, - DoubleArrowLeftIcon, - DoubleArrowRightIcon, -} from "@radix-ui/react-icons" -import { Table } from "@tanstack/react-table" - -import { Button } from "@/components/ui/button" -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select" -import { Text } from "./text" - -interface DataTablePaginationProps { - table: Table; -} - -export function DataTablePagination({ - table, -}: DataTablePaginationProps) { - return ( -
-
- {table.getFilteredSelectedRowModel().rows.length} of{" "} - {table.getFilteredRowModel().rows.length} row(s) selected. -
-
-
- - Row per page - - -
- - Page {table.getState().pagination.pageIndex + 1} of{" "} - {table.getPageCount()} - -
- - - - -
-
-
- ) -} From 74bdf8aef98eaf6190db2681c107072f66893a22 Mon Sep 17 00:00:00 2001 From: ketphan02 Date: Mon, 13 May 2024 19:16:29 -0700 Subject: [PATCH 3/4] Add current project --- .../(components)/ProjectRequirementsTable.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx index 71b2daa..21b90cf 100644 --- a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx +++ b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx @@ -4,6 +4,9 @@ import {DataTable} from "@/components/ui/data-table" import {ProjectRequirement} from "@/_temp_types/projects" import {ColumnDef} from "@tanstack/react-table" import {DataTableColumnHeader} from "@/components/ui/data-table-column-header" +import { + useProjectsContext, +} from "@/app/(app)/course/[courseId]/project-sets/[projectSetId]/(hooks)" const persistedColumnDefs: ColumnDef[] = [ { @@ -23,7 +26,9 @@ const persistedColumnDefs: ColumnDef[] = [ ] export const ProjectRequirementsTable = () => { - const columns = [] + const columns = persistedColumnDefs + + const {currentProject} = useProjectsContext() return columns={columns} From 6a23b503deb4c6d81bedc38975331fb5d9010b76 Mon Sep 17 00:00:00 2001 From: ketphan02 Date: Mon, 13 May 2024 20:23:07 -0700 Subject: [PATCH 4/4] Complete --- src/_temp_types/projects.ts | 5 +- .../(components)/ProjectRequirementsTable.tsx | 81 +++++++++++++++++-- .../[projectSetId]/(components)/index.tsx | 1 + .../project-sets/[projectSetId]/page.tsx | 9 ++- 4 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/_temp_types/projects.ts b/src/_temp_types/projects.ts index e5619bd..a10dfb3 100644 --- a/src/_temp_types/projects.ts +++ b/src/_temp_types/projects.ts @@ -5,7 +5,7 @@ export type ProjectRequirement = { attribute: number; operator: RequirementOperator; // The number of students with this attribute required as described by the RequirementOperator - value: number; + subject: number; }; export enum RequirementOperator { @@ -25,8 +25,7 @@ export enum RequirementOperator { export type Project = { id: number; name: string; - // Specifies the number of teams that can work on this project - numberOfTeams: number; + number_of_teams: number; // Specifies the number of teams that can work on this project requirements?: ProjectRequirement[]; }; diff --git a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx index 21b90cf..cca0bb7 100644 --- a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx +++ b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/ProjectRequirementsTable.tsx @@ -1,12 +1,17 @@ 'use client' import {DataTable} from "@/components/ui/data-table" -import {ProjectRequirement} from "@/_temp_types/projects" +import {Text} from "@/components/ui/text" +import {ProjectRequirement, RequirementOperator} from "@/_temp_types/projects" import {ColumnDef} from "@tanstack/react-table" import {DataTableColumnHeader} from "@/components/ui/data-table-column-header" import { useProjectsContext, } from "@/app/(app)/course/[courseId]/project-sets/[projectSetId]/(hooks)" +import {toast} from "@/hooks/use-toast" +import {Button} from "@/components/ui/button" +import {useState} from "react" +import {Pencil1Icon, ExitIcon} from "@radix-ui/react-icons" const persistedColumnDefs: ColumnDef[] = [ { @@ -18,9 +23,21 @@ const persistedColumnDefs: ColumnDef[] = [ { accessorKey: "operator", header: "Operator", + cell: ({row}) => { + const operator = row.original.operator + // Check if operator is a valid RequirementOperator + if (!Object.keys(RequirementOperator).includes(operator as RequirementOperator)) { + toast({ + title: `Invalid operator "${operator}" in Project Requirement.`, + variant: "destructive", + }) + return null + } + return RequirementOperator[operator as string as keyof typeof RequirementOperator] + }, }, { - accessorKey: "value", + accessorKey: "subject", header: "Value", }, ] @@ -29,9 +46,61 @@ export const ProjectRequirementsTable = () => { const columns = persistedColumnDefs const {currentProject} = useProjectsContext() + // TODO: Implement edit mode + const [isEditing, setIsEditing] = useState(false) - return - columns={columns} - data={currentProject?.requirements ?? []} - /> + + // TODO: Implement conversion of Attribute and Attribute Value. + return ( +
+ {currentProject ? <> +
+
+ + {currentProject.name} + +
+ {/* TODO: Implement edit mode */} + +
+
+
+ {/* TODO: Implement edit mode */} + + This project can be completed + by {currentProject.number_of_teams} team{currentProject.number_of_teams > 1 && 's'}. + +
+
+
+
+ + Requirements + + {isEditing && } +
+
+ + columns={columns} + data={currentProject?.requirements ?? []} + /> +
+
+ : ( +
+ No project found. +
+ )} +
) } diff --git a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/index.tsx b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/index.tsx index 876473e..2c687cd 100644 --- a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/index.tsx +++ b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/(components)/index.tsx @@ -1,3 +1,4 @@ export {ProjectSetSelect, type ProjectSetSelectProps} from './ProjectSetSelect' export {SidebarProjectList} from './SidebarProjectList' +export {ProjectRequirementsTable} from './ProjectRequirementsTable' export {ProjectSetSidebar} from './ProjectSetSidebar' diff --git a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/page.tsx b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/page.tsx index c6e177d..9fc6cd8 100644 --- a/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/page.tsx +++ b/src/app/(app)/course/[courseId]/project-sets/[projectSetId]/page.tsx @@ -2,6 +2,7 @@ import {toast} from "@/hooks/use-toast" import {type ApiTeamSetTemplate} from "@/_temp_types/api/teams" import PageView from "@/components/views/Page" import { + ProjectRequirementsTable, ProjectSetSidebar, } from "./(components)" import {ProjectsProvider, ProjectSearchProvider} from "./(hooks)" @@ -38,7 +39,13 @@ const ProjectSetPage = async ({params: {courseId, projectSetId}}: ProjectPageTyp > - +
+
+ +
+ +
+