-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnote.js
126 lines (110 loc) · 4.31 KB
/
note.js
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
class Note {
constructor(id = undefined, content = ''){
const instance = this;
const element = this.element = document.createElement('div');
element.classList.add('note')
element.setAttribute('draggable', 'true');
if (id) element.setAttribute('data-note-id', id);
else element.setAttribute('data-note-id', Note.idCounter++);
element.textContent = content;
element.setAttribute('contenteditable', 'true');
element.addEventListener('dblclick', function (event) {
element.setAttribute('contenteditable', 'true')
element.removeAttribute('draggable')
instance.column.removeAttribute('draggable')
element.focus()
})
element.addEventListener('blur', function (event) {
element.removeAttribute('contenteditable')
element.setAttribute('draggable', 'true')
instance.column.setAttribute('draggable', 'true');
element.innerText = element.innerText.trim();
if (!element.textContent.trim().length) {
element.remove()
}
Application.save();
})
element.addEventListener('dragstart', this.dragstart.bind(this))
element.addEventListener('dragend', this.dragend.bind(this))
element.addEventListener('dragenter', this.dragenter.bind(this))
element.addEventListener('dragover', this.dragover.bind(this))
element.addEventListener('dragleave', this.dragleave.bind(this))
element.addEventListener('drop', this.drop.bind(this))
}
get column(){
return this.element.closest('.column');
}
dragstart (event) {
Note.dragged = this.element
this.element.classList.add('dragged')
event.stopPropagation()
}
dragend (event) {
Note.dragged = null
this.element.classList.remove('dragged')
}
dragenter (event) {
if (!Note.dragged || this.element === Note.dragged) {
return
}
this.element.classList.add('under')
}
dragover (event) {
event.preventDefault()
if (!Note.dragged || this.element === Note.dragged) {
return
}
}
dragleave (event) {
if (!Note.dragged || this.element === Note.dragged) {
return
}
this.element.classList.remove('under')
}
drop (event) {
event.stopPropagation()
this.element.classList.remove('under')
if (this.element === Note.dragged) {
return
}
// column dropped on note
if (Column.dragged){
// not the same column
if (this.element.closest('.column') !== Column.dragged) {
const col = Array.from(document.querySelectorAll('.column'))
const indexA = col.indexOf(this.element.closest('.column'))
const indexB = col.indexOf(Column.dragged)
this.element.closest('.column').classList.remove('under')
if (indexA < indexB) {
this.element.closest('.column').parentElement.insertBefore(Column.dragged, this.element.closest('.column'))
}
else {
this.element.closest('.column').parentElement.insertBefore(Column.dragged, this.element.closest('.column').nextElementSibling)
}
Application.save();
return
}
else return
}
// note dropped on a note
// on the same column
if (this.element.parentElement === Note.dragged.parentElement) {
const note = Array.from(this.element.parentElement.querySelectorAll('.note'))
const indexA = note.indexOf(this.element)
const indexB = note.indexOf(Note.dragged)
if (indexA < indexB) {
this.element.parentElement.insertBefore(Note.dragged, this.element)
}
else {
this.element.parentElement.insertBefore(Note.dragged, this.element.nextElementSibling)
}
}
// on the other column
else {
this.element.parentElement.insertBefore(Note.dragged, this.element)
}
Application.save();
}
}
Note.idCounter = 8;
Note.dragged = null;