From 34e0b882fad5adee2a9787dedee5b38cd593860f Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Mon, 5 Jan 2026 12:54:29 +0330 Subject: [PATCH] fix group a object with a another group --- src/pages/editor/store/editorStore.ts | 59 ++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/src/pages/editor/store/editorStore.ts b/src/pages/editor/store/editorStore.ts index 7c9ca0f..2757ec7 100644 --- a/src/pages/editor/store/editorStore.ts +++ b/src/pages/editor/store/editorStore.ts @@ -684,8 +684,46 @@ export const useEditorStore = create((set, get) => { const state = get(); if (objectIds.length < 2) return; + // پیدا کردن همه آبجکت‌هایی که باید در گروه جدید باشند + // شامل آبجکت‌های انتخاب شده + آبجکت‌های داخل گروه‌های قبلی آن‌ها + const allObjectIdsToGroup = new Set(objectIds); + const oldGroupIdsToRemove = new Set(); + + // بررسی اینکه آیا یکی از آبجکت‌های انتخاب شده در یک گروه قبلی است + objectIds.forEach((id) => { + const obj = state.objects.find((o) => o.id === id); + if (obj?.type === "group") { + // اگر این خود یک گروه است، همه آبجکت‌های آن را اضافه کن + const oldGroupMembers = state.objects.filter((o) => o.groupId === id); + oldGroupMembers.forEach((member) => { + if (member.type !== "group") { + allObjectIdsToGroup.add(member.id); + } + }); + // گروه قدیمی را برای حذف علامت بزن + oldGroupIdsToRemove.add(id); + } else if (obj?.groupId) { + // اگر این آبجکت در یک گروه است، همه آبجکت‌های آن گروه را اضافه کن + const oldGroupMembers = state.objects.filter((o) => o.groupId === obj.groupId); + oldGroupMembers.forEach((member) => { + if (member.type !== "group") { + allObjectIdsToGroup.add(member.id); + } + }); + // گروه قدیمی را برای حذف علامت بزن + if (obj.groupId) { + oldGroupIdsToRemove.add(obj.groupId); + } + } + }); + + // اگر فقط یک آبجکت باقی ماند، گروه‌بندی انجام نده + if (allObjectIdsToGroup.size < 2) return; + const groupId = `group-${crypto.randomUUID()}`; - const objectsToGroup = state.objects.filter((obj) => objectIds.includes(obj.id)); + const objectsToGroup = state.objects.filter((obj) => + allObjectIdsToGroup.has(obj.id) && obj.type !== "group" + ); if (objectsToGroup.length === 0) return; @@ -750,11 +788,22 @@ export const useEditorStore = create((set, get) => { height: groupHeight, }; - // اضافه کردن groupId به objectهای داخل گروه + // اضافه کردن groupId به objectهای داخل گروه و حذف گروه‌های قدیمی const updateObjects = (objects: EditorObject[]) => - objects.map((obj) => - objectIds.includes(obj.id) ? { ...obj, groupId } : obj - ); + objects + .map((obj) => { + // اگر این آبجکت باید در گروه جدید باشد + if (allObjectIdsToGroup.has(obj.id) && obj.type !== "group") { + return { ...obj, groupId }; + } + // اگر این آبجکت در یک گروه قدیمی است که باید حذف شود + if (obj.groupId && oldGroupIdsToRemove.has(obj.groupId)) { + return { ...obj, groupId: undefined }; + } + return obj; + }) + // حذف گروه‌های قدیمی + .filter((obj) => !oldGroupIdsToRemove.has(obj.id)); if (state.currentPageId) { set((state) => ({