mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
152 lines
6.0 KiB
JavaScript
152 lines
6.0 KiB
JavaScript
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
import UserProfile from './user_profile.jsx';
|
|
|
|
import UserStore from 'stores/user_store.jsx';
|
|
|
|
import * as GlobalActions from 'action_creators/global_actions.jsx';
|
|
import * as TextFormatting from 'utils/text_formatting.jsx';
|
|
import * as Utils from 'utils/utils.jsx';
|
|
import Constants from 'utils/constants.jsx';
|
|
|
|
import {FormattedMessage, FormattedDate} from 'react-intl';
|
|
import React from 'react';
|
|
import {Link} from 'react-router';
|
|
|
|
export default class SearchResultsItem extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.handleFocusRHSClick = this.handleFocusRHSClick.bind(this);
|
|
}
|
|
|
|
handleFocusRHSClick(e) {
|
|
e.preventDefault();
|
|
GlobalActions.emitPostFocusRightHandSideFromSearch(this.props.post, this.props.isMentionSearch);
|
|
}
|
|
|
|
render() {
|
|
let channelName = null;
|
|
const channel = this.props.channel;
|
|
const timestamp = UserStore.getCurrentUser().update_at;
|
|
const user = this.props.user || {};
|
|
const post = this.props.post;
|
|
|
|
if (channel) {
|
|
channelName = channel.display_name;
|
|
if (channel.type === 'D') {
|
|
channelName = (
|
|
<FormattedMessage
|
|
id='search_item.direct'
|
|
defaultMessage='Direct Message'
|
|
/>
|
|
);
|
|
}
|
|
}
|
|
|
|
const formattingOptions = {
|
|
searchTerm: this.props.term,
|
|
mentionHighlight: this.props.isMentionSearch
|
|
};
|
|
|
|
let overrideUsername;
|
|
let disableProfilePopover = false;
|
|
if (post.props &&
|
|
post.props.from_webhook &&
|
|
post.props.override_username &&
|
|
global.window.mm_config.EnablePostUsernameOverride === 'true') {
|
|
overrideUsername = post.props.override_username;
|
|
disableProfilePopover = true;
|
|
}
|
|
|
|
return (
|
|
<div className='search-item__container'>
|
|
<div className='date-separator'>
|
|
<hr className='separator__hr'/>
|
|
<div className='separator__text'>
|
|
<FormattedDate
|
|
value={post.create_at}
|
|
day='numeric'
|
|
month='long'
|
|
year='numeric'
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div
|
|
className='post'
|
|
>
|
|
<div className='search-channel__name'>{channelName}</div>
|
|
<div className='post__content'>
|
|
<div className='post__img'>
|
|
<img
|
|
src={Utils.getProfilePicSrcForPost(post, timestamp)}
|
|
height='36'
|
|
width='36'
|
|
/>
|
|
</div>
|
|
<div>
|
|
<ul className='post__header'>
|
|
<li className='col__name'><strong>
|
|
<UserProfile
|
|
user={user}
|
|
overwriteName={overrideUsername}
|
|
disablePopover={disableProfilePopover}
|
|
/>
|
|
</strong></li>
|
|
<li className='col'>
|
|
<time className='search-item-time'>
|
|
<FormattedDate
|
|
value={post.create_at}
|
|
hour12={true}
|
|
hour='2-digit'
|
|
minute='2-digit'
|
|
/>
|
|
</time>
|
|
</li>
|
|
<li>
|
|
<Link
|
|
to={'/' + window.location.pathname.split('/')[1] + '/pl/' + post.id}
|
|
className='search-item__jump'
|
|
>
|
|
<FormattedMessage
|
|
id='search_item.jump'
|
|
defaultMessage='Jump'
|
|
/>
|
|
</Link>
|
|
</li>
|
|
<li>
|
|
<a
|
|
href='#'
|
|
className='comment-icon__container search-item__comment'
|
|
onClick={this.handleFocusRHSClick}
|
|
>
|
|
<span
|
|
className='comment-icon'
|
|
dangerouslySetInnerHTML={{__html: Constants.REPLY_ICON}}
|
|
/>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
<div className='search-item-snippet'>
|
|
<span
|
|
onClick={TextFormatting.handleClick}
|
|
dangerouslySetInnerHTML={{__html: TextFormatting.formatText(post.message, formattingOptions)}}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
SearchResultsItem.propTypes = {
|
|
post: React.PropTypes.object,
|
|
user: React.PropTypes.object,
|
|
channel: React.PropTypes.object,
|
|
isMentionSearch: React.PropTypes.bool,
|
|
term: React.PropTypes.string
|
|
};
|