-
Notifications
You must be signed in to change notification settings - Fork 747
Expand file tree
/
Copy pathdnd.ts
More file actions
97 lines (85 loc) · 3.61 KB
/
dnd.ts
File metadata and controls
97 lines (85 loc) · 3.61 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import setMoveable from "../../Lib/setMoveable"
import { findParentElement } from "../../Lib/findParentElement"
export default function initDnd(el: HTMLElement, vueIns: any) {
let ghost: HTMLElement | null = null
let isStart = false
let elStartX = 0,
elStartY = 0
setMoveable(el, {
callback_start: (e) => {
let rect = (e.startEvent!.target as any).getBoundingClientRect()
elStartX = rect.x
elStartY = rect.y
return false
},
callback_move: (e) => {
// console.log("[dnd:move]", e)
if (!isStart && Math.abs(e.startOffsetX) + Math.abs(e.startOffsetY) > 10) {
dndStart()
}
if (ghost) {
ghost.style.left = ` ${elStartX + e.startOffsetX}px`
ghost.style.top = `${elStartY + e.startOffsetY}px`
// console.log("[dnd:move]", { startEvent: e.startEvent, elStartX, elStartY })
}
return false
},
callback_end: (e) => {
console.log("[dnd:end]", e)
// 词典拖拽到工作区
if (vueIns.$el.classList.contains("dict-word")) {
}
//工作区拖拽到工作区
else {
}
let dropEl = <HTMLElement>e.event?.target
if (dropEl.classList.contains("dnd-slot-pre") || dropEl.classList.contains("dnd-slot-next")) {
let itemEl = findParentElement(dropEl, (el) => el.classList.contains("PromptItem"))
if (itemEl) {
let itemVueIns = (<any>itemEl).__vue__
let item = itemVueIns.item
let list = itemVueIns.list
let orgItem = vueIns.item
let orgList = vueIns.list
orgList?.removePrompt(orgItem)
let offset = dropEl.classList.contains("dnd-slot-next") ? 1 : 0
// console.log("[dnd:slot]", { item, list, orgItem, orgList }, offset, { itemVueIns, itemEl })
orgItem = list.insertPromptOf(item, orgItem, offset)
orgItem.data.word.subType = item.data.word.subType
orgItem.data.word.lv = item.data.word.lv
itemVueIns.$emit("update")
}
} else if (dropEl.classList.contains("PromptList-list")) {
let itemEl = findParentElement(dropEl, (el) => el.classList.contains("PromptList"))
console.log("[dnd:itemEl]", { dropEl, itemEl })
if (itemEl) {
let itemVueIns = (<any>itemEl).__vue__
let list = itemVueIns.list
let orgItem = vueIns.item
let orgList = vueIns.list
console.log("[dnd:slot]", { list, orgItem, orgList }, { itemVueIns, itemEl })
orgList?.removePrompt(orgItem)
orgItem = list.insertPromptLast(orgItem)
orgItem.data.word.subType = list.data.type
itemVueIns.$emit("update")
}
}
dndEnd()
},
})
function dndStart() {
document.body.classList.toggle("dnd-ing", true)
isStart = true
ghost = <HTMLElement>el.cloneNode(true)
ghost.classList.toggle("dnd-ghost")
document.body.appendChild(ghost)
el.classList.toggle("dnd-org", true)
}
function dndEnd() {
ghost?.remove()
ghost = null
isStart = false
el.classList.toggle("dnd-org", false)
document.body.classList.toggle("dnd-ing", false)
}
}