-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
83 lines (66 loc) 路 2.3 KB
/
Copy pathapp.js
File metadata and controls
83 lines (66 loc) 路 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
const Bacon = window.Bacon;
const pointerDownStream = Bacon.fromEvent(window, 'pointerdown');
const pointerMoveStream = Bacon.fromEvent(window, 'pointermove');
const pointerUpStream = Bacon.fromEvent(window, 'pointerup');
pointerDownStream
.filter(onlyPointerDownsOnCards)
.flatMap(cardOffsetStream)
.onValue(updateBoard);
function onlyPointerDownsOnCards(pointerDownEvent) {
return pointerDownEvent.target.matches('.board__card');
}
function cardOffsetStream(pointerDownEvent) {
const cardId = pointerDownEvent.target.dataset.id;
return pointerMoveStream
.takeUntil(pointerUpStream)
.merge(pointerUpStream.first())
.map(pointerEvent => ({
cardId,
offsetX: pointerEvent.clientX - pointerDownEvent.clientX,
offsetY: pointerEvent.clientY - pointerDownEvent.clientY,
containingColumn: getContainingColumn(pointerEvent),
isPointerUp: pointerEvent.type === 'pointerup'
}));
}
function updateBoard(data) {
const cards = Array.from(document.querySelectorAll('.board__card'));
const activeCard = cards.find(cardElement => cardElement.dataset.id === data.cardId);
if (!activeCard) {
return;
}
if (data.isPointerUp) {
releaseCard(activeCard, data.containingColumn);
return;
}
moveCard(activeCard, data.containingColumn, data.offsetX, data.offsetY);
}
function moveCard(card, column, offsetX, offsetY) {
card.classList.add('board__card--moving');
card.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
if (column) {
card.classList.add('board__card--active');
} else {
card.classList.remove('board__card--active');
}
}
function releaseCard(card, column) {
card.classList.remove('board__card--moving', 'board__card--active');
card.style.transform = 'translate(0px, 0px)';
if (column) {
column.querySelector('.board__inner-column').appendChild(card);
}
}
function getContainingColumn(pointerMoveEvent) {
const columns = Array.from(document.querySelectorAll('.board__column'));
for (let i = 0; i < columns.length; i++) {
const column = columns[i];
const columnRect = column.getBoundingClientRect();
const isContained =
pointerMoveEvent.clientX >= columnRect.left &&
pointerMoveEvent.clientX <= columnRect.left + columnRect.width;
if (isContained) {
return column;
}
}
return null;
}