Skip to content

Commit 091fda5

Browse files
authored
feat: add intersection option (naver#46)
* docs: remove auto generated docs file * feat: add intersection option * test: test intersection option * docs: add intersection example * fix: fix ga * chore: bump @cfcs, @egjs/axes
1 parent 52fa6c6 commit 091fda5

File tree

93 files changed

+469
-5807
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+469
-5807
lines changed

jsdoc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
},
3737
"applicationName": "eg.Conveyer",
3838
"disqus": "egjs",
39-
"googleAnalytics": "G-3VG8ZPB0QT",
39+
"googleAnalytics": "G-LWLTCXMENE",
4040
"openGraph": {
4141
"title": "",
4242
"type": "website",

packages/conveyer/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
"dist/*"
3737
],
3838
"dependencies": {
39-
"@cfcs/core": "~0.0.13",
40-
"@egjs/axes": "^3.8.5",
39+
"@cfcs/core": "^0.1.0",
40+
"@egjs/axes": "^3.9.0",
4141
"@egjs/component": "^3.0.1"
4242
},
4343
"devDependencies": {

packages/conveyer/src/Conveyer.ts

+10-8
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class Conveyer extends Component<ConveyerEvents> {
164164
const length = items.length;
165165
const endPos = pos + size;
166166
const sibling = options.sibling;
167+
const intersection = options.intersection;
167168
const startVirtualItem = { pos: 0, size: 0 };
168169
const endVirtualItem = { pos: scrollSize, size: 0 };
169170

@@ -180,13 +181,13 @@ class Conveyer extends Component<ConveyerEvents> {
180181
if (pos < 0) {
181182
return null;
182183
}
183-
const selectedItems = [...items].reverse().filter(item => {
184+
const selectedItems = items.filter(item => {
184185
const itemSize = item.size;
185186
const dist = item.pos - pos;
186187
const dist2 = dist + itemSize;
187188

188-
return (dist >= 0) || (dist2 >= 0 && (!itemSize || Math.abs(dist2) / itemSize >= hitTest));
189-
}).reverse();
189+
return (dist >= 0) || (dist2 >= 0 && (intersection || !itemSize || Math.abs(dist2) / itemSize >= hitTest));
190+
});
190191

191192
selectedItem = (selectedItems[0] === startVirtualItem && selectedItems[1]) || selectedItems[0];
192193
} else if (target === "end") {
@@ -198,7 +199,7 @@ class Conveyer extends Component<ConveyerEvents> {
198199
const dist = item.pos + itemSize - endPos;
199200
const dist2 = dist - itemSize;
200201

201-
return dist <= 0 || (dist2 <= 0 && (!itemSize || Math.abs(dist2) / itemSize >= hitTest));
202+
return dist <= 0 || (dist2 <= 0 && (intersection || !itemSize || Math.abs(dist2) / itemSize >= hitTest));
202203
}).reverse();
203204

204205
selectedItem = (selectedItems[0] === endVirtualItem && selectedItems[1]) || selectedItems[0];
@@ -208,16 +209,16 @@ class Conveyer extends Component<ConveyerEvents> {
208209
const dist = item.pos + itemSize - pos;
209210
const dist2 = dist - itemSize;
210211

211-
return dist <= 0 || (dist2 <= 0 && (!itemSize || Math.abs(dist2) / itemSize >= hitTest));
212+
return dist <= 0 || (dist2 <= 0 && (intersection || !itemSize || Math.abs(dist2) / itemSize >= hitTest));
212213
}).reverse()[0];
213214
} else if (target === "next") {
214-
selectedItem = items.reverse().filter(item => {
215+
selectedItem = items.filter(item => {
215216
const itemSize = item.size;
216217
const dist = item.pos - endPos;
217218
const dist2 = dist + itemSize;
218219

219-
return dist >= 0 || (dist2 >= 0 && (!itemSize || Math.abs(dist2) / itemSize >= hitTest));
220-
}).reverse()[0];
220+
return dist >= 0 || (dist2 >= 0 && (intersection || !itemSize || Math.abs(dist2) / itemSize >= hitTest));
221+
})[0];
221222
} else {
222223
return this._getItem(target);
223224
}
@@ -435,6 +436,7 @@ class Conveyer extends Component<ConveyerEvents> {
435436
if (options.useDrag) {
436437
axes.connect(options.horizontal ? ["scroll", ""] : ["", "scroll"], new PanInput(scrollAreaElement, {
437438
preventClickOnDrag: options.preventClickOnDrag,
439+
preventDefaultOnDrag: options.preventDefaultOnDrag,
438440
inputType: ["mouse"],
439441
touchAction: "auto",
440442
}));

packages/conveyer/src/types.ts

+18-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Conveyer from "./Conveyer";
1616
* @property - The maximum amount of time the scroll event does not fire for the finishScroll event to be triggered. (default: 100) <ko> finishScroll 이벤트가 발생되기 위한 scroll 이벤트가 발생하지 않는 최대 시간. (default: 100)</ko>
1717
* @property - Whether to prevent being selected. (default: true) <ko>셀렉트가 되는 것을 막을지 여부. (default: true) </ko>
1818
* @property - Whether to prevent click event when dragging. (default: false) <ko>드래그하면 클릭이벤트를 막을지 여부. (default: true)</ko>
19+
* @property - Whether to use the {@link https://developer.mozilla.org/ko/docs/Web/API/Event/preventDefault preventDefault} when the user starts dragging <ko>사용자가 드래그를 시작할 때 {@link https://developer.mozilla.org/ko/docs/Web/API/Event/preventDefault preventDefault} 실행 여부</ko>
1920
* @property - Whether to automatically initialize when an instance is created. If set to false, initialization is possible while calling the init method. (default: true) <ko>인스턴스를 생성할 때 자동으로 초기화할지 여부. false로 설정하면 init 메서드를 호출하면서 초기화가 가능하다. (default: true)</ko>
2021
* @property - If this option is enabled on a Conveyer placed inside an egjs component that has the same scroll direction including the Conveyer itself. The parent component moves in the same direction after the Conveyer reaches the first/last scroll position. <ko>Conveyer 자신을 포함해서 동일한 스크롤 방향을 가진 egjs 컴포넌트 내부에 배치된 Conveyer에서 이 옵션을 활성화하면 Conveyer가 첫/마지막 스크롤 위치에 도달한 뒤부터 같은 방향으로 상위 컴포넌트가 움직인다.</ko>
2122
*/
@@ -28,6 +29,7 @@ export interface ConveyerOptions {
2829
scrollDebounce?: number;
2930
preventDefault?: boolean;
3031
preventClickOnDrag?: boolean;
32+
preventDefaultOnDrag?: boolean;
3133
autoInit?: boolean;
3234
nested?: boolean;
3335
}
@@ -60,11 +62,25 @@ export interface ConveyerReactiveState {
6062

6163
/**
6264
* @typedef
63-
* @property - size ratio to find items. (default: 1) <ko>아이템을 찾기 위한 사이즈 비율. (default: 1)</ko>
64-
* @property - The number of items next to the item's index to return. (default: 0) <ko>해당 아이템의 index에서 얼마나 옆에 있는 아이템을 반환할지 개수 (default: 0)</ko>
6565
*/
6666
export interface FindItemOptions {
67+
/**
68+
* size ratio to find items.
69+
* <ko>아이템을 찾기 위한 사이즈 비율.</ko>
70+
* @default 1
71+
*/
6772
hitTest?: number;
73+
/**
74+
* Whether to include items that intersect on the side
75+
* <ko>사이드에 교차하는 아이템까지 포함할지 여부.</ko>
76+
* @default 0
77+
*/
78+
intersection?: boolean;
79+
/**
80+
* The number of items next to the item's index to return.
81+
* <ko>해당 아이템의 index에서 얼마나 옆에 있는 아이템을 반환할지 개수.</ko>
82+
* @default 0
83+
*/
6884
sibling?: number;
6985
}
7086

packages/conveyer/test/unit/Conveyer.spec.ts

+45
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,51 @@ describe("test Conveyer", () => {
531531
expect(items.scrollLeft).to.be.equals(400);
532532
expect(conveyer.scrollPos).to.be.equals(400);
533533
});
534+
it("should check it target(3) moves start when target is end (intersection) and align is start", async () => {
535+
// Given
536+
const items = document.querySelector<HTMLElement>(".items")!;
537+
538+
conveyer = new Conveyer(".items");
539+
540+
items.scrollBy(100, 0);
541+
await waitFor(100);
542+
543+
// When
544+
// 2 3(end) 4(intersection) 5(next)
545+
// to
546+
// 3 4 5
547+
conveyer.scrollIntoView("end", {
548+
align: "start",
549+
intersection: true,
550+
});
551+
await waitFor(100);
552+
553+
// Then
554+
555+
expect(items.scrollLeft).to.be.equals(600);
556+
expect(conveyer.scrollPos).to.be.equals(600);
557+
});
558+
it("should check it target(3) moves start when target is end (intersection) and align is start", async () => {
559+
// Given
560+
conveyer = new Conveyer(".items");
561+
// 1 (prev) 2(intersection) 3 (start) 4 5
562+
conveyer.scrollTo(300);
563+
await waitFor(100);
564+
565+
// When
566+
// to
567+
// 1 2 3
568+
conveyer.scrollIntoView("start", {
569+
align: "end",
570+
intersection: true,
571+
});
572+
await waitFor(100);
573+
574+
// Then
575+
const items = document.querySelector<HTMLElement>(".items")!;
576+
expect(items.scrollLeft).to.be.equals(0);
577+
expect(conveyer.scrollPos).to.be.equals(0);
578+
});
534579
it("should check it target(4) moves start when target is end and sibling(1)", async () => {
535580
// Given
536581
conveyer = new Conveyer(".items");

packages/docs/.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
# Generated files
88
.docusaurus
99
.cache-loader
10+
/i18n/ko
11+
/docs/api
1012

1113
# Misc
1214
.DS_Store
@@ -18,3 +20,4 @@
1820
npm-debug.log*
1921
yarn-debug.log*
2022
yarn-error.log*
23+

packages/docs/docs/api/CONVEYER_METHODS.mdx

-14
This file was deleted.

0 commit comments

Comments
 (0)