Skip to content

Commit 2fb435b

Browse files
committed
adds support for tab, enter, and click complete on dropdown, closes #15
1 parent b110e0d commit 2fb435b

File tree

5 files changed

+39
-19
lines changed

5 files changed

+39
-19
lines changed

src/content/components/Container.jsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,14 @@ class Container extends React.Component {
3737
this.unmount = this.unmount.bind(this)
3838
}
3939

40-
componentWillMount() {
41-
$('html').on('click', this.unmountOnClickOutside)
40+
componentDidMount() {
41+
// we add this event listener in a callback because
42+
// without the jump to the back of the event loop, this
43+
// listener picks up the "click" event when a user clicks
44+
// the at.js dropdown to select a command
45+
setTimeout(() => {
46+
$('html').on('click', this.unmountOnClickOutside)
47+
}, 0)
4248
}
4349

4450
componentWillUnmount() {

src/content/fields/ContentEditable.js

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,33 @@ import Field from './Field'
33

44
class ContentEditable extends Field {
55
getText() {
6-
return this.$element[0].innerHTML
6+
return this.$element[0].textContent
77
}
88

99
persistSelection() {
10-
this.range = rangy.getSelection().getRangeAt(0)
10+
let selection = rangy.getSelection()
11+
if (selection.rangeCount > 0) {
12+
this.range = rangy.getSelection().getRangeAt(0)
13+
} else {
14+
let range = rangy.createRange()
15+
range.selectNodeContents(this.$element.get(0))
16+
range.collapse(false)
17+
this.range = range
18+
}
1119
}
1220

1321
removeCommand(match) {
1422
super.removeCommand()
23+
1524
let range = this.range
16-
let container = range.startContainer
17-
if (container && container.classList && container.classList.contains("atwho-query")) {
18-
range.selectNode(container)
19-
} else {
20-
range.setStart(range.startContainer, range.startOffset - match.length)
21-
}
22-
range.deleteContents()
25+
let container = range.startContainer.closest ? range.startContainer : range.startContainer.parentElement
26+
let query = container.closest('.atwho-query') ||
27+
container.querySelector('.atwho-query') ||
28+
container.querySelector('.atwho-inserted') ||
29+
container.querySelector('.atwho-inserted')
2330

24-
if (range.startContainer.innerHTML == "") {
25-
range.selectNodeContents(range.startContainer.parentNode)
26-
}
31+
range.selectNode(query)
32+
range.deleteContents()
2733
}
2834

2935
insertText(text) {

src/content/fields/Field.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ class Field {
2020

2121
observe() {
2222
this.setupQuickSelect()
23-
this.$element.on('keyup', this.listen)
23+
this.$element.on('keyup inserted.atwho', this.listen)
2424
}
2525

26-
listen() {
26+
listen(e) {
2727
let { command, match } = Commands.match(this.getText())
2828
if (command) {
2929
this.mount(command, match)
@@ -64,7 +64,9 @@ class Field {
6464
this.focus()
6565
}
6666

67-
removeCommand() {}
67+
removeCommand() {
68+
this.$element.atwho('hide')
69+
}
6870

6971
mount(Component, match) {
7072
this.persistSelection()

src/content/lib/at.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export function setup($element) {
88
at: "/",
99
data: Commands.getAtData(),
1010
displayTpl: "<li>${name}<img src='${icon}' /></li>",
11-
displayTimeout: 0
11+
insertTpl: "/${name}",
12+
displayTimeout: 300,
13+
suffix: ""
1214
})
1315
}

src/content/vendor/jquery.atwho.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,10 @@ EditableController = (function(superClass) {
805805
};
806806

807807
EditableController.prototype.rect = function() {
808+
if (this.query.el.length == 0) {
809+
return
810+
}
811+
808812
var $iframe, iframeOffset, rect;
809813
rect = this.query.el.offset();
810814
if (this.app.iframe && !this.app.iframeAsRoot) {
@@ -824,7 +828,7 @@ EditableController = (function(superClass) {
824828
if (range = this._getRange()) {
825829
range.setEndAfter(this.query.el[0]);
826830
range.collapse(false);
827-
range.insertNode(suffixNode = this.app.document.createTextNode("\u200D" + suffix));
831+
range.insertNode(suffixNode = this.app.document.createTextNode(suffix));
828832
this._setRange('after', suffixNode, range);
829833
}
830834
if (!this.$inputor.is(':focus')) {

0 commit comments

Comments
 (0)