From 26d72484163a3635b6108a16ae153a556ea8a34c Mon Sep 17 00:00:00 2001 From: andrewzpu <66804382+andrewzpu@users.noreply.github.com> Date: Wed, 8 May 2024 11:50:13 -0700 Subject: [PATCH] Added program edit popup and "no programs" message (#97) * Added program edit popup and "no programs" message * Fixed add button display * Reorganized ProgramFormButton to take take any component * Removed start and end date from card --- frontend/public/programs/EditIcon.png | Bin 0 -> 938 bytes frontend/public/programs/Empty.png | Bin 0 -> 15312 bytes frontend/src/components/ProgramCard.tsx | 162 +++++++++++++----- frontend/src/components/ProgramFormButton.tsx | 47 +---- frontend/src/pages/programs.tsx | 60 +++++-- 5 files changed, 177 insertions(+), 92 deletions(-) create mode 100644 frontend/public/programs/EditIcon.png create mode 100644 frontend/public/programs/Empty.png diff --git a/frontend/public/programs/EditIcon.png b/frontend/public/programs/EditIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..4b349aecf7ddb32632a2eafffbbde5fa293c8f65 GIT binary patch literal 938 zcmV;b16BNqP)1^@s6!#`+F00009a7bBm001mY z001mY0i`{bsQ>@~0drDELIAGL9O(c600d`2O+f$vv5yPpk^IYBrAE@C^4 zHv27ue=YQ4|F!z+uhk45TvRGw(eE$T zecXHrM@JvPJU8IzoL6xVgTXxP6gEu8aZW-65H)~}dAV9h8H1A`D#rdumY#JB}?;mf_)DC1h6-3?Q4J~hSml&B(n zFhc_M0w|5ec6jjR*>QOhSAIM7mmmbN-ral4>cTm^cvenIgw^-ktG9%w0`6%?7r{=0 zx=4M;3Bdv$;$kq|_xWs143flPi68;zy`Ynnpd)euh&mdL8Ya^pkM>R`3pC!*J_{cE zhT-|=u#@PQ1bG1u@lS*#dL<#A0Kz{JlISBLzJL|6Md;BxBp0xvjTmGvL7f1IULXe9 zHjJtTgmi;pWG6ur0Yo+uG!j6hFF`W_M7k0*6hNdWK~n)lIubM%Kx|&Za?0C=64VPI zHY>pZ0mSAc7$Sh!j0A%O5b7luCV)^Y!9W4T4pgC3fVIz8id>|Gnj|O}FmRC~$t4&r zKzu8bkOKikyf&fRt>WgI1hk-p>;#B!M^s3_znii6SGSslwaP_Rjsg8^DVy}hQD zqb~0rtH?X_1TFKieUzS)vg?)i-rCfQ* zCs4McC3Hi%{oCRaSpM69Fg$Bvi_zdVW7{*E4~H-L%S&t}%O~Xi1N@tXf6_3Pk^lez M07*qoM6N<$f*hQQfdBvi literal 0 HcmV?d00001 diff --git a/frontend/public/programs/Empty.png b/frontend/public/programs/Empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7424257d630de6eb2107caf35cd9252b0203f231 GIT binary patch literal 15312 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 Rjs3q1igGHlRc}qd{4c>; }; -function processDate(startString: Date): string { - const startDate = new Date(startString); +// function checkOffscreen(id: string) { +// const elem = document.getElementById("edit" + id); +// if (elem === null) { +// return; +// } - const options = { - year: "numeric", - month: "short", - day: "numeric", - } as const; +// const bounding = elem.getBoundingClientRect(); - return "Started " + startDate.toLocaleDateString("en-US", options); +// console.log(bounding.right); +// console.log(window.innerWidth); +// console.log(document.documentElement.clientWidth); + +// return bounding.right + 26 - (window.innerWidth || document.documentElement.clientWidth); +// } + +function toggleEdit(id: string) { + const editId = "edit" + id; + console.log(editId); + const editButton = document.getElementById(editId); + if (editButton === null) { + console.log("error"); + return; + } + + if (editButton.style.display !== "block") { + editButton.style.display = "block"; + } else { + editButton.style.display = "none"; + } + + // if (checkOffscreen(id) > 0) { + // editButton.style.right = "0px"; + // } } export function ProgramCard({ program, isAdmin, className, setPrograms }: CardProps) { const { isTablet } = useWindowSize(); + const editId = "edit" + program._id; + const optionsId = "option" + program._id; + + const optionsButton = document.getElementById(optionsId); + if (optionsButton !== null) { + optionsButton.onclick = function () { + toggleEdit(program._id); + }; + } + + let editClass = "absolute right-2 hidden"; let outerDivClass = "text-white grow overflow-hidden tracking-wide leading-6"; let topDivClass = "flex flex-row"; let botDivClass = "text-black bg-white"; @@ -40,11 +74,13 @@ export function ProgramCard({ program, isAdmin, className, setPrograms }: CardPr let titleClass; let optionsDiv = "grow"; const optionsClass = "relative float-right hover:cursor-pointer"; - let dateClass; let numClass; let numTextClass; let iconClass = "relative"; + let optionsHeight = 18; + let optionsWidth = 16; + const programFields: Program = { _id: program._id, name: program.name, @@ -61,25 +97,27 @@ export function ProgramCard({ program, isAdmin, className, setPrograms }: CardPr }; if (isTablet) { + editClass += " top-7 w-12 h-5 text-[10px]"; outerDivClass += " rounded-lg h-36"; topDivClass += " h-20"; botDivClass += " h-16"; typeClass = cn("uppercase relative text-[10px] top-2 left-3", poppins.className); titleClass = cn("capitalize relative text-sm top-2 left-3 font-bold", poppins.className); optionsDiv += " pr-[8px] pt-[12px]"; - dateClass = cn("relative text-[10px] top-2 left-3", poppins.className); + optionsHeight /= 2; + optionsWidth /= 2; numClass = "h-5 gap-x-1.5 flex flex-row relative top-2 left-3"; numTextClass = cn("text-[10px]", poppins.className); iconClass = "h-2 w-3 mt-[7px]"; } else { + editClass += " top-12 w-24 h-8"; outerDivClass += " rounded-2xl h-68"; topDivClass += " h-36"; botDivClass += " h-32"; typeClass = cn("uppercase relative text-sm top-5 left-7", poppins.className); titleClass = cn("capitalize relative text-3xl top-8 left-7 font-bold", poppins.className); optionsDiv += " pr-[16px] pt-[24px]"; - dateClass = cn("relative text-base top-5 left-7", poppins.className); - numClass = "h-8 gap-x-1.5 flex flex-row relative top-14 left-7"; + numClass = "h-8 gap-x-1.5 flex flex-row relative top-5 left-7"; numTextClass = cn("text-base", poppins.className); iconClass = "h-3 w-[18px] mt-[5px]"; } @@ -88,37 +126,83 @@ export function ProgramCard({ program, isAdmin, className, setPrograms }: CardPr outerDivClass = cn(outerDivClass, className); } + let buttonClass = "relative flex h-full w-full flex-row rounded bg-white"; + let iconHeight = 16; + let iconWidth = 16; + let imageClass = "absolute"; + let editTextClass = "absolute text-pia_dark_green"; + + if (isTablet) { + iconHeight = 10; + iconWidth = 10; + buttonClass += " py-[3px]"; + imageClass += " left-[7px] top-[5px]"; + editTextClass += " right-[7px]"; + } else { + buttonClass += " py-1"; + imageClass += " left-2.5 top-2"; + editTextClass += " left-0 w-full"; + } + + const editButton: React.JSX.Element = ( + + ); + return ( -
-
-
-

{program.type} Program

-

{program.name}

-
- {isAdmin && ( -
-
- -
-
- )} +
+
+
-
-

{processDate(program.startDate)}

-
- students - {program.students.length === 0 &&

No Students

} - {program.students.length === 1 &&

1 Student

} - {program.students.length > 1 && ( -

{program.students.length} Students

+
+
+
+

{program.type} Program

+

{program.name}

+
+ {isAdmin && ( +
+ options +
)}
+
+
+ students + {program.students.length === 0 &&

No Students

} + {program.students.length === 1 &&

1 Student

} + {program.students.length > 1 && ( +

{program.students.length} Students

+ )} +
+
); diff --git a/frontend/src/components/ProgramFormButton.tsx b/frontend/src/components/ProgramFormButton.tsx index 6be94b75..d6ab5fe8 100644 --- a/frontend/src/components/ProgramFormButton.tsx +++ b/frontend/src/components/ProgramFormButton.tsx @@ -1,4 +1,3 @@ -import Image from "next/image"; import { useMemo, useState } from "react"; import { SubmitHandler, useForm } from "react-hook-form"; @@ -17,6 +16,7 @@ import { Dialog, DialogClose, DialogContent, DialogContentSlide, DialogTrigger } type BaseProperties = { classname?: string; + component: React.JSX.Element; setPrograms: React.Dispatch>; }; @@ -34,6 +34,7 @@ type ProgramFormProperties = EditProperties | AddProperties; export default function ProgramFormButton({ type = "edit", + component =

Please add a component

, data = null, setPrograms, classname, @@ -117,27 +118,7 @@ export default function ProgramFormButton({ return !isMobile ? ( <> - {type === "add" && ( - - + ); + return (

Programs

- {isAdmin && } + {isAdmin && ( + + )} {/* Should be replaced with Add Button when created */}
-
- {Object.values(programs).map((program) => ( -
- + {Object.keys(programs).length === 0 && ( +
+
+ empty
- ))} -
+
+ )} + {Object.keys(programs).length > 0 && ( +
+ {Object.values(programs).map((program) => ( +
+ +
+ ))} +
+ )}
); }