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();
|
const state = get();
|
||||||
if (objectIds.length < 2) return;
|
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 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;
|
if (objectsToGroup.length === 0) return;
|
||||||
|
|
||||||
@@ -750,11 +788,22 @@ export const useEditorStore = create<EditorStoreType>((set, get) => {
|
|||||||
height: groupHeight,
|
height: groupHeight,
|
||||||
};
|
};
|
||||||
|
|
||||||
// اضافه کردن groupId به objectهای داخل گروه
|
// اضافه کردن groupId به objectهای داخل گروه و حذف گروههای قدیمی
|
||||||
const updateObjects = (objects: EditorObject[]) =>
|
const updateObjects = (objects: EditorObject[]) =>
|
||||||
objects.map((obj) =>
|
objects
|
||||||
objectIds.includes(obj.id) ? { ...obj, groupId } : obj
|
.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) {
|
if (state.currentPageId) {
|
||||||
set((state) => ({
|
set((state) => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user