PLT-4100 Made SuggestionList dividers optional (#3990)
* Made SuggestionList dividers optional * Stopped mutating the User object in the AtMentionProvider
Этот коммит содержится в:
коммит произвёл
enahum
родитель
3bc0e833f7
Коммит
47f92441ac
@@ -99,7 +99,7 @@ class AtMentionSuggestion extends Suggestion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterUsersByPrefix(users, prefix, limit) {
|
function filterUsersByPrefix(users, prefix, limit, type) {
|
||||||
const filtered = [];
|
const filtered = [];
|
||||||
|
|
||||||
for (const id of Object.keys(users)) {
|
for (const id of Object.keys(users)) {
|
||||||
@@ -117,7 +117,8 @@ function filterUsersByPrefix(users, prefix, limit) {
|
|||||||
(user.first_name && user.first_name.toLowerCase().startsWith(prefix)) ||
|
(user.first_name && user.first_name.toLowerCase().startsWith(prefix)) ||
|
||||||
(user.last_name && user.last_name.toLowerCase().startsWith(prefix)) ||
|
(user.last_name && user.last_name.toLowerCase().startsWith(prefix)) ||
|
||||||
(user.nickname && user.nickname.toLowerCase().startsWith(prefix))) {
|
(user.nickname && user.nickname.toLowerCase().startsWith(prefix))) {
|
||||||
filtered.push(user);
|
// create a new object here since we're mutating it by adding the type field
|
||||||
|
filtered.push(Object.assign({}, user, {type}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,15 +146,15 @@ export default class AtMentionProvider {
|
|||||||
|
|
||||||
// Filter users by prefix.
|
// Filter users by prefix.
|
||||||
const filteredMembers = filterUsersByPrefix(
|
const filteredMembers = filterUsersByPrefix(
|
||||||
channelMembers, prefix, MaxUserSuggestions);
|
channelMembers, prefix, MaxUserSuggestions, Constants.MENTION_MEMBERS);
|
||||||
const filteredNonmembers = filterUsersByPrefix(
|
const filteredNonmembers = filterUsersByPrefix(
|
||||||
channelNonmembers, prefix, MaxUserSuggestions - filteredMembers.length);
|
channelNonmembers, prefix, MaxUserSuggestions - filteredMembers.length, Constants.MENTION_NONMEMBERS);
|
||||||
let filteredSpecialMentions = [];
|
let filteredSpecialMentions = [];
|
||||||
if (!pretext.startsWith('/msg')) {
|
if (!pretext.startsWith('/msg')) {
|
||||||
filteredSpecialMentions = ['here', 'channel', 'all'].filter((item) => {
|
filteredSpecialMentions = ['here', 'channel', 'all'].filter((item) => {
|
||||||
return item.startsWith(prefix);
|
return item.startsWith(prefix);
|
||||||
}).map((name) => {
|
}).map((name) => {
|
||||||
return {username: name};
|
return {username: name, type: Constants.MENTION_SPECIAL};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,16 +174,6 @@ export default class AtMentionProvider {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
filteredMembers.forEach((item) => {
|
|
||||||
item.type = Constants.MENTION_MEMBERS;
|
|
||||||
});
|
|
||||||
filteredNonmembers.forEach((item) => {
|
|
||||||
item.type = Constants.MENTION_NONMEMBERS;
|
|
||||||
});
|
|
||||||
filteredSpecialMentions.forEach((item) => {
|
|
||||||
item.type = Constants.MENTION_SPECIAL;
|
|
||||||
});
|
|
||||||
|
|
||||||
const filtered = filteredMembers.concat(filteredSpecialMentions).concat(filteredNonmembers);
|
const filtered = filteredMembers.concat(filteredSpecialMentions).concat(filteredNonmembers);
|
||||||
|
|
||||||
const mentions = filtered.map((user) => '@' + user.username);
|
const mentions = filtered.map((user) => '@' + user.username);
|
||||||
|
|||||||
@@ -189,6 +189,7 @@ export default class SuggestionBox extends React.Component {
|
|||||||
<SuggestionListComponent
|
<SuggestionListComponent
|
||||||
suggestionId={this.suggestionId}
|
suggestionId={this.suggestionId}
|
||||||
location={this.props.listStyle}
|
location={this.props.listStyle}
|
||||||
|
renderDividers={this.props.renderDividers}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -220,6 +221,7 @@ SuggestionBox.propTypes = {
|
|||||||
value: React.PropTypes.string.isRequired,
|
value: React.PropTypes.string.isRequired,
|
||||||
providers: React.PropTypes.arrayOf(React.PropTypes.object),
|
providers: React.PropTypes.arrayOf(React.PropTypes.object),
|
||||||
listStyle: React.PropTypes.string,
|
listStyle: React.PropTypes.string,
|
||||||
|
renderDividers: React.PropTypes.bool,
|
||||||
|
|
||||||
// explicitly name any input event handlers we override and need to manually call
|
// explicitly name any input event handlers we override and need to manually call
|
||||||
onInput: React.PropTypes.func,
|
onInput: React.PropTypes.func,
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ export default class SuggestionList extends React.Component {
|
|||||||
// ReactComponent names need to be upper case when used in JSX
|
// ReactComponent names need to be upper case when used in JSX
|
||||||
const Component = this.state.components[i];
|
const Component = this.state.components[i];
|
||||||
|
|
||||||
if (item.type !== lastType) {
|
if (this.props.renderDividers && item.type !== lastType) {
|
||||||
items.push(this.renderDivider(item.type));
|
items.push(this.renderDivider(item.type));
|
||||||
lastType = item.type;
|
lastType = item.type;
|
||||||
}
|
}
|
||||||
@@ -157,5 +157,10 @@ export default class SuggestionList extends React.Component {
|
|||||||
|
|
||||||
SuggestionList.propTypes = {
|
SuggestionList.propTypes = {
|
||||||
suggestionId: React.PropTypes.string.isRequired,
|
suggestionId: React.PropTypes.string.isRequired,
|
||||||
location: React.PropTypes.string
|
location: React.PropTypes.string,
|
||||||
|
renderDividers: React.PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
SuggestionList.defaultProps = {
|
||||||
|
renderDividers: false
|
||||||
};
|
};
|
||||||
@@ -198,6 +198,7 @@ export default class Textbox extends React.Component {
|
|||||||
providers={this.suggestionProviders}
|
providers={this.suggestionProviders}
|
||||||
channelId={this.props.channelId}
|
channelId={this.props.channelId}
|
||||||
value={this.props.messageText}
|
value={this.props.messageText}
|
||||||
|
renderDividers={true}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
ref='preview'
|
ref='preview'
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user