fix group a object with a another group

This commit is contained in:
hamid zarghami
2026-01-05 12:54:29 +03:30
parent 8983301187
commit 34e0b882fa
+54 -5
View File
@@ -684,8 +684,46 @@ export const useEditorStore = create<EditorStoreType>((set, get) => {
const state = get();
if (objectIds.length < 2) return;
// پیدا کردن همه آبجکت‌هایی که باید در گروه جدید باشند
// شامل آبجکت‌های انتخاب شده + آبجکت‌های داخل گروه‌های قبلی آن‌ها
const allObjectIdsToGroup = new Set<string>(objectIds);
const oldGroupIdsToRemove = new Set<string>();
// بررسی اینکه آیا یکی از آبجکت‌های انتخاب شده در یک گروه قبلی است
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<EditorStoreType>((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) => ({