Refactored sidebar in preparation for adding unread indicators
Этот коммит содержится в:
@@ -56,7 +56,6 @@ function getStateFromStores() {
|
|||||||
var channelMember = members[channel.id];
|
var channelMember = members[channel.id];
|
||||||
var msgCount = channel.total_msg_count - channelMember.msg_count;
|
var msgCount = channel.total_msg_count - channelMember.msg_count;
|
||||||
if (msgCount > 0) {
|
if (msgCount > 0) {
|
||||||
channel.unread = msgCount;
|
|
||||||
showDirectChannels.push(channel);
|
showDirectChannels.push(channel);
|
||||||
} else if (currentId === channel.id) {
|
} else if (currentId === channel.id) {
|
||||||
showDirectChannels.push(channel);
|
showDirectChannels.push(channel);
|
||||||
@@ -70,6 +69,7 @@ function getStateFromStores() {
|
|||||||
tempChannel.display_name = utils.getDisplayName(teammate);
|
tempChannel.display_name = utils.getDisplayName(teammate);
|
||||||
tempChannel.status = UserStore.getStatus(teammate.id);
|
tempChannel.status = UserStore.getStatus(teammate.id);
|
||||||
tempChannel.last_post_at = 0;
|
tempChannel.last_post_at = 0;
|
||||||
|
tempChannel.total_msg_count = 0;
|
||||||
readDirectChannels.push(tempChannel);
|
readDirectChannels.push(tempChannel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -240,98 +240,94 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
var members = this.state.members;
|
var members = this.state.members;
|
||||||
var newsActive = window.location.pathname === '/' ? 'active' : '';
|
var activeId = this.state.active_id;
|
||||||
var badgesActive = false;
|
var badgesActive = false;
|
||||||
var self = this;
|
|
||||||
var channelItems = this.state.channels.map(function(channel) {
|
|
||||||
if (channel.type != 'O') {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
function createChannelElement(channel) {
|
||||||
var channelMember = members[channel.id];
|
var channelMember = members[channel.id];
|
||||||
var active = channel.id === self.state.active_id ? 'active' : '';
|
var active = channel.id === activeId ? 'active' : '';
|
||||||
|
|
||||||
|
var unread = false;
|
||||||
|
if (channelMember) {
|
||||||
|
var msgCount = channel.total_msg_count - channelMember.msg_count;
|
||||||
|
unread = (msgCount > 0 && channelMember.notify_level !== 'quiet') || channelMember.mention_count > 0;
|
||||||
|
}
|
||||||
|
|
||||||
var msgCount = channel.total_msg_count - channelMember.msg_count;
|
|
||||||
var titleClass = '';
|
var titleClass = '';
|
||||||
if (msgCount > 0 && channelMember.notify_level !== 'quiet') {
|
if (unread) {
|
||||||
titleClass = 'unread-title';
|
titleClass = 'unread-title';
|
||||||
}
|
}
|
||||||
|
|
||||||
var badge = '';
|
var badge = null;
|
||||||
if (channelMember.mention_count > 0) {
|
if (channelMember) {
|
||||||
badge = <span className='badge pull-right small'>{channelMember.mention_count}</span>;
|
if (channel.type === 'D') {
|
||||||
badgesActive = true;
|
// direct message channels show badges for any number of unread posts
|
||||||
titleClass = 'unread-title';
|
var msgCount = channel.total_msg_count - channelMember.msg_count;
|
||||||
}
|
if (msgCount > 0) {
|
||||||
|
badge = <span className='badge pull-right small'>{msgCount}</span>;
|
||||||
return (
|
badgesActive = true;
|
||||||
<li key={channel.id} className={active}><a className={'sidebar-channel ' + titleClass} href='#' onClick={function(e){e.preventDefault(); utils.switchChannel(channel);}}>{badge}{channel.display_name}</a></li>
|
}
|
||||||
);
|
} else if (channelMember.mention_count > 0) {
|
||||||
});
|
// public and private channels only show badges for mentions
|
||||||
|
badge = <span className='badge pull-right small'>{channelMember.mention_count}</span>;
|
||||||
var privateChannelItems = this.state.channels.map(function(channel) {
|
|
||||||
if (channel.type !== 'P') {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
var channelMember = members[channel.id];
|
|
||||||
var active = channel.id === self.state.active_id ? 'active' : '';
|
|
||||||
|
|
||||||
var msgCount = channel.total_msg_count - channelMember.msg_count;
|
|
||||||
var titleClass = ''
|
|
||||||
if (msgCount > 0 && channelMember.notify_level !== 'quiet') {
|
|
||||||
titleClass = 'unread-title'
|
|
||||||
}
|
|
||||||
|
|
||||||
var badge = '';
|
|
||||||
if (channelMember.mention_count > 0) {
|
|
||||||
badge = <span className='badge pull-right small'>{channelMember.mention_count}</span>;
|
|
||||||
badgesActive = true;
|
|
||||||
titleClass = 'unread-title';
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<li key={channel.id} className={active}><a className={'sidebar-channel ' + titleClass} href='#' onClick={function(e){e.preventDefault(); utils.switchChannel(channel);}}>{badge}{channel.display_name}</a></li>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
var directMessageItems = this.state.showDirectChannels.map(function(channel) {
|
|
||||||
var badge = '';
|
|
||||||
var titleClass = '';
|
|
||||||
|
|
||||||
var statusIcon = '';
|
|
||||||
if (channel.status === 'online') {
|
|
||||||
statusIcon = Constants.ONLINE_ICON_SVG;
|
|
||||||
} else if (channel.status === 'away') {
|
|
||||||
statusIcon = Constants.ONLINE_ICON_SVG;
|
|
||||||
} else {
|
|
||||||
statusIcon = Constants.OFFLINE_ICON_SVG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!channel.fake) {
|
|
||||||
var active = channel.id === self.state.active_id ? 'active' : '';
|
|
||||||
|
|
||||||
if (channel.unread) {
|
|
||||||
badge = <span className='badge pull-right small'>{channel.unread}</span>;
|
|
||||||
badgesActive = true;
|
badgesActive = true;
|
||||||
titleClass = 'unread-title';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleClick(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
utils.switchChannel(channel, channel.teammate_username);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<li key={channel.name} className={active}><a className={'sidebar-channel ' + titleClass} href='#' onClick={handleClick}><span className='status' dangerouslySetInnerHTML={{__html: statusIcon}} /> {badge}{channel.display_name}</a></li>
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
<li key={channel.name} className={active}><a className={'sidebar-channel ' + titleClass} href={TeamStore.getCurrentTeamUrl() + '/channels/' + channel.name}><span className='status' dangerouslySetInnerHTML={{__html: statusIcon}} /> {badge}{channel.display_name}</a></li>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
|
// set up status icon for direct message channels
|
||||||
|
var status = null;
|
||||||
|
if (channel.type === 'D') {
|
||||||
|
var statusIcon = '';
|
||||||
|
if (channel.status === 'online') {
|
||||||
|
statusIcon = Constants.ONLINE_ICON_SVG;
|
||||||
|
} else if (channel.status === 'away') {
|
||||||
|
statusIcon = Constants.ONLINE_ICON_SVG;
|
||||||
|
} else {
|
||||||
|
statusIcon = Constants.OFFLINE_ICON_SVG;
|
||||||
|
}
|
||||||
|
status = <span className='status' dangerouslySetInnerHTML={{__html: statusIcon}} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set up click handler to switch channels (or create a new channel for non-existant ones)
|
||||||
|
var clickHandler = null;
|
||||||
|
var href;
|
||||||
|
if (!channel.fake) {
|
||||||
|
clickHandler = function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
utils.switchChannel(channel);
|
||||||
|
};
|
||||||
|
href = '#';
|
||||||
|
} else {
|
||||||
|
href = TeamStore.getCurrentTeamUrl() + '/channels/' + channel.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<li key={channel.name} className={active}>
|
||||||
|
<a className={'sidebar-channel ' + titleClass} href={href} onClick={clickHandler}>
|
||||||
|
{status}
|
||||||
|
{badge}
|
||||||
|
{channel.display_name}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// create elements for all 3 types of channels
|
||||||
|
var channelItems = this.state.channels.filter(
|
||||||
|
function(channel) {
|
||||||
|
return channel.type === 'O';
|
||||||
|
}
|
||||||
|
).map(createChannelElement);
|
||||||
|
|
||||||
|
var privateChannelItems = this.state.channels.filter(
|
||||||
|
function(channel) {
|
||||||
|
return channel.type === 'P';
|
||||||
|
}
|
||||||
|
).map(createChannelElement);
|
||||||
|
|
||||||
|
var directMessageItems = this.state.showDirectChannels.map(createChannelElement);
|
||||||
|
|
||||||
|
// update the favicon to show if there are any notifications
|
||||||
var link = document.createElement('link');
|
var link = document.createElement('link');
|
||||||
link.type = 'image/x-icon';
|
link.type = 'image/x-icon';
|
||||||
link.rel = 'shortcut icon';
|
link.rel = 'shortcut icon';
|
||||||
@@ -348,13 +344,6 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
head.appendChild(link);
|
head.appendChild(link);
|
||||||
|
|
||||||
if (channelItems.length == 0) {
|
|
||||||
<li><small>Loading...</small></li>
|
|
||||||
}
|
|
||||||
|
|
||||||
if (privateChannelItems.length == 0) {
|
|
||||||
<li><small>Loading...</small></li>
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<SidebarHeader teamDisplayName={this.props.teamDisplayName} teamType={this.props.teamType} />
|
<SidebarHeader teamDisplayName={this.props.teamDisplayName} teamType={this.props.teamType} />
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user