Moved public and private channels into separate sections in the search autocomplete

Этот коммит содержится в:
hmhealey
2015-11-05 13:32:06 -05:00
родитель 52e75012c3
Коммит e29342d426
3 изменённых файлов: 78 добавлений и 40 удалений

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

@@ -3,6 +3,8 @@
const AsyncClient = require('../utils/async_client.jsx'); const AsyncClient = require('../utils/async_client.jsx');
const Client = require('../utils/client.jsx'); const Client = require('../utils/client.jsx');
const Utils = require('../utils/utils.jsx');
const Modal = ReactBootstrap.Modal; const Modal = ReactBootstrap.Modal;
export default class EditChannelPurposeModal extends React.Component { export default class EditChannelPurposeModal extends React.Component {
@@ -75,11 +77,6 @@ export default class EditChannelPurposeModal extends React.Component {
title = <span>{'Edit Purpose for '}<span className='name'>{this.props.channel.display_name}</span></span>; title = <span>{'Edit Purpose for '}<span className='name'>{this.props.channel.display_name}</span></span>;
} }
let channelTerm = 'Channel';
if (this.props.channel.channelType === 'P') {
channelTerm = 'Group';
}
return ( return (
<Modal <Modal
className='modal-edit-channel-purpose' className='modal-edit-channel-purpose'
@@ -93,7 +90,7 @@ export default class EditChannelPurposeModal extends React.Component {
</Modal.Title> </Modal.Title>
</Modal.Header> </Modal.Header>
<Modal.Body> <Modal.Body>
<p>{`Describe how this ${channelTerm} should be used.`}</p> <p>{`Describe how this ${Utils.getChannelTerm(this.props.channel.channelType)} should be used.`}</p>
<textarea <textarea
ref='purpose' ref='purpose'
className='form-control no-resize' className='form-control no-resize'

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

@@ -6,6 +6,7 @@ const KeyCodes = require('../utils/constants.jsx').KeyCodes;
const Popover = ReactBootstrap.Popover; const Popover = ReactBootstrap.Popover;
const UserStore = require('../stores/user_store.jsx'); const UserStore = require('../stores/user_store.jsx');
const Utils = require('../utils/utils.jsx'); const Utils = require('../utils/utils.jsx');
const Constants = require('../utils/constants.jsx');
const patterns = new Map([ const patterns = new Map([
['channels', /\b(?:in|channel):\s*(\S*)$/i], ['channels', /\b(?:in|channel):\s*(\S*)$/i],
@@ -26,6 +27,9 @@ export default class SearchAutocomplete extends React.Component {
this.scrollToItem = this.scrollToItem.bind(this); this.scrollToItem = this.scrollToItem.bind(this);
this.updateSuggestions = this.updateSuggestions.bind(this); this.updateSuggestions = this.updateSuggestions.bind(this);
this.renderChannelSuggestion = this.renderChannelSuggestion.bind(this);
this.renderUserSuggestion = this.renderUserSuggestion.bind(this);
this.state = { this.state = {
show: false, show: false,
mode: '', mode: '',
@@ -230,6 +234,46 @@ export default class SearchAutocomplete extends React.Component {
}); });
} }
renderChannelSuggestion(channel) {
let className = 'search-autocomplete__item';
if (channel.name === this.getSelection()) {
className += ' selected';
}
return (
<div
key={channel.name}
ref={channel.name}
onClick={this.handleClick.bind(this, channel.name)}
className={className}
>
{channel.name}
</div>
);
}
renderUserSuggestion(user) {
let className = 'search-autocomplete__item';
if (user.username === this.getSelection()) {
className += ' selected';
}
return (
<div
key={user.username}
ref={user.username}
onClick={this.handleClick.bind(this, user.username)}
className={className}
>
<img
className='profile-img rounded'
src={'/api/v1/users/' + user.id + '/image?time=' + user.update_at}
/>
{user.username}
</div>
);
}
render() { render() {
if (!this.state.show || this.state.suggestions.length === 0) { if (!this.state.show || this.state.suggestions.length === 0) {
return null; return null;
@@ -238,45 +282,33 @@ export default class SearchAutocomplete extends React.Component {
let suggestions = []; let suggestions = [];
if (this.state.mode === 'channels') { if (this.state.mode === 'channels') {
suggestions = this.state.suggestions.map((channel, index) => { const publicChannels = this.state.suggestions.filter((channel) => channel.type === Constants.OPEN_CHANNEL);
let className = 'search-autocomplete__item'; if (publicChannels.length > 0) {
if (this.state.selection === index) { suggestions.push(
className += ' selected';
}
return (
<div <div
key={channel.name} key='public-channel-divider'
ref={channel.name} className='search-autocomplete__divider'
onClick={this.handleClick.bind(this, channel.name)}
className={className}
> >
{channel.name} {'Public ' + Utils.getChannelTerm(Constants.OPEN_CHANNEL) + 's'}
</div> </div>
); );
}); suggestions = suggestions.concat(publicChannels.map(this.renderChannelSuggestion));
}
const privateChannels = this.state.suggestions.filter((channel) => channel.type === Constants.PRIVATE_CHANNEL);
if (privateChannels.length > 0) {
suggestions.push(
<div
key='private-channel-divider'
className='search-autocomplete__divider'
>
{'Private ' + Utils.getChannelTerm(Constants.PRIVATE_CHANNEL) + 's'}
</div>
);
suggestions = suggestions.concat(privateChannels.map(this.renderChannelSuggestion));
}
} else if (this.state.mode === 'users') { } else if (this.state.mode === 'users') {
suggestions = this.state.suggestions.map((user, index) => { suggestions = this.state.suggestions.map(this.renderUserSuggestion);
let className = 'search-autocomplete__item';
if (this.state.selection === index) {
className += ' selected';
}
return (
<div
key={user.username}
ref={user.username}
onClick={this.handleClick.bind(this, user.username)}
className={className}
>
<img
className='profile-img rounded'
src={'/api/v1/users/' + user.id + '/image?time=' + user.update_at}
/>
{user.username}
</div>
);
});
} }
return ( return (

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

@@ -1125,3 +1125,12 @@ export function sortByDisplayName(a, b) {
} }
return 0; return 0;
} }
export function getChannelTerm(channelType) {
let channelTerm = 'Channel';
if (channelType === Constants.PRIVATE_CHANNEL) {
channelTerm = 'Group';
}
return channelTerm;
}