in webui/js/ponymail.js [4329:4442]
function renderCalendar(state) {
calendar_state = state ? state : calendar_state;
calendar_index = 0;
current_calendar_size = G_show_stats_sidebar ? CALENDAR_YEARS_SHOWN : calendar_max_height();
// Only render if calendar div is present
let cal = document.getElementById('sidebar_calendar');
if (!cal) {
return;
}
let now = new Date();
let CY = now.getFullYear();
let CM = now.getMonth() + 1;
let SY = Math.min(calendar_state.LY, CY); // last year in calendar, considering current date
// If Last Year is into the future, set Last Month to this one.
if (calendar_state.LY > CY) {
calendar_state.LM = CM;
}
let cdiv = new HTML('div', {
class: 'sidebar_calendar'
})
let N = 0;
// Chevron for moving to later years
let chevron = new HTML('div', {
class: 'sidebar_calendar_chevron'
});
chevron.inject(new HTML('span', {
onclick: 'calendar_scroll(this, -1);',
style: {
display: 'none'
},
id: 'sidebar_calendar_up',
class: 'glyphicon glyphicon-collapse-up',
title: "Show later years"
}, " "));
cdiv.inject(chevron);
// Create divs for each year, assign all visible
for (let Y = SY; Y >= calendar_state.FY; Y--) {
let ydiv = new HTML('div', {
class: 'sidebar_calendar_year',
id: 'sidebar_calendar_' + N++
});
ydiv.inject(txt(Y));
ydiv.inject(new HTML('br'));
for (let i = 0; i < MONTHS_SHORTENED.length; i++) {
let mon = MONTHS_SHORTENED[i];
let mdiv = new HTML('div', {
onclick: 'calendar_click(%u, %u);'.format(Y, i + 1),
class: 'sidebar_calendar_month'
}, mon);
// Mark out-of-bounds segments
let ym = '%04u-%02u'.format(Y, i+1);
let c_active = true;
if (calendar_state.activity && !calendar_state.activity[ym]) {
c_active = false;
}
if ((Y == SY && i >= calendar_state.LM) || (Y == CY && i > CM)) {
c_active = false;
}
if (Y == calendar_state.FY && ((i + 1) < calendar_state.FM)) {
c_active = false;
}
if (!c_active) {
mdiv.setAttribute("class", "sidebar_calendar_month_nothing");
mdiv.setAttribute("onclick", "javascript:void(0);");
} else if (calendar_state.activity && calendar_state.activity[ym]) {
let count = calendar_state.activity[ym];
if (count >= 1000) {
count = Math.round(count/100.0); // nearest century
count = Math.floor(count/10) + "k" + (count % 10); // thousands and remainder
} else {
count = count.toString();
}
mdiv.inject(new HTML('span', {title: `${calendar_state.activity[ym].pretty()} emails this month`, class: 'calendar_count'}, count));
}
ydiv.inject(mdiv);
}
cdiv.inject(ydiv);
}
cal.innerHTML = "<p style='text-align: center;'>Archives (%u - %u):</p>".format(calendar_state.FY, SY);
cal.inject(cdiv);
chevron = new HTML('div', {
class: 'sidebar_calendar_chevron'
});
chevron.inject(new HTML('span', {
onclick: 'calendar_scroll(this, 1);',
style: {
display: 'none'
},
id: 'sidebar_calendar_down',
class: 'glyphicon glyphicon-collapse-down',
title: "Show earlier years"
}, " "));
cdiv.inject(chevron);
// If we have > N years, hide the rest
if (N > current_calendar_size) {
for (let i = current_calendar_size; i < N; i++) {
let obj = document.getElementById('sidebar_calendar_' + i);
if (obj) {
obj.style.display = "none";
}
}
document.getElementById('sidebar_calendar_down').style.display = 'block';
}
}