diff --git a/dashboard/src/views/EmailMailboxesView.vue b/dashboard/src/views/EmailMailboxesView.vue index d71e51eb7..1a897bab8 100644 --- a/dashboard/src/views/EmailMailboxesView.vue +++ b/dashboard/src/views/EmailMailboxesView.vue @@ -146,17 +146,31 @@ async function onSubmitRemove() { removeBusy.value = false; } -async function refresh() { - let tmp = []; +async function refreshUsage() { async function refreshForDomain(domain) { - let [error, result] = await mailModel.usage(domain); + const [error, usage] = await mailModel.usage(domain); // retry if mail addon cannot be reached during restarts if (error && error.status === 424) return setTimeout(refresh, 2000); else if (error) return console.error(error); - const usage = result; + mailboxes.value.forEach((m) => { + if (usage[m.fullName]) m.usage = usage[m.fullName]; + }); + } - [error, result] = await mailboxesModel.list(domain); + try { + await eachLimit(domains.value.map(d => d.domain), 10, refreshForDomain); + } catch (error) { + return console.error(error); + } + + mailboxesUsage.value = mailboxes.value.reduce((acc, m) => acc + (m.usage && m.usage.diskSize), 0); +} + +async function refresh() { + let tmp = []; + async function refreshForDomain(domain) { + const [error, result] = await mailboxesModel.list(domain); if (error) throw error; result.forEach((m) => { @@ -166,7 +180,7 @@ async function refresh() { if (!m.owner) m.owner = groups.value.find(g => g.id === m.ownerId) || null; m.ownerDisplayName = m.owner ? (m.owner.username || m.owner.name) : ''; - m.usage = usage[m.fullName] || 0; + m.usage = -1; }); tmp = tmp.concat(result); @@ -179,7 +193,6 @@ async function refresh() { } mailboxes.value = tmp; - mailboxesUsage.value = mailboxes.value.reduce((acc, m) => acc + (m.usage && m.usage.diskSize), 0); } onMounted(async () => { @@ -203,6 +216,9 @@ onMounted(async () => { await refresh(); + // we do this in the background to show the list faster + refreshUsage(); + busy.value = false; }); @@ -244,7 +260,7 @@ onMounted(async () => {