Skip to content

Commit

Permalink
fix(common): adjust group element select#WIK-14920 (#787)
Browse files Browse the repository at this point in the history
  • Loading branch information
huanhuanwa authored Mar 22, 2024
1 parent 13179e6 commit 9706f28
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 71 deletions.
5 changes: 5 additions & 0 deletions .changeset/witty-oranges-bathe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plait/core': patch
---

adjust group element select
132 changes: 61 additions & 71 deletions packages/core/src/plugins/with-selection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,103 +177,93 @@ export function withSelection(board: PlaitBoard) {
elements = [elements[0]];
}
const isHitElementWithGroup = elements.some(item => item.groupId);
if (isShift) {
const newSelectedElements = [...getSelectedElements(board)];
const selectedElements = getSelectedElements(board);
if (isHitElementWithGroup) {
if (board.selection && Selection.isCollapsed(board.selection)) {
if (isHitElementWithGroup) {
let pendingElements: PlaitElement[] = [...elements];
const hitElement = elements[0];
const hitElementGroups = getGroupByElement(board, hitElement, true) as PlaitGroup[];
if (hitElementGroups.length) {
const selectedGroups = filterSelectedGroups(board, hitElementGroups);
const elementsInHighestGroup =
const hitElement = elements[0];
const hitElementGroups = getGroupByElement(board, hitElement, true) as PlaitGroup[];
if (hitElementGroups.length) {
let newElements = [...selectedElements];
const elementsInHighestGroup =
getElementsInGroup(board, hitElementGroups[hitElementGroups.length - 1], true) || [];
if (selectedGroups.length > 0) {
if (selectedGroups.length > 1) {
pendingElements = getElementsInGroup(board, selectedGroups[selectedGroups.length - 2], true);
}
const isSelectGroupElement = selectedElements.some(element =>
elementsInHighestGroup.map(item => item.id).includes(element.id)
);
if (isShift) {
let pendingElements: PlaitElement[] = [];
if (!isSelectGroupElement) {
pendingElements = elementsInHighestGroup;
} else {
if (!newSelectedElements.includes(hitElement)) {
const selectedElementsInGroup = elementsInHighestGroup.filter(item =>
newSelectedElements.includes(item)
);
// When partially selected elements belong to a group,
// only select those elements along with the hit elements.
if (selectedElementsInGroup.length) {
pendingElements.push(...selectedElementsInGroup);
} else {
pendingElements = elementsInHighestGroup;
}
const isHitSelectedElement = selectedElements.some(item => item.id === hitElement.id);
const selectedElementsInGroup = elementsInHighestGroup.filter(item => selectedElements.includes(item));
if (isHitSelectedElement) {
pendingElements = selectedElementsInGroup.filter(item => item.id !== hitElement.id);
} else {
pendingElements = [];
pendingElements.push(...selectedElementsInGroup, ...elements);
}
}
elementsInHighestGroup.forEach(element => {
if (newSelectedElements.includes(element)) {
newSelectedElements.splice(newSelectedElements.indexOf(element), 1);
if (newElements.includes(element)) {
newElements.splice(newElements.indexOf(element), 1);
}
});
if (pendingElements.length) {
newSelectedElements.push(...pendingElements);
newElements.push(...pendingElements);
}
}
} else {
elements.forEach(element => {
if (newSelectedElements.includes(element)) {
newSelectedElements.splice(newSelectedElements.indexOf(element), 1);
} else {
newElements = [...elements];
const selectedGroups = filterSelectedGroups(board, hitElementGroups);
if (selectedGroups.length > 0) {
if (selectedGroups.length > 1) {
newElements = getAllElementsInGroup(board, selectedGroups[selectedGroups.length - 2], true);
}
} else {
newSelectedElements.push(element);
const elementsInGroup = getAllElementsInGroup(
board,
hitElementGroups[hitElementGroups.length - 1],
true
);
if (!isSelectGroupElement) {
newElements = elementsInGroup;
}
}
});
}
cacheSelectedElements(board, uniqueById(newElements));
}
cacheSelectedElements(board, uniqueById(newSelectedElements));
} else {
let newElements: PlaitElement[] = [...elements];
if (isHitElementWithGroup) {
elements.forEach(item => {
if (!item.groupId) {
newElements.push(item);
} else {
newElements.push(...getElementsInGroupByElement(board, item));
}
});
}
newElements.forEach(element => {
if (!newSelectedElements.includes(element)) {
newSelectedElements.push(element);
let newElements = [...selectedElements];
elements.forEach(item => {
if (!item.groupId) {
newElements.push(item);
} else {
newElements.push(...getElementsInGroupByElement(board, item));
}
});
cacheSelectedElements(board, uniqueById(newSelectedElements));
cacheSelectedElements(board, uniqueById(newElements));
}
} else {
let newSelectedElements = [...elements];
if (isHitElementWithGroup) {
const isCollapsed = Selection.isCollapsed(board.selection!);
if (!isCollapsed) {
newSelectedElements = [];
elements.forEach(item => {
if (!item.groupId) {
newSelectedElements.push(item);
if (isShift) {
const newElements = [...selectedElements];
if (board.selection && Selection.isCollapsed(board.selection)) {
elements.forEach(element => {
if (newElements.includes(element)) {
newElements.splice(newElements.indexOf(element), 1);
} else {
newSelectedElements.push(...getElementsInGroupByElement(board, item));
newElements.push(element);
}
});
cacheSelectedElements(board, newElements);
} else {
const hitElement = elements[0];
const hitElementGroups = getGroupByElement(board, hitElement, true) as PlaitGroup[];
if (hitElementGroups.length) {
const selectedGroups = filterSelectedGroups(board, hitElementGroups);
if (selectedGroups.length > 0) {
if (selectedGroups.length > 1) {
newSelectedElements = getAllElementsInGroup(board, selectedGroups[selectedGroups.length - 2], true);
}
} else {
newSelectedElements = getAllElementsInGroup(board, hitElementGroups[hitElementGroups.length - 1], true);
elements.forEach(element => {
if (!newElements.includes(element)) {
newElements.push(element);
}
}
});
cacheSelectedElements(board, [...newElements]);
}
} else {
cacheSelectedElements(board, [...elements]);
}
cacheSelectedElements(board, uniqueById(newSelectedElements));
}
const newElements = getSelectedElements(board);
previousSelectedElements = newElements;
Expand Down

0 comments on commit 9706f28

Please sign in to comment.