in webui/js/source/listview-header.js [120:268]
function listview_list_lists(state, json) {
let lists = document.getElementById('list_picker_ul');
let searching = (state && state.search === true) ? true : false;
if (state && state.to) {
let tab;
let tabs = lists.childNodes;
for (let xtab of tabs) {
if ((state.to == 'search' && xtab.getAttribute('id') == 'tab_search') || (xtab.innerText == state.to || xtab.getAttribute('data-list') == state.to)) {
tab = xtab;
tab.setAttribute("class", state.to == 'search' ? 'search' : 'active');
} else if (xtab.getAttribute("class") != 'list_all_narrow' && xtab.getAttribute("class") != 'others') {
xtab.setAttribute("class", "");
}
}
return;
}
if (!json) {
json = G_ponymail_preferences;
}
if (lists) {
lists.innerHTML = "";
if (isHash(json.lists) && json.lists[G_current_domain]) {
let lists_sorted = [];
for (let list in json.lists[G_current_domain]) {
lists_sorted.push([list, json.lists[G_current_domain][list]]);
}
lists_sorted.sort((a, b) => b[1] - a[1]);
let alists = [];
for (let list of lists_sorted) alists.push(list[0]);
if (G_current_list != '*' && G_current_domain != '*') {
alists.remove(G_current_list);
alists.unshift(G_current_list);
}
let maxlists = (searching && 3 || 4);
if (alists.length == maxlists + 1) maxlists++; // skip drop-down if only one additional list (#54)
for (let i = 0; i < alists.length; i++) {
if (i >= maxlists) break;
let listname = alists[i];
let listnametxt = listname;
if (pm_config.long_tabs) {
listnametxt = '%s@%s'.format(listname, G_current_domain);
}
let li = new HTML('li', {
onclick: 'switch_list(this, "tab");',
class: (listname == G_current_list && !searching) ? 'active' : null
}, listnametxt);
li.setAttribute("data-list", '%s@%s'.format(listname, G_current_domain));
lists.inject(li);
}
if (alists.length > maxlists) {
let other_lists_sorted = [];
for (let i = maxlists; i < alists.length; i++) {
other_lists_sorted.push(alists[i]);
}
other_lists_sorted.sort();
let li = new HTML('li', {
class: 'others'
});
let otherlists = new HTML('select', {
class: 'listview_others',
onchange: 'switch_list(this.value);'
});
otherlists.inject(new HTML('option', {
disabled: 'disabled',
selected: 'selected'
}, 'Other lists (%u):'.format(other_lists_sorted.length)));
li.inject(otherlists);
for (let listname of other_lists_sorted) {
let opt = new HTML('option', {
value: "%s@%s".format(listname, G_current_domain)
}, listname);
otherlists.inject(opt);
}
lists.inject(li);
}
// All lists, for narrow UI
let all_lists_narrow = [];
for (let alist of alists) {
all_lists_narrow.push(alist);
}
all_lists_narrow.sort();
let li = new HTML('li', {
class: 'list_all_narrow'
});
let otherlists = new HTML('select', {
class: 'listview_others',
onchange: 'switch_list(this.value);'
});
otherlists.inject(new HTML('option', {
disabled: 'disabled',
selected: 'selected'
}, "%s@%s".format(G_current_list, G_current_domain)));
li.inject(otherlists);
for (let listname of all_lists_narrow) {
let opt = new HTML('option', {
value: "%s@%s".format(listname, G_current_domain)
}, listname);
otherlists.inject(opt);
}
lists.inject(li);
}
}
if (searching) {
let li = new HTML('li', {
onclick: 'switch_list(this, "tab");',
id: 'tab_search',
class: 'search'
}, "Search: %s".format(state.query));
li.setAttribute("data-url", state.url);
li.setAttribute("data-href", location.href);
li.setAttribute("data-list", '%s@%s'.format(state.list, state.domain));
lists.inject(li);
}
// Populate the project selector
if (isHash(json.lists)) {
let no_projects = 0;
let select = document.getElementById('project_select');
if (!select || G_select_primed) return;
let opts = {}
let doms = [];
for (let domain in json.lists) {
let option = new HTML('option', {
value: domain
}, domain);
opts[domain] = option;
doms.push(domain);
no_projects++;
}
if (no_projects > 1 || G_current_domain == '*') {
select.innerHTML = "";
let title = new HTML('option', {
disabled: 'disabled',
selected: 'true',
value: ''
}, "Available projects (%u):".format(no_projects));
select.inject(title);
doms.sort();
for (let dom of doms) {
select.inject(opts[dom]);
}
select.style.display = "inline-block";
G_select_primed = true; // mark it primed so we don't generate it again later
}
}
}