diff --git a/frontend/src/components/webmail/ComposeEmailForm.vue b/frontend/src/components/webmail/ComposeEmailForm.vue index a7dae7816..19b4e6a35 100644 --- a/frontend/src/components/webmail/ComposeEmailForm.vue +++ b/frontend/src/components/webmail/ComposeEmailForm.vue @@ -68,7 +68,7 @@ { } } -const submit = async () => { +const submit = async (reload) => { const { valid } = await formRef.value.validate() if (!valid) { return @@ -298,7 +298,10 @@ const submit = async () => { router.push({ name: 'MailboxView' }) const msg = body.scheduled_datetime ? $gettext('Email scheduled') - : $gettext('Email seng') + : $gettext('Email sent') + if (reload) { + reloadData() + } displayNotification({ msg }) } catch (error) { console.log(error) @@ -309,7 +312,7 @@ const submit = async () => { const scheduleAndSubmit = async (datetime) => { form.value.scheduled_datetime = datetime - await submit() + await submit(true) } const openAttachmentsDialog = () => { @@ -326,8 +329,8 @@ const lookForContacts = debounce(async (search) => { if (search) { const params = { search } const resp = await contactsApi.getContacts(params) - if (resp.data.length) { - contacts.value = resp.data + if (resp.data.count > 0) { + contacts.value = resp.data.results } } else { contacts.value = [] @@ -360,6 +363,13 @@ const closeSchedulingForm = () => { showSchedulingForm.value = false } +const getItemTitle = (item) => { + if (typeof item === 'string') { + return item + } + return item.display_name || `${item.first_name} ${item.last_name}` +} + watch( () => props.originalEmail, () => { diff --git a/frontend/src/components/webmail/EmailList.vue b/frontend/src/components/webmail/EmailList.vue index 25d56654e..e27a1ba39 100644 --- a/frontend/src/components/webmail/EmailList.vue +++ b/frontend/src/components/webmail/EmailList.vue @@ -251,7 +251,7 @@ const props = defineProps({ }) const { $gettext, $ngettext } = useGettext() -const { displayNotification, reloadMailboxCounters, reloadData } = useBusStore() +const { displayNotification, reloadMailboxCounters } = useBusStore() const webmailStore = useWebmailStore() const router = useRouter() const route = useRoute() @@ -324,7 +324,6 @@ const updateScheduledEmail = async (datetime) => { selectedScheduledEmail.value.scheduled_id, data ) - reloadData() fetchEmails() displayNotification({ msg: $gettext('Scheduling updated') }) } diff --git a/frontend/src/layouts/webmail/WebmailLayout.vue b/frontend/src/layouts/webmail/WebmailLayout.vue index 107722701..6e319dfd1 100644 --- a/frontend/src/layouts/webmail/WebmailLayout.vue +++ b/frontend/src/layouts/webmail/WebmailLayout.vue @@ -146,6 +146,8 @@ const mailboxQuotaTitle = computed(() => { return `${mailboxQuota.value.current} / ${mailboxQuota.value.limit} (${mailboxQuota.value.usage}%)` }) +const dataKey = computed(() => busStore.dataKey) + function openMailbox(mailbox) { router.push({ name: 'MailboxView', @@ -212,12 +214,9 @@ const deleteMailbox = async () => { navigateToMailbox('INBOX') } -watch( - () => busStore.dataKey, - () => { - fetchUserMailboxes() - } -) +watch(dataKey, () => { + fetchUserMailboxes() +}) await fetchUserMailboxes() const resp = await api.getUserMailboxQuota(route.query.mailbox || 'INBOX') diff --git a/frontend/src/plugins/rules.js b/frontend/src/plugins/rules.js index c1bf084a7..1db39a187 100644 --- a/frontend/src/plugins/rules.js +++ b/frontend/src/plugins/rules.js @@ -23,7 +23,7 @@ function samePassword(value, confirmation) { } function validateTime(value) { - if (!/^([01]\d|2[0-3]):?([0-5]\d)$/.test(value)) { + if (!/^([01]?\d|2[0-3]):?([0-5]\d)$/.test(value)) { return $gettext('Not a valid time') } return true diff --git a/modoboa/webmail/models.py b/modoboa/webmail/models.py index 73418f5ef..434bcfaf4 100644 --- a/modoboa/webmail/models.py +++ b/modoboa/webmail/models.py @@ -62,6 +62,12 @@ class ScheduledMessage(models.Model): self.save() return False + # Try to delete mailbox when empty + doveadm_cmd( + f"mailbox delete -u {self.account.email} -s -e " + f"{constants.MAILBOX_NAME_SCHEDULED}" + ) + return True def to_email_message(self) -> EmailMessage: