diff options
Diffstat (limited to 'web')
-rw-r--r-- | web/react/components/navbar.jsx | 4 | ||||
-rw-r--r-- | web/react/components/post_body.jsx | 24 | ||||
-rw-r--r-- | web/react/components/posts_view_container.jsx | 12 | ||||
-rw-r--r-- | web/react/components/sidebar.jsx | 2 | ||||
-rw-r--r-- | web/react/components/user_settings/custom_theme_chooser.jsx | 1 | ||||
-rw-r--r-- | web/react/stores/user_store.jsx | 4 | ||||
-rw-r--r-- | web/react/utils/channel_intro_mssages.jsx | 19 | ||||
-rw-r--r-- | web/web.go | 4 |
8 files changed, 48 insertions, 22 deletions
diff --git a/web/react/components/navbar.jsx b/web/react/components/navbar.jsx index ff53816c7..af29f219e 100644 --- a/web/react/components/navbar.jsx +++ b/web/react/components/navbar.jsx @@ -140,7 +140,9 @@ export default class Navbar extends React.Component { role='menuitem' href='#' onClick={() => this.setState({showEditChannelPurposeModal: true})} - /> + > + {'Set Channel Purpose...'} + </a> </li> ); } diff --git a/web/react/components/post_body.jsx b/web/react/components/post_body.jsx index c57c4490b..617b4b36c 100644 --- a/web/react/components/post_body.jsx +++ b/web/react/components/post_body.jsx @@ -18,6 +18,7 @@ export default class PostBody extends React.Component { this.receivedYoutubeData = false; this.isGifLoading = false; + this.handleUserChange = this.handleUserChange.bind(this); this.parseEmojis = this.parseEmojis.bind(this); this.createEmbed = this.createEmbed.bind(this); this.createGifEmbed = this.createGifEmbed.bind(this); @@ -25,7 +26,14 @@ export default class PostBody extends React.Component { this.createYoutubeEmbed = this.createYoutubeEmbed.bind(this); const linkData = Utils.extractLinks(this.props.post.message); - this.state = {links: linkData.links, message: linkData.text, post: this.props.post}; + const profiles = UserStore.getProfiles(); + + this.state = { + links: linkData.links, + message: linkData.text, + post: this.props.post, + hasUserProfiles: profiles && Object.keys(profiles).length > 1 + }; } getAllChildNodes(nodeIn) { @@ -55,12 +63,26 @@ export default class PostBody extends React.Component { componentDidMount() { this.parseEmojis(); + + UserStore.addChangeListener(this.handleUserChange); } componentDidUpdate() { this.parseEmojis(); } + componentWillUnmount() { + UserStore.removeChangeListener(this.handleUserChange); + } + + handleUserChange() { + if (!this.state.hasProfiles) { + const profiles = UserStore.getProfiles(); + + this.setState({hasProfiles: profiles && Object.keys(profiles).length > 1}); + } + } + componentWillReceiveProps(nextProps) { const linkData = Utils.extractLinks(nextProps.post.message); if (this.props.post.filenames.length === 0 && this.state.links && this.state.links.length > 0) { diff --git a/web/react/components/posts_view_container.jsx b/web/react/components/posts_view_container.jsx index c76c8a57e..2cb56cd47 100644 --- a/web/react/components/posts_view_container.jsx +++ b/web/react/components/posts_view_container.jsx @@ -3,6 +3,7 @@ const PostsView = require('./posts_view.jsx'); const LoadingScreen = require('./loading_screen.jsx'); +const ChannelInviteModal = require('./channel_invite_modal.jsx'); const ChannelStore = require('../stores/channel_store.jsx'); const PostStore = require('../stores/post_store.jsx'); @@ -50,6 +51,7 @@ export default class PostsViewContainer extends React.Component { }); } + state.showInviteModal = false; this.state = state; } componentDidMount() { @@ -248,7 +250,7 @@ export default class PostsViewContainer extends React.Component { postViewScrolled={this.handlePostsViewScroll} loadMorePostsTopClicked={this.loadMorePostsTop} numPostsToDisplay={this.state.numPostsToDisplay} - introText={channel ? createChannelIntroMessage(channel) : null} + introText={channel ? createChannelIntroMessage(channel, () => this.setState({showInviteModal: true})) : null} messageSeparatorTime={this.state.currentLastViewed} /> ); @@ -263,7 +265,13 @@ export default class PostsViewContainer extends React.Component { } return ( - <div id='post-list'>{postListCtls}</div> + <div id='post-list'> + {postListCtls} + <ChannelInviteModal + show={this.state.showInviteModal} + onModalDismissed={() => this.setState({showInviteModal: false})} + /> + </div> ); } } diff --git a/web/react/components/sidebar.jsx b/web/react/components/sidebar.jsx index b02ec0692..542f433f3 100644 --- a/web/react/components/sidebar.jsx +++ b/web/react/components/sidebar.jsx @@ -144,7 +144,7 @@ export default class Sidebar extends React.Component { } } - const hiddenDirectChannelCount = UserStore.getActiveOnlyProfileList().length - visibleDirectChannels.length; + const hiddenDirectChannelCount = UserStore.getActiveOnlyProfileList(true).length - visibleDirectChannels.length; visibleDirectChannels.sort(this.sortChannelsByDisplayName); diff --git a/web/react/components/user_settings/custom_theme_chooser.jsx b/web/react/components/user_settings/custom_theme_chooser.jsx index 895d0c500..3dbed72c3 100644 --- a/web/react/components/user_settings/custom_theme_chooser.jsx +++ b/web/react/components/user_settings/custom_theme_chooser.jsx @@ -129,7 +129,6 @@ export default class CustomThemeChooser extends React.Component { {'Copy and paste to share theme colors:'} </label> <input - readOnly='true' type='text' className='form-control' value={colors} diff --git a/web/react/stores/user_store.jsx b/web/react/stores/user_store.jsx index e0ecc37aa..40b64b34b 100644 --- a/web/react/stores/user_store.jsx +++ b/web/react/stores/user_store.jsx @@ -197,13 +197,13 @@ class UserStoreClass extends EventEmitter { return BrowserStore.getItem('profiles', {}); } - getActiveOnlyProfiles() { + getActiveOnlyProfiles(skipCurrent) { const active = {}; const profiles = this.getProfiles(); const currentId = this.getCurrentId(); for (var key in profiles) { - if (profiles[key].delete_at === 0 && profiles[key].id !== currentId) { + if (!(profiles[key].id === currentId && skipCurrent) && profiles[key].delete_at === 0) { active[key] = profiles[key]; } } diff --git a/web/react/utils/channel_intro_mssages.jsx b/web/react/utils/channel_intro_mssages.jsx index 161c79761..f27e23a82 100644 --- a/web/react/utils/channel_intro_mssages.jsx +++ b/web/react/utils/channel_intro_mssages.jsx @@ -9,15 +9,15 @@ const ChannelStore = require('../stores/channel_store.jsx'); const Constants = require('../utils/constants.jsx'); const TeamStore = require('../stores/team_store.jsx'); -export function createChannelIntroMessage(channel) { +export function createChannelIntroMessage(channel, showInviteModal) { if (channel.type === 'D') { return createDMIntroMessage(channel); } else if (ChannelStore.isDefault(channel)) { return createDefaultIntroMessage(channel); } else if (channel.name === Constants.OFFTOPIC_CHANNEL) { - return createOffTopicIntroMessage(channel); + return createOffTopicIntroMessage(channel, showInviteModal); } else if (channel.type === 'O' || channel.type === 'P') { - return createStandardIntroMessage(channel); + return createStandardIntroMessage(channel, showInviteModal); } } @@ -71,7 +71,7 @@ export function createDMIntroMessage(channel) { ); } -export function createOffTopicIntroMessage(channel) { +export function createOffTopicIntroMessage(channel, showInviteModal) { return ( <div className='channel-intro'> <h4 className='channel-intro__title'>{'Beginning of ' + channel.display_name}</h4> @@ -91,10 +91,8 @@ export function createOffTopicIntroMessage(channel) { <i className='fa fa-pencil'></i>{'Set a header'} </a> <a - className='intro-links' href='#' - data-toggle='modal' - data-target='#channel_invite' + onClick={showInviteModal} > <i className='fa fa-user-plus'></i>{'Invite others to this channel'} </a> @@ -155,7 +153,7 @@ export function createDefaultIntroMessage(channel) { ); } -export function createStandardIntroMessage(channel) { +export function createStandardIntroMessage(channel, showInviteModal) { var uiName = channel.display_name; var creatorName = ''; @@ -206,14 +204,11 @@ export function createStandardIntroMessage(channel) { <i className='fa fa-pencil'></i>{'Set a header'} </a> <a - className='intro-links' href='#' - data-toggle='modal' - data-target='#channel_invite' + onClick={showInviteModal} > <i className='fa fa-user-plus'></i>{'Invite others to this ' + uiType} </a> - </div> ); } diff --git a/web/web.go b/web/web.go index 1cae604ae..ffc791cb7 100644 --- a/web/web.go +++ b/web/web.go @@ -132,7 +132,7 @@ func watchAndParseTemplates() { } } -var browsersNotSupported string = "MSIE/8;MSIE/9;MSIE/10;Internet Explorer/8;Internet Explorer/9;Internet Explorer/10;Safari/7" +var browsersNotSupported string = "MSIE/8;MSIE/9;MSIE/10;Internet Explorer/8;Internet Explorer/9;Internet Explorer/10;Safari/7;Safari/8" func CheckBrowserCompatability(c *api.Context, r *http.Request) bool { ua := user_agent.New(r.UserAgent()) @@ -143,7 +143,7 @@ func CheckBrowserCompatability(c *api.Context, r *http.Request) bool { version := strings.Split(browser, "/") if strings.HasPrefix(bname, version[0]) && strings.HasPrefix(bversion, version[1]) { - c.Err = model.NewAppError("CheckBrowserCompatability", "Your current browser is not supported, please upgrade to one of the following browsers: Google Chrome 21 or higher, Internet Explorer 11 or higher, FireFox 14 or higher, Safari 8 or higher", "") + c.Err = model.NewAppError("CheckBrowserCompatability", "Your current browser is not supported, please upgrade to one of the following browsers: Google Chrome 21 or higher, Internet Explorer 11 or higher, FireFox 14 or higher, Safari 9 or higher", "") return false } } |