diff options
-rw-r--r-- | web/react/components/posts_view_container.jsx | 5 | ||||
-rw-r--r-- | web/react/components/rhs_root_post.jsx | 4 | ||||
-rw-r--r-- | web/react/components/search_autocomplete.jsx | 15 | ||||
-rw-r--r-- | web/react/utils/markdown.jsx | 2 | ||||
-rw-r--r-- | web/react/utils/text_formatting.jsx | 8 | ||||
-rw-r--r-- | web/react/utils/utils.jsx | 5 | ||||
-rw-r--r-- | web/sass-files/sass/partials/_markdown.scss | 11 | ||||
-rw-r--r-- | web/sass-files/sass/partials/_popover.scss | 28 | ||||
-rw-r--r-- | web/sass-files/sass/partials/_post.scss | 2 |
9 files changed, 59 insertions, 21 deletions
diff --git a/web/react/components/posts_view_container.jsx b/web/react/components/posts_view_container.jsx index 761664602..6cdf69402 100644 --- a/web/react/components/posts_view_container.jsx +++ b/web/react/components/posts_view_container.jsx @@ -85,11 +85,6 @@ export default class PostsViewContainer extends React.Component { const channels = this.state.channels.slice(); const channelId = ChannelStore.getCurrentId(); - // Has the channel really changed? - if (channelId === channels[this.state.currentChannelIndex]) { - return; - } - PostStore.clearUnseenDeletedPosts(channelId); let lastViewed = Number.MAX_VALUE; diff --git a/web/react/components/rhs_root_post.jsx b/web/react/components/rhs_root_post.jsx index 21e52b438..e3b023841 100644 --- a/web/react/components/rhs_root_post.jsx +++ b/web/react/components/rhs_root_post.jsx @@ -9,6 +9,7 @@ var utils = require('../utils/utils.jsx'); var FileAttachmentList = require('./file_attachment_list.jsx'); var twemoji = require('twemoji'); var Constants = require('../utils/constants.jsx'); +const PostBodyAdditionalContent = require('./post_body_additional_content.jsx'); export default class RhsRootPost extends React.Component { constructor(props) { @@ -180,6 +181,9 @@ export default class RhsRootPost extends React.Component { onClick={TextFormatting.handleClick} dangerouslySetInnerHTML={{__html: TextFormatting.formatText(post.message)}} /> + <PostBodyAdditionalContent + post={post} + /> {fileAttachment} </div> </div> diff --git a/web/react/components/search_autocomplete.jsx b/web/react/components/search_autocomplete.jsx index 736919697..d245c6bac 100644 --- a/web/react/components/search_autocomplete.jsx +++ b/web/react/components/search_autocomplete.jsx @@ -189,7 +189,16 @@ export default class SearchAutocomplete extends React.Component { channels = channels.filter((channel) => channel.type !== 'D'); } - channels.sort((a, b) => a.name.localeCompare(b.name)); + channels.sort((a, b) => { + // put public channels first and then sort alphabebetically + if (a.type === b.type) { + return a.name.localeCompare(b.name); + } else if (a.type === Constants.OPEN_CHANNEL) { + return -1; + } + + return 1; + }); suggestions = channels; } else if (mode === 'users') { @@ -289,7 +298,7 @@ export default class SearchAutocomplete extends React.Component { key='public-channel-divider' className='search-autocomplete__divider' > - {'Public ' + Utils.getChannelTerm(Constants.OPEN_CHANNEL) + 's'} + <span>{'Public ' + Utils.getChannelTerm(Constants.OPEN_CHANNEL) + 's'}</span> </div> ); suggestions = suggestions.concat(publicChannels.map(this.renderChannelSuggestion)); @@ -302,7 +311,7 @@ export default class SearchAutocomplete extends React.Component { key='private-channel-divider' className='search-autocomplete__divider' > - {'Private ' + Utils.getChannelTerm(Constants.PRIVATE_CHANNEL) + 's'} + <span>{'Private ' + Utils.getChannelTerm(Constants.PRIVATE_CHANNEL) + 's'}</span> </div> ); suggestions = suggestions.concat(privateChannels.map(this.renderChannelSuggestion)); diff --git a/web/react/utils/markdown.jsx b/web/react/utils/markdown.jsx index 84c63a18b..946f93078 100644 --- a/web/react/utils/markdown.jsx +++ b/web/react/utils/markdown.jsx @@ -94,7 +94,7 @@ class MattermostMarkdownRenderer extends marked.Renderer { if (title) { out += ' title="' + title + '"'; } - out += ' onload="window.markdownImageLoaded(this)" class="markdown-inline-img"'; + out += ' onload="window.markdownImageLoaded(this)" onerror="window.markdownImageLoaded(this)" class="markdown-inline-img"'; out += this.options.xhtml ? '/>' : '>'; return out; } diff --git a/web/react/utils/text_formatting.jsx b/web/react/utils/text_formatting.jsx index ac26107cc..705d85cf6 100644 --- a/web/react/utils/text_formatting.jsx +++ b/web/react/utils/text_formatting.jsx @@ -135,13 +135,13 @@ function autolinkAtMentions(text, tokens) { return alias; } - function replaceAtMentionWithToken(fullMatch, prefix, mention, username) { + function replaceAtMentionWithToken(fullMatch, mention, username) { let usernameLower = username.toLowerCase(); if (mentionExists(usernameLower)) { // Exact match const alias = addToken(usernameLower, mention, ''); - return prefix + alias; + return alias; } // Not an exact match, attempt to truncate any punctuation to see if we can find a user @@ -154,7 +154,7 @@ function autolinkAtMentions(text, tokens) { if (mentionExists(usernameLower)) { const extraText = originalUsername.substr(c - 1); const alias = addToken(usernameLower, '@' + usernameLower, extraText); - return prefix + alias; + return alias; } } else { // If the last character is not punctuation, no point in going any further @@ -166,7 +166,7 @@ function autolinkAtMentions(text, tokens) { } let output = text; - output = output.replace(/(^|[^a-z0-9])(@([a-z0-9.\-_]*))/gi, replaceAtMentionWithToken); + output = output.replace(/(@([a-z0-9.\-_]*))/gi, replaceAtMentionWithToken); return output; } diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx index 8052c000c..38f91b35f 100644 --- a/web/react/utils/utils.jsx +++ b/web/react/utils/utils.jsx @@ -513,7 +513,7 @@ export function applyTheme(theme) { changeCss('#post-list .post-list-holder-by-time', 'background:' + theme.centerChannelBg, 1); changeCss('#post-create', 'background:' + theme.centerChannelBg, 1); changeCss('.date-separator .separator__text, .new-separator .separator__text', 'background:' + theme.centerChannelBg, 1); - changeCss('.post-image__column .post-image__details', 'background:' + theme.centerChannelBg, 1); + changeCss('.post-image__column .post-image__details, .search-help-popover .search-autocomplete__divider span', 'background:' + theme.centerChannelBg, 1); changeCss('.sidebar--right, .dropdown-menu, .popover, .tip-overlay', 'background:' + theme.centerChannelBg, 1); changeCss('.popover.bottom>.arrow:after', 'border-bottom-color:' + theme.centerChannelBg, 1); changeCss('.popover.right>.arrow:after, .tip-overlay.tip-overlay--sidebar .arrow, .tip-overlay.tip-overlay--header .arrow', 'border-right-color:' + theme.centerChannelBg, 1); @@ -541,11 +541,12 @@ export function applyTheme(theme) { changeCss('.channel-header #member_popover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8), 1); changeCss('.custom-textarea, .custom-textarea:focus, .preview-container .preview-div, .post-image__column .post-image__details, .sidebar--right .sidebar-right__body, .markdown__table th, .markdown__table td, .command-box, .modal .modal-content, .settings-modal .settings-table .settings-content .divider-light, .webhooks__container, .dropdown-menu, .modal .modal-header, .popover, .mentions--top .mentions-box', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1); changeCss('.popover.bottom>.arrow', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1); + changeCss('.search-help-popover .search-autocomplete__divider span', 'color:' + changeOpacity(theme.centerChannelColor, 0.7), 1); changeCss('.popover.right>.arrow', 'border-right-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1); changeCss('.popover.left>.arrow', 'border-left-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1); changeCss('.popover.top>.arrow', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1); changeCss('.command-name, .popover .popover-title', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1); - changeCss('.dropdown-menu .divider', 'background:' + theme.centerChannelColor, 1); + changeCss('.dropdown-menu .divider, .search-help-popover .search-autocomplete__divider:before', 'background:' + theme.centerChannelColor, 1); changeCss('.custom-textarea', 'color:' + theme.centerChannelColor, 1); changeCss('.post-image__column', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 2); changeCss('.post-image__column .post-image__details', 'color:' + theme.centerChannelColor, 2); diff --git a/web/sass-files/sass/partials/_markdown.scss b/web/sass-files/sass/partials/_markdown.scss index 241377252..8b0a32704 100644 --- a/web/sass-files/sass/partials/_markdown.scss +++ b/web/sass-files/sass/partials/_markdown.scss @@ -8,11 +8,14 @@ margin-left: 4px; } } -.markdown-inline-img { - -moz-force-broken-image-icon: 1; - max-height: 500px; - height: 500px; +#post-list { + .markdown-inline-img { + -moz-force-broken-image-icon: 1; + max-height: 500px; + height: 500px; + } } + .post-body { hr { height: 4px; diff --git a/web/sass-files/sass/partials/_popover.scss b/web/sass-files/sass/partials/_popover.scss index 430813e63..7d98935d5 100644 --- a/web/sass-files/sass/partials/_popover.scss +++ b/web/sass-files/sass/partials/_popover.scss @@ -36,10 +36,36 @@ } } + .search-autocomplete__divider { + margin: 10px 0 5px; + line-height: 21px; + position: relative; + &:first-child { + margin-top: 5px; + } + span { + display: inline-block; + padding-right: 10px; + background: #fff; + z-index: 5; + position: relative; + } + &:before { + content: ""; + position: absolute; + width: 100%; + height: 1px; + background: #ddd; + top: 10px; + left: 0; + @include opacity(0.2); + } + } + .search-autocomplete__item { cursor: pointer; padding: 6px 8px; - margin: 3px 0; + margin: 3px 0 0 5px; @include border-radius(2px); white-space: nowrap; overflow: hidden; diff --git a/web/sass-files/sass/partials/_post.scss b/web/sass-files/sass/partials/_post.scss index b57c51242..36f6f445e 100644 --- a/web/sass-files/sass/partials/_post.scss +++ b/web/sass-files/sass/partials/_post.scss @@ -674,7 +674,7 @@ body.ios { width: 20%; float: right; img { - height: 75px; + max-height: 75px; max-width: 100%; } } |