Do not count first group title as item

master
Vitaliy Filippov 2016-06-23 23:31:20 +03:00
parent 27552f167d
commit 4ea6f95ba8
1 changed files with 29 additions and 13 deletions

42
mail.js
View File

@ -829,6 +829,8 @@ var ListWithSelection = {
sel[ns] = true;
this.setState({ selected: sel });
this.curSel = ns;
if (this.onSelectCurrent)
this.onSelectCurrent(ns);
},
selectOne: function(ns)
{
@ -837,6 +839,8 @@ var ListWithSelection = {
this.setState({ selected: sel });
this.lastSel = ns;
this.curSel = ns;
if (this.onSelectCurrent)
this.onSelectCurrent(ns);
},
onListItemClick: function(ev)
{
@ -852,6 +856,8 @@ var ListWithSelection = {
{
this.state.selected[ns] = true;
this.curSel = ns;
if (this.onSelectCurrent)
this.onSelectCurrent(ns);
this.lastSel = this.lastSel === undefined ? ns : this.lastSel;
this.setState({ selected: this.state.selected });
}
@ -995,16 +1001,11 @@ var ComposeWindow = React.createClass({
var MessageInList = React.createClass({
msgClasses: [ 'unread', 'unseen', 'replied', 'pinned', 'sent', 'unloaded' ],
onClick: function(ev)
{
Store.set('msg', this.props.msg);
this.props.onClick(ev);
},
render: function()
{
var msg = this.props.msg;
return <div data-i={this.props.i} className={'message'+(this.msgClasses.map(c => (msg[c] ? ' '+c : '')).join(''))+
(this.props.selected ? ' selected' : '')+(msg.thread && Store.threads ? ' thread0' : '')} onMouseDown={this.onClick}>
(this.props.selected ? ' selected' : '')+(msg.thread && Store.threads ? ' thread0' : '')} onMouseDown={this.props.onClick}>
<div className="icon" style={{ width: (20+10*(msg.level||0)), backgroundPosition: (10*(msg.level||0))+'px 7px' }}></div>
<div className="subject" style={{ paddingLeft: (20+10*(msg.level||0)) }}>{msg.subject}</div>
{msg.thread && Store.threads ? <div className={'expand'+(msg.collapsed ? '' : ' collapse')}></div> : null}
@ -1017,7 +1018,7 @@ var MessageInList = React.createClass({
}
});
// TODO: full keyboard navigation in message list, expand/collapse days, virtual scroll...
// TODO: expand/collapse days, virtual scroll
var MessageList = React.createClass({
mixins: [ ListWithSelection ],
getInitialState: function()
@ -1031,10 +1032,24 @@ var MessageList = React.createClass({
deleteSelected: function()
{
},
onSelectCurrent: function(index)
{
var total = 0, p;
for (var i = 0; i < this.state.groups.length; i++)
{
p = total;
total += (i > 0 ? 1 : 0)+this.state.groups[i].messages.length;
if (index < total)
{
Store.set('msg', this.state.groups[i].messages[index-p-(i > 0 ? 1 : 0)]);
break;
}
}
},
getTotalItems: function()
{
var total = 0;
var total = -1; // do not count first-day as item
for (var i = 0; i < this.state.groups.length; i++)
{
total += 1+this.state.groups[i].messages.length;
@ -1057,16 +1072,16 @@ var MessageList = React.createClass({
for (var i = 0; i < this.state.groups.length; i++)
{
p = n;
n += 1+this.state.groups[i].messages.length;
n += (i > 0 ? 1 : 0)+this.state.groups[i].messages.length;
if (index < n)
{
if (index > p)
top += 30 + (Store.layout == 'message-on-right' ? 60 : 30)*(index-p-1);
top += (i > 0 ? 30 : 0) + (Store.layout == 'message-on-right' ? 60 : 30)*(index-p-1);
break;
}
top += 30 + (Store.layout == 'message-on-right' ? 60 : 30)*this.state.groups[i].messages.length;
top += (i > 0 ? 30 : 0) + (Store.layout == 'message-on-right' ? 60 : 30)*this.state.groups[i].messages.length;
}
return [ top, (Store.layout == 'message-on-right' && index != p ? 60 : 30) ];
return [ top, (Store.layout == 'message-on-right' && (index == 0 || index != p) ? 60 : 30) ];
},
getScrollPaddingTop: function()
{
@ -1094,7 +1109,8 @@ var MessageList = React.createClass({
<div ref="scroll" className="listview" tabIndex="1" onScroll={this.changeFirstDay} onKeyDown={this.onListKeyDown}>
<div ref="title" className="day first-day" style={{ top: this.state.firstDayTop }}>{this.props.groups[0].name}</div>
{this.props.groups.map(function(grp, i) {
total++;
if (i > 0)
total++;
var r = [
i > 0 ? <div className="day" data-i={total-1}>{grp.name}</div> : null,
<div className="day-list">