diff --git a/app/src/components/layout/sidebarLeft/Outline.tsx b/app/src/components/layout/sidebarLeft/Outline.tsx index d292517..d0bb3f8 100644 --- a/app/src/components/layout/sidebarLeft/Outline.tsx +++ b/app/src/components/layout/sidebarLeft/Outline.tsx @@ -99,7 +99,7 @@ const Outline: React.FC = () => { */}
{/* setIsBuildingsOpen((prev) => !prev)} showKebabMenu={false} showAddIcon={false} /> */} - +
)} diff --git a/app/src/components/ui/list/DropDownList.tsx b/app/src/components/ui/list/DropDownList.tsx index 776672a..7b37ea6 100644 --- a/app/src/components/ui/list/DropDownList.tsx +++ b/app/src/components/ui/list/DropDownList.tsx @@ -5,7 +5,6 @@ import List from "./OutlineList/ListNew"; interface DropDownListProps { header?: string; - type?: "Zones" | "Assets"; items?: { id: string; name: string }[]; showFocusIcon?: boolean; onFocusClick?: () => void; @@ -21,7 +20,6 @@ interface DropDownListProps { const DropDownList: React.FC = ({ header = "Dropdown", items = [], - type = "Assets", showFocusIcon = false, onFocusClick, showAddIcon = true, diff --git a/app/src/components/ui/list/KebebMenuList.tsx b/app/src/components/ui/list/KebebMenuList.tsx index 0e45ed0..a9a97c2 100644 --- a/app/src/components/ui/list/KebebMenuList.tsx +++ b/app/src/components/ui/list/KebebMenuList.tsx @@ -2,44 +2,40 @@ import React, { useState } from "react"; import { KebebIcon } from "../../icons/ExportCommonIcons"; interface KebabMenuListProps { - items: string[]; // Array of menu items - onSelect?: (item: string) => void; // Callback when a menu item is selected + items: string[]; // Array of menu items + onSelect?: (item: string) => void; // Callback when a menu item is selected } const KebabMenuList: React.FC = ({ items, onSelect }) => { - const [isOpen, setIsOpen] = useState(false); + const [isOpen, setIsOpen] = useState(false); - const handleToggle = () => { - setIsOpen((prev) => !prev); - }; + const handleToggle = () => { + setIsOpen((prev) => !prev); + }; - const handleItemClick = (item: string) => { - if (onSelect) { - onSelect(item); - } - setIsOpen(false); // Close menu after selection - }; + const handleItemClick = (item: string) => { + if (onSelect) { + onSelect(item); + } + setIsOpen(false); // Close menu after selection + }; - return ( -
-
- -
- {isOpen && ( -
- {items.map((item, index) => ( -
handleItemClick(item)} - > - {item} + return ( +
+
+
- ))} + {isOpen && ( +
+ {items.map((item, index) => ( +
handleItemClick(item)}> + {item} +
+ ))} +
+ )}
- )} -
- ); + ); }; export default KebabMenuList; diff --git a/app/src/components/ui/list/KebebMenuListMultiSelect.tsx b/app/src/components/ui/list/KebebMenuListMultiSelect.tsx index 5f28e7f..8843da2 100644 --- a/app/src/components/ui/list/KebebMenuListMultiSelect.tsx +++ b/app/src/components/ui/list/KebebMenuListMultiSelect.tsx @@ -2,81 +2,66 @@ import React, { useEffect, useRef, useState } from "react"; import { KebebIcon, TickIcon } from "../../icons/ExportCommonIcons"; interface KebabMenuListMultiSelectProps { - items: { id: string; name: string }[]; // Array of menu items with id and name - onSelectionChange?: (selectedItems: string[]) => void; // Callback for selected items + items: { id: string; name: string }[]; // Array of menu items with id and name + onSelectionChange?: (selectedItems: string[]) => void; // Callback for selected items } -const KebabMenuListMultiSelect: React.FC = ({ - items, - onSelectionChange, -}) => { - const [isOpen, setIsOpen] = useState(false); - const [selectedItems, setSelectedItems] = useState([]); - const menuRef = useRef(null); // Ref to track the container +const KebabMenuListMultiSelect: React.FC = ({ items, onSelectionChange }) => { + const [isOpen, setIsOpen] = useState(false); + const [selectedItems, setSelectedItems] = useState([]); + const menuRef = useRef(null); // Ref to track the container - const handleToggle = () => { - setIsOpen((prev) => !prev); - }; - - const handleItemToggle = (id: string) => { - setSelectedItems((prevSelected) => { - const isAlreadySelected = prevSelected.includes(id); - const updatedSelection = isAlreadySelected - ? prevSelected.filter((item) => item !== id) // Deselect if already selected - : [...prevSelected, id]; // Add to selection if not selected - - if (onSelectionChange) { - onSelectionChange(updatedSelection); - } - - return updatedSelection; - }); - }; - - // Close menu if clicked outside - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if (menuRef.current && !menuRef.current.contains(event.target as Node)) { - setIsOpen(false); - } + const handleToggle = () => { + setIsOpen((prev) => !prev); }; - document.addEventListener("mousedown", handleClickOutside); - return () => { - document.removeEventListener("mousedown", handleClickOutside); - }; - }, []); + const handleItemToggle = (id: string) => { + setSelectedItems((prevSelected) => { + const isAlreadySelected = prevSelected.includes(id); + const updatedSelection = isAlreadySelected + ? prevSelected.filter((item) => item !== id) // Deselect if already selected + : [...prevSelected, id]; // Add to selection if not selected - return ( -
-
- -
- {isOpen && ( -
- {items.map((item) => ( -
handleItemToggle(item.id)} - > - handleItemToggle(item.id)} - /> -
- {selectedItems.includes(item.id) && } -
- {item.name} + if (onSelectionChange) { + onSelectionChange(updatedSelection); + } + + return updatedSelection; + }); + }; + + // Close menu if clicked outside + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (menuRef.current && !menuRef.current.contains(event.target as Node)) { + setIsOpen(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + + return ( +
+
+
- ))} + {isOpen && ( +
+ {items.map((item) => ( +
handleItemToggle(item.id)}> + handleItemToggle(item.id)} /> +
{selectedItems.includes(item.id) && }
+ {item.name} +
+ ))} +
+ )}
- )} -
- ); + ); }; export default KebabMenuListMultiSelect; diff --git a/app/src/types/uiTypes.d.ts b/app/src/types/uiTypes.d.ts index 92fa7b0..500b72e 100644 --- a/app/src/types/uiTypes.d.ts +++ b/app/src/types/uiTypes.d.ts @@ -78,3 +78,60 @@ interface Tutorial { thumbnail?: string; createdAt: string; } + +// Base interface for all list items +interface BaseListItem { + id: string; + name: string; + type: "zone" | "asset" | "wall" | "floor" | "point" | "decal"; + isLocked?: boolean; + isVisible?: boolean; + isActive?: boolean; + canEdit?: boolean; + children?: ListItem[]; // For nested relationships + metadata?: { + position?: [number, number, number]; + rotation?: [number, number, number]; + scale?: [number, number, number]; + color?: string; + height?: number; + thickness?: number; + // ... other type-specific properties + }; +} + +// Extended interfaces for specific types +interface ZoneListItem extends BaseListItem { + type: "zone"; + metadata: { + zoneHeight: number; + zoneColor: string; + viewPortPosition: [number, number, number]; + viewPortTarget: [number, number, number]; + }; +} + +interface AssetListItem extends BaseListItem { + type: "asset"; + metadata: { + modelUuid: string; + position: [number, number, number]; + rotation: [number, number, number]; + scale: [number, number, number]; + isCollidable: boolean; + opacity: number; + animations?: string[]; + }; +} + +interface WallListItem extends BaseListItem { + type: "wall"; + metadata: { + wallThickness: number; + wallHeight: number; + outsideMaterial: string; + insideMaterial: string; + }; +} + +type ListItem = ZoneListItem | AssetListItem | WallListItem | BaseListItem;