diff --git a/src/app/components/portfolio/AddNew.tsx b/src/app/components/portfolio/AddNew.tsx index f036824f..e8f28ecc 100644 --- a/src/app/components/portfolio/AddNew.tsx +++ b/src/app/components/portfolio/AddNew.tsx @@ -41,15 +41,19 @@ ListItem.displayName = "ListItem"; export default function AddNewDropDown({ portfolioId, + isUploadCsvOpen, + setIsUploadCsvOpen, }: { portfolioId: number; + isUploadCsvOpen: boolean; + setIsUploadCsvOpen: React.Dispatch>; }) { function handleCickAddUnit() { console.log("Add unit"); } function handleClickUploadCSV() { - console.log("Upload csv"); + setIsUploadCsvOpen(!isUploadCsvOpen); } return ( diff --git a/src/app/components/portfolio/Toolbar.tsx b/src/app/components/portfolio/Toolbar.tsx index b2575dcb..936e794f 100644 --- a/src/app/components/portfolio/Toolbar.tsx +++ b/src/app/components/portfolio/Toolbar.tsx @@ -8,6 +8,8 @@ import { } from "@/app/shadcn_components/ui/navigation-menu"; import AddNewDropDown from "./AddNew"; import { cva } from "class-variance-authority"; +import UploadCsvModal from "./UploadCsvModal"; +import { useState } from "react"; interface ToolbarProps { portfolioId: number; @@ -21,6 +23,9 @@ export function Toolbar({ portfolioId }: ToolbarProps) { function handleClickSettings() { console.log("Settings were clicked, implement me"); } + + const [modalIsOpen, setModalIsOpen] = useState(false); + return ( @@ -31,8 +36,13 @@ export function Toolbar({ portfolioId }: ToolbarProps) { Settings - + + ); } diff --git a/src/app/components/portfolio/UploadCsvModal.tsx b/src/app/components/portfolio/UploadCsvModal.tsx new file mode 100644 index 00000000..181783a1 --- /dev/null +++ b/src/app/components/portfolio/UploadCsvModal.tsx @@ -0,0 +1,156 @@ +import { Dialog, Transition } from "@headlessui/react"; +import { Fragment, useState } from "react"; + +import ModalSubmit from "@/app/components/home/ModalSubmit"; +import { PortfolioGoal } from "@/app/db/schema/portfolio"; + +// Mock Icon component +interface IconProps { + name: string; + selected: boolean; + onSelect: (name: string) => void; + className?: string; +} + +const hiddenInputArrows = + "[-moz-appearance:_textfield] [&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none"; + +export default function UploadCsvModal({ + isOpen = false, + setIsOpen, +}: { + isOpen?: boolean; + setIsOpen: (isOpen: boolean) => void; +}) { + const [portfolioName, setPortfolioName] = useState(""); + const [budget, setBudget] = useState(undefined); + const [selectedOutcome, setSelectedOutcome] = + useState("Nothing Specific"); + const [buttonDisabled, setButtonDisabled] = useState(true); + + function closeModal() { + setIsOpen(false); + } + + function handlePortfolioNameChange(e: React.ChangeEvent) { + if (e.target.value.length > 0) { + setButtonDisabled(false); + } else { + setButtonDisabled(true); + } + setPortfolioName(e.target.value); + } + + return ( + <> + + + +
+ + +
+
+ + + + Upload a CSV of properties + +
+
+ + handlePortfolioNameChange(e)} + className="p-2 border border-gray-200 rounded-md focus:outline-none bg-gray-100" + /> +
+
+ +
+ £ + setBudget(Number(e.target.value))} + onKeyDown={(e) => + (e.key === "e" || e.key === "E") && + e.preventDefault() + } + className={[ + "flex-1 p-2 bg-gray-100 focus:outline-none", + hiddenInputArrows, + ].join(" ")} + /> +
+
+
+ + Select Outcome: + +
"Fill me in"
+
+
+ +
+ + +
+
+
+
+
+
+
+ + ); +} diff --git a/src/app/portfolio/[slug]/page.tsx b/src/app/portfolio/[slug]/page.tsx index e462bf9d..934ddcbd 100644 --- a/src/app/portfolio/[slug]/page.tsx +++ b/src/app/portfolio/[slug]/page.tsx @@ -27,7 +27,7 @@ function EmptyPropertyState() {

- Click on Add new to start adding properties to your Portfolio + Hover over "Add new" to start adding properties to your Portfolio

@@ -156,7 +156,7 @@ function SummaryBox({ const energySavingsFormatted = formatKwh(energySavings); return ( -
+

Portfolio Summary