From 251222167d2ef607c80fd27b2036c4346afd768e Mon Sep 17 00:00:00 2001 From: Prajwal Moharana <78167757+pmoharana-cmd@users.noreply.github.com> Date: Sat, 4 Jan 2025 13:34:26 -0500 Subject: [PATCH] New btn moharana (#51) * Implement 'Create New' button and fix no tags bug * Implement local state editting when creating new element * Add defaults when no tags * Reset tags whenever new item is created --- compass/components/Drawer/CreateDrawer.tsx | 200 +++++++++++++++++++ compass/components/Table/ResourceTable.tsx | 15 +- compass/components/Table/ServiceTable.tsx | 25 ++- compass/components/Table/Table.tsx | 106 ++++++---- compass/components/Table/UserTable.tsx | 27 ++- compass/components/TagsInput/Index.tsx | 19 +- compass/components/TagsInput/TagDropdown.tsx | 34 ++-- compass/components/TagsInput/TagsArray.tsx | 32 +-- 8 files changed, 374 insertions(+), 84 deletions(-) create mode 100644 compass/components/Drawer/CreateDrawer.tsx 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 = ( +