Skip to content

Commit 79b4f94

Browse files
committed
fix: allow clickBySelectEnd, hitRate #152
1 parent 53e5e10 commit 79b4f94

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

packages/selecto/src/SelectoManager.tsx

+18-7
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class Selecto extends EventEmitter<SelectoEvents> {
192192
const data = { ignoreClick: true };
193193

194194
this.findSelectableTargets(data);
195-
const selectedElements = this.hitTest(rect, data);
195+
const selectedElements = this.hitTest(rect, data, true, null);
196196
const result = this.setSelectedTargets(selectedElements);
197197

198198
return {
@@ -576,7 +576,8 @@ class Selecto extends EventEmitter<SelectoEvents> {
576576
private hitTest(
577577
selectRect: Rect,
578578
data: any,
579-
gestoEvent?: any,
579+
isDrag: boolean,
580+
gestoEvent: any,
580581
) {
581582
const { hitRate, selectByClick } = this.options;
582583
const { left, top, right, bottom } = selectRect;
@@ -602,7 +603,7 @@ class Selecto extends EventEmitter<SelectoEvents> {
602603
? false
603604
: isInside([clientX, clientY], points);
604605

605-
if (selectByClick && inArea) {
606+
if (!isDrag && selectByClick && inArea) {
606607
return true;
607608
}
608609
const overlapPoints = getOverlapPoints(rectPoints, points);
@@ -1028,14 +1029,21 @@ class Selecto extends EventEmitter<SelectoEvents> {
10281029
};
10291030
let firstPassedTargets: ElementType[] = [];
10301031

1031-
if (!selectFromInside || (selectByClick && !clickBySelectEnd)) {
1032+
// allow click on select
1033+
const allowClickBySelectEnd = selectByClick && !clickBySelectEnd;
1034+
let hasInsideTargets = false;
1035+
1036+
if (!selectFromInside || allowClickBySelectEnd) {
10321037
const pointTarget = this._findElement(
10331038
clickedTarget || inputEvent.target, // elementFromPoint(clientX, clientY),
10341039
data.selectableTargets,
10351040
);
1036-
firstPassedTargets = pointTarget ? [pointTarget] : [];
1041+
1042+
hasInsideTargets = !!pointTarget;
1043+
if (allowClickBySelectEnd) {
1044+
firstPassedTargets = pointTarget ? [pointTarget] : [];
1045+
}
10371046
}
1038-
const hasInsideTargets = firstPassedTargets.length > 0;
10391047
const isPreventSelect = !selectFromInside && hasInsideTargets;
10401048

10411049
// prevent drag from inside when selectByClick is false
@@ -1094,6 +1102,7 @@ class Selecto extends EventEmitter<SelectoEvents> {
10941102
} else {
10951103
data.startPassedTargets = [];
10961104
}
1105+
10971106
this._select(
10981107
firstPassedTargets,
10991108
hitRect,
@@ -1171,7 +1180,8 @@ class Selecto extends EventEmitter<SelectoEvents> {
11711180
if (!isInnerScroll && scrollOptions && scrollOptions.container) {
11721181
this.dragScroll.dragStart(e, scrollOptions);
11731182
}
1174-
if (clickBySelectEnd) {
1183+
1184+
if (isPreventSelect && selectByClick && clickBySelectEnd) {
11751185
data.selectFlag = false;
11761186
e.preventDrag();
11771187
}
@@ -1206,6 +1216,7 @@ class Selecto extends EventEmitter<SelectoEvents> {
12061216
const passedTargets = this.hitTest(
12071217
rect,
12081218
data,
1219+
true,
12091220
e,
12101221
);
12111222
selectedTargets = passTargets(

packages/selecto/test/manual/index.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,20 @@
6565
// boundContainer: true,
6666
// ratio: 1,
6767
// dragCondition: () => false,
68-
hitRate: 0,
69-
ratio: 0,
68+
hitRate: 10,
69+
// ratio: 0,
7070
selectableTargets: [".target"],
7171
selectFromInside: false,
7272
selectByClick: true,
73-
// clickBySelectEnd: true,
73+
clickBySelectEnd: true,
7474
// checkInput: true,
7575
// preventDragFromInside: false,
7676
toggleContinueSelect: "shift",
7777
// continueSelectWithoutDeselect: true,
7878
}).on("dragStart", e => {
7979
console.log("ds", e.inputEvent.target);
8080
}).on("drag", e => {
81-
selecto.findSelectableTargets();
81+
// selecto.findSelectableTargets();
8282
}).on("selectStart", e => {
8383
console.log("start", e);
8484
e.added.forEach(el => {

0 commit comments

Comments
 (0)