Merge branch 'release-1.2'
Этот коммит содержится в:
@@ -140,7 +140,9 @@ export default class Navbar extends React.Component {
|
||||
role='menuitem'
|
||||
href='#'
|
||||
onClick={() => this.setState({showEditChannelPurposeModal: true})}
|
||||
/>
|
||||
>
|
||||
{'Set Channel Purpose...'}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user