Have arrow key selection working, but visually does not highlight correct mention. Also if user continues to type things might get weird.

Этот коммит содержится в:
Reed Garmsen
2015-07-11 12:57:28 -07:00
родитель 63b9dd85b6
Коммит 59b2a42ac8
3 изменённых файлов: 63 добавлений и 20 удалений

Просмотреть файл

@@ -6,22 +6,41 @@ module.exports = React.createClass({
handleClick: function() { handleClick: function() {
this.props.handleClick(this.props.username); this.props.handleClick(this.props.username);
}, },
handleKeyDown: function(e) { /*handleUp: function(e) {
var selectedMention = this.state.selectedMention <= nunMentions ? this.state.selectedMention : 1; var selectedMention = this.state.selectedMention <= nunMentions ? this.state.selectedMention : 1;
console.log("Here: keyDown"); console.log("Here: keyDown");
if (e.key === "ArrowUp") { if (e.key === "ArrowUp") {
//selectedMention = selectedMention === numMentions ? 1 : selectedMention++; //selectedMention = selectedMention === numMentions ? 1 : selectedMention++;
e.preventDefault();
this.props.handleFocus(this.props.listId); this.props.handleFocus(this.props.listId);
} }
else if (e.key === "ArrowDown") { else if (e.key === "ArrowDown") {
//selectedMention = selectedMention === 1 ? numMentions : selectedMention--; //selectedMention = selectedMention === 1 ? numMentions : selectedMention--;
e.preventDefault();
this.props.handleFocus(this.props.listId); this.props.handleFocus(this.props.listId);
} }
else if (e.key === "Enter") { else if (e.key === "Enter") {
e.preventDefault();
this.handleClick(); this.handleClick();
} }
},*/
handleFocus: function() {
console.log("Entering " + this.props.listId);
this.setState({ isFocused: "mentions-focus" })
},
handleBlur: function() {
console.log("Leaving " + this.props.listId);
this.setState({ isFocused: "" });
},
getInitialState: function() {
if (this.props.isFocus) {
return { isFocused: "mentions-focus" };
}
else {
return { isFocused: "" };
}
}, },
render: function() { render: function() {
var icon; var icon;
@@ -32,7 +51,7 @@ module.exports = React.createClass({
icon = <span><i className="mention-img fa fa-users fa-2x"></i></span>; icon = <span><i className="mention-img fa fa-users fa-2x"></i></span>;
} }
return ( return (
<div className="mentions-name" ref="mention" onClick={this.handleClick} onKeyDown={this.handleKeyDown}> <div className={"mentions-name " + this.state.isFocused} tabIndex={this.props.id} onClick={this.handleClick} onFocus={this.handleFocus} onBlur={this.handleBlur}>
<div className="pull-left">{icon}</div> <div className="pull-left">{icon}</div>
<div className="pull-left mention-align"><span>@{this.props.username}</span><span className="mention-fullname">{this.props.secondary_text}</span></div> <div className="pull-left mention-align"><span>@{this.props.username}</span><span className="mention-fullname">{this.props.secondary_text}</span></div>
</div> </div>

Просмотреть файл

@@ -17,26 +17,44 @@ module.exports = React.createClass({
displayName: "MentionList", displayName: "MentionList",
componentDidMount: function() { componentDidMount: function() {
PostStore.addMentionDataChangeListener(this._onChange); PostStore.addMentionDataChangeListener(this._onChange);
console.log("here!");
var self = this; var self = this;
$('body').on('keypress.mentionlist', '#'+this.props.id, $('body').on('keypress.mentionlist', '#'+this.props.id,
function(e) { function(e) {
if (!self.isEmpty() && self.state.mentionText != '-1' && e.which === 13) { if (!self.isEmpty() && self.state.mentionText != '-1' && (e.which === 13 || e.which === 9)) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
self.addFirstMention(); self.addCurrentMention();
}
}
);
$('body').on('keydown.mentionlist', '#'+this.props.id,
function(e) {
console.log("here! top");
if (!self.isEmpty() && self.state.mentionText != '-1' && (e.which === 13 || e.which === 9)) {
e.stopPropagation();
e.preventDefault();
self.addCurrentMention();
} }
if (!self.isEmpty() && self.state.mentionText != '-1' && e.which === 38) { if (!self.isEmpty() && self.state.mentionText != '-1' && e.which === 38) {
console.log("here! 38");
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
self.handleFocus(0);
if (self.handleSelection(self.state.selectedMention - 1))
self.setState({ selectedMention: self.state.selectedMention - 1 });
else {
self.setState({ selectedMention: 0});
}
} }
if (!self.isEmpty() && self.state.mentionText != '-1' && e.which === 40) { if (!self.isEmpty() && self.state.mentionText != '-1' && e.which === 40) {
console.log("here! 40");
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
self.addFirstMention(UserStore.getActiveOnlyProfiles().length - 1);
if (self.handleSelection(self.state.selectedMention + 1))
self.setState({ selectedMention: self.state.selectedMention + 1 });
else
self.setState({ selectedMention: 0 });
} }
} }
); );
@@ -68,13 +86,17 @@ module.exports = React.createClass({
this.setState({ mentionText: '-1' }); this.setState({ mentionText: '-1' });
}, },
handleFocus: function(listId) { handleSelection: function(listId) {
console.log("here! 1"); console.log("here! 1");
var mention = this.refs['mention' + index]; var mention = this.refs['mention' + listId];
if (!mention) return; if (!mention)
var mentionRef = mention.refs.mention; return false;
mentionRef.getDOMNode().focus(); else
console.log("here! 2"); return true;
},
addCurrentMention: function() {
if (!this.refs['mention' + this.state.selectedMention]) return;
this.refs['mention' + this.state.selectedMention].handleClick();
}, },
addFirstMention: function() { addFirstMention: function() {
if (!this.refs.mention0) return; if (!this.refs.mention0) return;
@@ -93,7 +115,7 @@ module.exports = React.createClass({
return false; return false;
}, },
getInitialState: function() { getInitialState: function() {
return { excludeUsers: [], mentionText: "-1", selectedMention: 1 }; return { excludeUsers: [], mentionText: "-1", selectedMention: 0 };
}, },
render: function() { render: function() {
var mentionText = this.state.mentionText; var mentionText = this.state.mentionText;
@@ -138,14 +160,14 @@ module.exports = React.createClass({
if (firstName.lastIndexOf(mentionText,0) === 0 if (firstName.lastIndexOf(mentionText,0) === 0
|| lastName.lastIndexOf(mentionText,0) === 0 || users[i].username.lastIndexOf(mentionText,0) === 0) { || lastName.lastIndexOf(mentionText,0) === 0 || users[i].username.lastIndexOf(mentionText,0) === 0) {
mentions[i+1] = ( mentions[index] = (
<Mention <Mention
ref={'mention' + index} ref={'mention' + index}
username={users[i].username} username={users[i].username}
secondary_text={users[i].secondary_text} secondary_text={users[i].secondary_text}
id={users[i].id} id={users[i].id}
listId={index} listId={index}
handleFocus={this.handleFocus} isFocus={this.state.selectedMention === index ? true : false}
handleClick={this.handleClick} /> handleClick={this.handleClick} />
); );
index++; index++;
@@ -164,8 +186,6 @@ module.exports = React.createClass({
left: $mention_tab.offset().left left: $mention_tab.offset().left
}; };
//mentions[this.state.selectedMention].focus();
return ( return (
<div className="mentions--top" style={style}> <div className="mentions--top" style={style}>
<div ref="mentionlist" className="mentions-box"> <div ref="mentionlist" className="mentions-box">

Просмотреть файл

@@ -37,6 +37,10 @@
} }
} }
.mentions-focus {
background-color: #E6F2FA;
}
.mentions-text { .mentions-text {
font-color:black; font-color:black;
} }