Merge pull request #389 from mredigonda/mentions-parser
Mentions parser
This commit is contained in:
commit
7dd88a8f82
|
@ -7,6 +7,7 @@ import AdminDataActions from 'actions/admin-data-actions';
|
||||||
import i18n from 'lib-app/i18n';
|
import i18n from 'lib-app/i18n';
|
||||||
import API from 'lib-app/api-call';
|
import API from 'lib-app/api-call';
|
||||||
import SessionStore from 'lib-app/session-store';
|
import SessionStore from 'lib-app/session-store';
|
||||||
|
import MentionsParser from 'lib-app/mentions-parser';
|
||||||
|
|
||||||
import TicketEvent from 'app-components/ticket-event';
|
import TicketEvent from 'app-components/ticket-event';
|
||||||
import AreYouSure from 'app-components/are-you-sure';
|
import AreYouSure from 'app-components/are-you-sure';
|
||||||
|
@ -73,7 +74,7 @@ class TicketViewer extends React.Component {
|
||||||
</div>
|
</div>
|
||||||
{this.props.editable ? this.renderEditableHeaders() : this.renderHeaders()}
|
{this.props.editable ? this.renderEditableHeaders() : this.renderHeaders()}
|
||||||
<div className="ticket-viewer__content">
|
<div className="ticket-viewer__content">
|
||||||
<TicketEvent type="COMMENT" author={ticket.author} content={ticket.content} date={ticket.date} file={ticket.file}/>
|
<TicketEvent type="COMMENT" author={ticket.author} content={this.props.userStaff ? MentionsParser.parse(ticket.content) : ticket.content} date={ticket.date} file={ticket.file}/>
|
||||||
</div>
|
</div>
|
||||||
<div className="ticket-viewer__comments">
|
<div className="ticket-viewer__comments">
|
||||||
{ticket.events && ticket.events.map(this.renderTicketEvent.bind(this))}
|
{ticket.events && ticket.events.map(this.renderTicketEvent.bind(this))}
|
||||||
|
@ -206,6 +207,9 @@ class TicketViewer extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
renderTicketEvent(options, index) {
|
renderTicketEvent(options, index) {
|
||||||
|
if (this.props.userStaff) {
|
||||||
|
options.content = MentionsParser.parse(options.content);
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<TicketEvent {...options} author={(!_.isEmpty(options.author)) ? options.author : this.props.ticket.author} key={index} />
|
<TicketEvent {...options} author={(!_.isEmpty(options.author)) ? options.author : this.props.ticket.author} key={index} />
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,6 +7,7 @@ import ArticlesActions from 'actions/articles-actions';
|
||||||
import SessionStore from 'lib-app/session-store';
|
import SessionStore from 'lib-app/session-store';
|
||||||
import i18n from 'lib-app/i18n';
|
import i18n from 'lib-app/i18n';
|
||||||
import API from 'lib-app/api-call';
|
import API from 'lib-app/api-call';
|
||||||
|
import MentionsParser from 'lib-app/mentions-parser';
|
||||||
import DateTransformer from 'lib-core/date-transformer';
|
import DateTransformer from 'lib-core/date-transformer';
|
||||||
|
|
||||||
import AreYouSure from 'app-components/are-you-sure';
|
import AreYouSure from 'app-components/are-you-sure';
|
||||||
|
@ -76,7 +77,7 @@ class AdminPanelViewArticle extends React.Component {
|
||||||
<Header title={article.title}/>
|
<Header title={article.title}/>
|
||||||
|
|
||||||
<div className="admin-panel-view-article__article-content">
|
<div className="admin-panel-view-article__article-content">
|
||||||
<div dangerouslySetInnerHTML={{__html: article.content}}/>
|
<div dangerouslySetInnerHTML={{__html: MentionsParser.parse(article.content)}}/>
|
||||||
</div>
|
</div>
|
||||||
<div className="admin-panel-view-article__last-edited">
|
<div className="admin-panel-view-article__last-edited">
|
||||||
{i18n('LAST_EDITED_IN', {date: DateTransformer.transformToString(article.lastEdited)})}
|
{i18n('LAST_EDITED_IN', {date: DateTransformer.transformToString(article.lastEdited)})}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
const PARSING_TEXT = 0;
|
||||||
|
const PARSING_MENTION = 1;
|
||||||
|
|
||||||
|
class MentionsParser {
|
||||||
|
|
||||||
|
parse(text) {
|
||||||
|
let parsingLink = false;
|
||||||
|
let parsingType = PARSING_TEXT;
|
||||||
|
let parsingSegment = '';
|
||||||
|
let ans = '';
|
||||||
|
|
||||||
|
for(let index = 0; index < text.length; ++index){
|
||||||
|
let character = text[index];
|
||||||
|
|
||||||
|
if(character == '#'){
|
||||||
|
ans += this.compileSegment(parsingSegment, parsingType);
|
||||||
|
|
||||||
|
parsingLink = true;
|
||||||
|
parsingType = PARSING_MENTION;
|
||||||
|
parsingSegment = '';
|
||||||
|
} else if(!this.isAlphanumeric(character) && parsingLink){
|
||||||
|
ans += this.compileSegment(parsingSegment, parsingType);
|
||||||
|
|
||||||
|
parsingLink = false;
|
||||||
|
parsingType = PARSING_TEXT;
|
||||||
|
parsingSegment = character;
|
||||||
|
} else {
|
||||||
|
parsingSegment += character;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ans += this.compileSegment(parsingSegment, parsingType);
|
||||||
|
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
|
isAlphanumeric(string){
|
||||||
|
return /[a-zA-Z0-9]/.test(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
compileSegment(segment, parsingType){
|
||||||
|
switch(parsingType){
|
||||||
|
case PARSING_TEXT:
|
||||||
|
return segment;
|
||||||
|
case PARSING_MENTION:
|
||||||
|
return '<a href=' + root + '/admin/panel/tickets/view-ticket/' + segment + '>#' + segment + '</a>';
|
||||||
|
default:
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default new MentionsParser;
|
Loading…
Reference in New Issue