fix group a object with a another group
This commit is contained in:
@@ -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) => ({
|
||||
|
||||
Reference in New Issue
Block a user