diff --git a/compass/components/Drawer/CreateDrawer.tsx b/compass/components/Drawer/CreateDrawer.tsx new file mode 100644 index 0000000..0507e0c --- /dev/null +++ b/compass/components/Drawer/CreateDrawer.tsx @@ -0,0 +1,200 @@ +import { Dispatch, FunctionComponent, ReactNode, SetStateAction } from "react"; +import React, { useState } from "react"; +import { ChevronDoubleLeftIcon } from "@heroicons/react/24/solid"; +import { + ArrowsPointingOutIcon, + ArrowsPointingInIcon, +} from "@heroicons/react/24/outline"; +import TagsInput from "../TagsInput/Index"; +import { Details } from "./Drawer"; + +type CreateDrawerProps = { + details: Details[]; + onCreate: (newItem: any) => boolean; +}; + +const CreateDrawer: FunctionComponent = ({ + details, + onCreate, +}: CreateDrawerProps) => { + const [isOpen, setIsOpen] = useState(false); + const [isFull, setIsFull] = useState(false); + const [newItemContent, setNewItemContent] = useState({}); + const [renderKey, setRenderKey] = useState(0); + + const handleContentChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; + console.log(newItemContent); + console.log(Object.keys(newItemContent).length); + setNewItemContent((prev: any) => ({ + ...prev, + [name]: value, + })); + }; + + const initializeSelectField = (key: string) => { + if (!newItemContent[key]) { + setNewItemContent((prev: any) => ({ + ...prev, + [key]: [], + })); + } + }; + + const handleCreate = () => { + if (onCreate(newItemContent)) { + setNewItemContent({}); + setIsOpen(false); + } + }; + + const toggleDrawer = () => { + setIsOpen(!isOpen); + if (isFull) { + setIsFull(!isFull); + } + if (!isOpen) { + setRenderKey((prev) => prev + 1); + } + }; + + const toggleDrawerFullScreen = () => setIsFull(!isFull); + + const drawerClassName = `fixed top-0 right-0 h-full bg-white transform ease-in-out duration-300 z-20 overflow-y-auto ${ + isOpen ? "translate-x-0 shadow-2xl" : "translate-x-full" + } ${isFull ? "w-full" : "w-[600px]"}`; + + const iconComponent = isFull ? ( + + ) : ( + + ); + + return ( +
+ +
+
+

+ Create New Item +

+
+ + +
+
+
+
+ {details.map((detail, index) => { + const value = newItemContent[detail.key] || ""; + let inputField; + + switch (detail.inputType) { + case "select-one": + case "select-multiple": + initializeSelectField(detail.key); + inputField = ( + {}) + } + onTagsChange={( + tags: Set + ) => { + setNewItemContent( + (prev: any) => ({ + ...prev, + [detail.key]: + Array.from(tags), + }) + ); + }} + /> + ); + break; + case "textarea": + inputField = ( +