Implement rename mode functionality and integrate RenameTooltip component; update state management for renaming and mouse interactions in FloorGroup and Project components.

This commit is contained in:
Poovizhi99 2025-05-29 14:29:53 +05:30
parent c0fed911eb
commit c77abff424
6 changed files with 87 additions and 22 deletions

View File

@ -4,6 +4,7 @@ import {
useLeftData, useLeftData,
useTopData, useTopData,
} from "../../../store/visualization/useZone3DWidgetStore"; } from "../../../store/visualization/useZone3DWidgetStore";
import { useRenameModeStore } from "../../../store/builder/store";
type RenameTooltipProps = { type RenameTooltipProps = {
name: string; name: string;
@ -13,12 +14,14 @@ type RenameTooltipProps = {
const RenameTooltip: React.FC<RenameTooltipProps> = ({ name, onSubmit }) => { const RenameTooltip: React.FC<RenameTooltipProps> = ({ name, onSubmit }) => {
const [value, setValue] = useState(name); const [value, setValue] = useState(name);
const { top } = useTopData(); const { top, setTop } = useTopData();
const { left } = useLeftData(); const { left, setLeft } = useLeftData();
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => { const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault(); e.preventDefault();
onSubmit(value.trim()); onSubmit(value.trim());
setTop(0);
setLeft(0);
}; };
return ( return (

View File

@ -6,6 +6,7 @@ import {
useToggleView, useToggleView,
useWallVisibility, useWallVisibility,
useUpdateScene, useUpdateScene,
useRenameModeStore,
} from "../../../store/builder/store"; } from "../../../store/builder/store";
import hideRoof from "../geomentries/roofs/hideRoof"; import hideRoof from "../geomentries/roofs/hideRoof";
import hideWalls from "../geomentries/walls/hideWalls"; import hideWalls from "../geomentries/walls/hideWalls";
@ -15,6 +16,7 @@ import addPillar from "../geomentries/pillars/addPillar";
import DeletePillar from "../geomentries/pillars/deletePillar"; import DeletePillar from "../geomentries/pillars/deletePillar";
import DeletableHoveredPillar from "../geomentries/pillars/deletableHoveredPillar"; import DeletableHoveredPillar from "../geomentries/pillars/deletableHoveredPillar";
import loadFloor from "../geomentries/floors/loadFloor"; import loadFloor from "../geomentries/floors/loadFloor";
import { useLeftData, useTopData } from "../../../store/visualization/useZone3DWidgetStore";
const FloorGroup = ({ const FloorGroup = ({
floorGroup, floorGroup,
@ -30,6 +32,9 @@ const FloorGroup = ({
const { addAction } = useAddAction(); const { addAction } = useAddAction();
const { deleteTool } = useDeleteTool(); const { deleteTool } = useDeleteTool();
const { updateScene, setUpdateScene } = useUpdateScene(); const { updateScene, setUpdateScene } = useUpdateScene();
const { setTop } = useTopData();
const { setLeft } = useLeftData();
const { isRenameMode, setIsRenameMode } = useRenameModeStore();
useEffect(() => { useEffect(() => {
if (updateScene) { if (updateScene) {
@ -55,6 +60,7 @@ const FloorGroup = ({
let isLeftMouseDown = false; let isLeftMouseDown = false;
const onMouseDown = (evt: any) => { const onMouseDown = (evt: any) => {
if (evt.button === 0) { if (evt.button === 0) {
isLeftMouseDown = true; isLeftMouseDown = true;
drag = false; drag = false;
@ -62,6 +68,7 @@ const FloorGroup = ({
}; };
const onMouseUp = (evt: any) => { const onMouseUp = (evt: any) => {
setIsRenameMode(false);
if (evt.button === 0) { if (evt.button === 0) {
isLeftMouseDown = false; isLeftMouseDown = false;
if (!drag) { if (!drag) {
@ -75,7 +82,15 @@ const FloorGroup = ({
} }
}; };
const onMouseMove = () => { const onMouseMove = (evt: any) => {
if (!canvasElement) return;
const canvasRect = canvasElement.getBoundingClientRect();
const relativeX = evt.clientX - canvasRect.left;
const relativeY = evt.clientY - canvasRect.top;
if (!isRenameMode) {
setTop(relativeY);
setLeft(relativeX);
}
if (isLeftMouseDown) { if (isLeftMouseDown) {
drag = true; drag = true;
} }
@ -90,7 +105,7 @@ const FloorGroup = ({
canvasElement.removeEventListener("mouseup", onMouseUp); canvasElement.removeEventListener("mouseup", onMouseUp);
canvasElement.removeEventListener("mousemove", onMouseMove); canvasElement.removeEventListener("mousemove", onMouseMove);
}; };
}, [deleteTool, addAction]); }, [deleteTool, addAction, isRenameMode]);
useFrame(() => { useFrame(() => {
hideRoof(roofVisibility, floorGroup, camera); hideRoof(roofVisibility, floorGroup, camera);

View File

@ -50,7 +50,6 @@ const FloorPlanGroup = ({ floorPlanGroup, floorPlanGroupLine, floorPlanGroupPoin
getLines(organization).then((data) => { getLines(organization).then((data) => {
const Lines: Types.Lines = objectLinesToArray(data); const Lines: Types.Lines = objectLinesToArray(data);
console.log('Lines: ', Lines);
// const data = localStorage.getItem("Lines"); // const data = localStorage.getItem("Lines");

View File

@ -15,6 +15,8 @@ import {
useLoadingProgress, useLoadingProgress,
useWidgetSubOption, useWidgetSubOption,
useSaveVersion, useSaveVersion,
useRenameModeStore,
useSelectedFloorItem,
} from "../store/builder/store"; } from "../store/builder/store";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { usePlayButtonStore } from "../store/usePlayButtonStore"; import { usePlayButtonStore } from "../store/usePlayButtonStore";
@ -39,6 +41,8 @@ import RegularDropDown from "../components/ui/inputs/RegularDropDown";
import VersionSaved from "../components/layout/sidebarRight/versionHisory/VersionSaved"; import VersionSaved from "../components/layout/sidebarRight/versionHisory/VersionSaved";
import SimulationPlayer from "../components/ui/simulation/simulationPlayer"; import SimulationPlayer from "../components/ui/simulation/simulationPlayer";
import { useProductStore } from "../store/simulation/useProductStore"; import { useProductStore } from "../store/simulation/useProductStore";
import RenameTooltip from "../components/ui/features/RenameTooltip";
import { setFloorItemApi } from "../services/factoryBuilder/assest/floorAsset/setFloorItemApi";
const Project: React.FC = () => { const Project: React.FC = () => {
let navigate = useNavigate(); let navigate = useNavigate();
@ -50,10 +54,13 @@ const Project: React.FC = () => {
const { setUserName } = useUserName(); const { setUserName } = useUserName();
const { setOrganization } = useOrganization(); const { setOrganization } = useOrganization();
const { setFloorItems } = useFloorItems(); const { setFloorItems } = useFloorItems();
const { selectedFloorItem, setSelectedFloorItem } = useSelectedFloorItem();
const { setWallItems } = useWallItems(); const { setWallItems } = useWallItems();
const { setZones } = useZones(); const { setZones } = useZones();
const { isVersionSaved } = useSaveVersion(); const { isVersionSaved } = useSaveVersion();
const { products } = useProductStore(); const { products } = useProductStore();
const { isRenameMode, setIsRenameMode } = useRenameModeStore();
// console.log('isRenameMode: ', isRenameMode);
useEffect(() => { useEffect(() => {
if (!isVersionSaved) { if (!isVersionSaved) {
@ -112,6 +119,29 @@ const Project: React.FC = () => {
setSelectedLayout(option); // Set selected layout setSelectedLayout(option); // Set selected layout
console.log("Selected layout:", option); console.log("Selected layout:", option);
}; };
const handleObjectRename = async (newName: string) => {
const email = localStorage.getItem("email") ?? "";
const organization = email?.split("@")[1]?.split(".")[0];
let response = await setFloorItemApi(
organization,
selectedFloorItem.userData.modelUuid,
newName
);
selectedFloorItem.userData.name = newName;
setSelectedFloorItem(selectedFloorItem);
setIsRenameMode(false);
setFloorItems((prevFloorItems: any[]) =>
prevFloorItems.map((floorItems) =>
floorItems.modelUuid === selectedFloorItem.userData.modelUuid
.id
? { ...floorItems, modelName: response.modelName }
: floorItems
)
);
}
return ( return (
<div className="project-main"> <div className="project-main">
{!selectedUser && ( {!selectedUser && (
@ -161,6 +191,7 @@ const Project: React.FC = () => {
> >
<Scene /> <Scene />
</div> </div>
{isRenameMode && selectedFloorItem?.userData.name && <RenameTooltip name={selectedFloorItem?.userData.name} onSubmit={handleObjectRename} />}
{selectedUser && <FollowPerson />} {selectedUser && <FollowPerson />}
{isLogListVisible && ( {isLogListVisible && (
<RenderOverlay> <RenderOverlay>

View File

@ -297,6 +297,11 @@ export const useUserName = create<any>((set: any) => ({
setUserName: (x: any) => set({ userName: x }), setUserName: (x: any) => set({ userName: x }),
})); }));
export const useRenameModeStore = create<any>((set: any) => ({
isRenameMode: false,
setIsRenameMode: (state: boolean) => set({ isRenameMode: state }),
}));
export const useObjectPosition = create<any>((set: any) => ({ export const useObjectPosition = create<any>((set: any) => ({
objectPosition: { x: undefined, y: undefined, z: undefined }, objectPosition: { x: undefined, y: undefined, z: undefined },
setObjectPosition: (newObjectPosition: any) => setObjectPosition: (newObjectPosition: any) =>

View File

@ -6,7 +6,9 @@ import {
useActiveTool, useActiveTool,
useAddAction, useAddAction,
useDeleteTool, useDeleteTool,
useRenameModeStore,
useSaveVersion, useSaveVersion,
useSelectedFloorItem,
useSelectedWallItem, useSelectedWallItem,
useShortcutStore, useShortcutStore,
useToggleView, useToggleView,
@ -37,6 +39,8 @@ const KeyPressListener: React.FC = () => {
const { setIsVersionSaved } = useSaveVersion(); const { setIsVersionSaved } = useSaveVersion();
const { isLogListVisible, setIsLogListVisible } = useLogger(); const { isLogListVisible, setIsLogListVisible } = useLogger();
const { hidePlayer, setHidePlayer } = usePlayerStore(); const { hidePlayer, setHidePlayer } = usePlayerStore();
const { isRenameMode, setIsRenameMode } = useRenameModeStore();
const { selectedFloorItem } = useSelectedFloorItem();
const isTextInput = (element: Element | null): boolean => const isTextInput = (element: Element | null): boolean =>
element instanceof HTMLInputElement || element instanceof HTMLInputElement ||
@ -152,9 +156,24 @@ const KeyPressListener: React.FC = () => {
}; };
const handleKeyPress = (event: KeyboardEvent) => { const handleKeyPress = (event: KeyboardEvent) => {
if (isTextInput(document.activeElement)) return;
const keyCombination = detectModifierKeys(event); const keyCombination = detectModifierKeys(event);
if (isTextInput(document.activeElement) && keyCombination !== "ESCAPE")
return;
if (keyCombination === "ESCAPE") {
console.log("esc");
setWalkMode(false);
setActiveTool("cursor");
setActiveSubTool("cursor");
setIsPlaying(false);
clearSelectedZone();
setShowShortcuts(false);
setIsVersionSaved(false);
setIsLogListVisible(false);
setIsRenameMode(false);
}
if ( if (
!keyCombination || !keyCombination ||
["F5", "F11", "F12"].includes(event.key) || ["F5", "F11", "F12"].includes(event.key) ||
@ -186,26 +205,17 @@ const KeyPressListener: React.FC = () => {
setHidePlayer(!hidePlayer); setHidePlayer(!hidePlayer);
} }
if (keyCombination === "ESCAPE") {
setWalkMode(false);
setActiveTool("cursor");
setActiveSubTool("cursor");
setIsPlaying(false);
clearSelectedZone();
setShowShortcuts(false);
setIsVersionSaved(false);
setIsLogListVisible(false);
}
if (keyCombination === "Ctrl+Shift+?") { if (keyCombination === "Ctrl+Shift+?") {
setShowShortcuts(!showShortcuts); setShowShortcuts(!showShortcuts);
} }
if (selectedFloorItem && keyCombination === "F2") {
setIsRenameMode(true);
}
// Placeholder for future implementation // Placeholder for future implementation
if ( if (
["Ctrl+Z", "Ctrl+Y", "Ctrl+Shift+Z", "Ctrl+F"].includes( ["Ctrl+Z", "Ctrl+Y", "Ctrl+Shift+Z", "Ctrl+F"].includes(keyCombination)
keyCombination
)
) { ) {
// Implement undo/redo/help/find/shortcuts // Implement undo/redo/help/find/shortcuts
} }
@ -223,7 +233,9 @@ const KeyPressListener: React.FC = () => {
showShortcuts, showShortcuts,
isPlaying, isPlaying,
isLogListVisible, isLogListVisible,
hidePlayer hidePlayer,
selectedFloorItem,
isRenameMode,
]); ]);
return null; return null;