diff --git a/client/src/app-components/ticket-viewer.js b/client/src/app-components/ticket-viewer.js
index 79cf0048..8429489b 100644
--- a/client/src/app-components/ticket-viewer.js
+++ b/client/src/app-components/ticket-viewer.js
@@ -7,6 +7,7 @@ import AdminDataActions from 'actions/admin-data-actions';
import i18n from 'lib-app/i18n';
import API from 'lib-app/api-call';
import SessionStore from 'lib-app/session-store';
+import MentionsParser from 'lib-app/mentions-parser';
import TicketEvent from 'app-components/ticket-event';
import AreYouSure from 'app-components/are-you-sure';
@@ -73,7 +74,7 @@ class TicketViewer extends React.Component {
{this.props.editable ? this.renderEditableHeaders() : this.renderHeaders()}
-
+
{ticket.events && ticket.events.map(this.renderTicketEvent.bind(this))}
@@ -206,6 +207,9 @@ class TicketViewer extends React.Component {
}
renderTicketEvent(options, index) {
+ if (this.props.userStaff) {
+ options.content = MentionsParser.parse(options.content);
+ }
return (
);
diff --git a/client/src/app/admin/panel/articles/admin-panel-view-article.js b/client/src/app/admin/panel/articles/admin-panel-view-article.js
index d0d4fd98..bd97b333 100644
--- a/client/src/app/admin/panel/articles/admin-panel-view-article.js
+++ b/client/src/app/admin/panel/articles/admin-panel-view-article.js
@@ -7,6 +7,7 @@ import ArticlesActions from 'actions/articles-actions';
import SessionStore from 'lib-app/session-store';
import i18n from 'lib-app/i18n';
import API from 'lib-app/api-call';
+import MentionsParser from 'lib-app/mentions-parser';
import DateTransformer from 'lib-core/date-transformer';
import AreYouSure from 'app-components/are-you-sure';
@@ -76,7 +77,7 @@ class AdminPanelViewArticle extends React.Component {
{i18n('LAST_EDITED_IN', {date: DateTransformer.transformToString(article.lastEdited)})}
diff --git a/client/src/lib-app/mentions-parser.js b/client/src/lib-app/mentions-parser.js
new file mode 100644
index 00000000..81579c57
--- /dev/null
+++ b/client/src/lib-app/mentions-parser.js
@@ -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 '
#' + segment + '';
+ default:
+ return '';
+ }
+ }
+};
+
+export default new MentionsParser;