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;