Skip to content

Commit 4c2ceab

Browse files
committed
feat(nodeMenu): add memo field
1 parent c8f2c18 commit 4c2ceab

File tree

2 files changed

+52
-42
lines changed

2 files changed

+52
-42
lines changed

src/plugin/nodeMenu.less

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ nmenu {
1212
transition: 0.3s all;
1313
&.close {
1414
height: 30px;
15-
width: 50px;
15+
width: 46px;
1616
overflow: hidden;
1717
}
1818
.button-container {
@@ -41,7 +41,8 @@ nmenu {
4141
.nm-fontcolor-container {
4242
margin-bottom: 10px;
4343
}
44-
input {
44+
input,
45+
textarea {
4546
background: #f7f9fa;
4647
border: 1px solid #dce2e6;
4748
border-radius: 3px;
@@ -50,6 +51,9 @@ nmenu {
5051
width: 100%;
5152
box-sizing: border-box;
5253
}
54+
textarea {
55+
resize: none;
56+
}
5357
.split6 {
5458
display: inline-block;
5559
width: 16.66%;

src/plugin/nodeMenu.ts

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import './nodeMenu.less'
22
import i18n from '../i18n'
33

4-
const createDiv = (id) => {
4+
const createDiv = (id, innerHTML) => {
55
const div = document.createElement('div')
66
div.id = id
7+
div.innerHTML = innerHTML
78
return div
89
}
910

@@ -29,42 +30,45 @@ const colorList = [
2930
]
3031

3132
export default function(mind) {
32-
const locale = i18n[mind.locale] ? mind.locale : 'en'
33-
let bgOrFont
34-
const styleDiv = createDiv('nm-style')
35-
const tagDiv = createDiv('nm-tag')
36-
const iconDiv = createDiv('nm-icon')
37-
const urlDiv = createDiv('nm-url')
33+
function clearSelect(klass, remove) {
34+
var elems = mind.container.querySelectorAll(klass)
35+
;[].forEach.call(elems, function(el) {
36+
el.classList.remove(remove)
37+
})
38+
}
3839

39-
styleDiv.innerHTML = `
40-
<div class="nm-fontsize-container">
41-
${['15', '24', '32']
40+
// create element
41+
const locale = i18n[mind.locale] ? mind.locale : 'en'
42+
const styleDiv = createDiv('nm-style', `
43+
<div class="nm-fontsize-container">
44+
${['15', '24', '32']
4245
.map(size => {
4346
return `<div class="size" data-size="${size}">
44-
<svg class="icon" style="width: ${size}px;height: ${size}px" aria-hidden="true">
45-
<use xlink:href="#icon-a"></use>
46-
</svg></div>`
47+
<svg class="icon" style="width: ${size}px;height: ${size}px" aria-hidden="true">
48+
<use xlink:href="#icon-a"></use>
49+
</svg></div>`
4750
})
4851
.join('')}<div class="bold"><svg class="icon" aria-hidden="true">
49-
<use xlink:href="#icon-B"></use>
50-
</svg></div>
51-
</div>
52-
<div class="nm-fontcolor-container">
53-
${colorList
52+
<use xlink:href="#icon-B"></use>
53+
</svg></div>
54+
</div>
55+
<div class="nm-fontcolor-container">
56+
${colorList
5457
.map(color => {
5558
return `<div class="split6"><div class="palette" data-color="${color}" style="background-color: ${color};"></div></div>`
5659
})
5760
.join('')}
58-
</div>
59-
<div class="bof">
60-
<span class="font">${i18n[locale].font}</span>
61-
<span class="background">${i18n[locale].background}</span>
62-
</div>
63-
`
64-
tagDiv.innerHTML = `${i18n[locale].tag}<input class="nm-tag" tabindex="-1" placeholder="${i18n[locale].tagsSeparate}" /><br>`
65-
iconDiv.innerHTML = `${i18n[locale].icon}<input class="nm-icon" tabindex="-1" placeholder="${i18n[locale].iconsSeparate}" /><br>`
66-
urlDiv.innerHTML = `${i18n[locale].url}<input class="nm-url" tabindex="-1" /><br>`
61+
</div>
62+
<div class="bof">
63+
<span class="font">${i18n[locale].font}</span>
64+
<span class="background">${i18n[locale].background}</span>
65+
</div>`)
66+
const tagDiv = createDiv('nm-tag', `${i18n[locale].tag}<input class="nm-tag" tabindex="-1" placeholder="${i18n[locale].tagsSeparate}" />`)
67+
const iconDiv = createDiv('nm-icon', `${i18n[locale].icon}<input class="nm-icon" tabindex="-1" placeholder="${i18n[locale].iconsSeparate}" />`)
68+
const urlDiv = createDiv('nm-url', `${i18n[locale].url}<input class="nm-url" tabindex="-1" />`)
69+
const memoDiv = createDiv('nm-memo', `${i18n[locale].memo || 'Memo'}<textarea class="nm-memo" rows="5" tabindex="-1" />`)
6770

71+
// create container
6872
const menuContainer = document.createElement('nmenu')
6973
menuContainer.innerHTML = `
7074
<div class="button-container"><svg class="icon" aria-hidden="true">
@@ -75,23 +79,22 @@ export default function(mind) {
7579
menuContainer.appendChild(tagDiv)
7680
menuContainer.appendChild(iconDiv)
7781
menuContainer.appendChild(urlDiv)
82+
menuContainer.appendChild(memoDiv)
7883
menuContainer.hidden = true
79-
80-
function clearSelect(klass, remove) {
81-
var elems = mind.container.querySelectorAll(klass)
82-
;[].forEach.call(elems, function(el) {
83-
el.classList.remove(remove)
84-
})
85-
}
86-
8784
mind.container.append(menuContainer)
85+
86+
// query input element
8887
const sizeSelector = menuContainer.querySelectorAll('.size')
8988
const bold:HTMLElement = menuContainer.querySelector('.bold')
9089
const buttonContainer:HTMLElement = menuContainer.querySelector('.button-container')
9190
const fontBtn:HTMLElement = menuContainer.querySelector('.font')
9291
const tagInput:HTMLInputElement = mind.container.querySelector('.nm-tag')
9392
const iconInput:HTMLInputElement = mind.container.querySelector('.nm-icon')
9493
const urlInput:HTMLInputElement = mind.container.querySelector('.nm-url')
94+
const memoInput:HTMLInputElement = mind.container.querySelector('.nm-memo')
95+
96+
// handle input and button click
97+
let bgOrFont
9598
menuContainer.onclick = e => {
9699
if (!mind.currentNode) return
97100
const nodeObj = mind.currentNode.nodeObj
@@ -170,6 +173,10 @@ export default function(mind) {
170173
if (!mind.currentNode) return
171174
mind.updateNodeHyperLink(mind.currentNode.nodeObj, e.target.value)
172175
}
176+
memoInput.onchange = (e:InputEvent & { target: HTMLInputElement}) => {
177+
if (!mind.currentNode) return
178+
mind.currentNode.nodeObj.memo = e.target.value
179+
}
173180
let state = 'open'
174181
buttonContainer.onclick = e => {
175182
if (state === 'open') {
@@ -182,6 +189,8 @@ export default function(mind) {
182189
buttonContainer.innerHTML = `<svg class="icon" aria-hidden="true"><use xlink:href="#icon-close"></use></svg>`
183190
}
184191
}
192+
193+
// handle node selection
185194
mind.bus.addListener('unselectNode', function() {
186195
menuContainer.hidden = true
187196
})
@@ -217,10 +226,7 @@ export default function(mind) {
217226
} else {
218227
iconInput.value = ''
219228
}
220-
if (nodeObj.hyperLink) {
221-
urlInput.value = nodeObj.hyperLink
222-
} else {
223-
urlInput.value = ''
224-
}
229+
urlInput.value = nodeObj.hyperLink || ''
230+
memoInput.value = nodeObj.memo || ''
225231
})
226232
}

0 commit comments

Comments
 (0)