Dokos intègre désormais deux nouveaux composants d'interface pour faciliter la rédaction et l'envoi de messages : EmailComposer pour les emails et CommentComposer pour les commentaires internes. Ces outils offrent une expérience utilisateur moderne et intuitive, directement intégrée dans l'interface de Dokos.
L'EmailComposer est un éditeur riche qui permet de rédiger et d'envoyer des emails directement depuis Dokos, avec toutes les fonctionnalités attendues d'un client email moderne.
Pour utiliser l'EmailComposer, vous devez l'intégrer dans une vue personnalisée de Dokos. Voici un exemple simple d'utilisation :
<EmailComposer
ref="composer"
v-model="body"
v-model:recipients="recipients"
:search-recipients="searchContacts"
:upload-function="uploadFile"
@submit="onSend"
/>
Par défaut, l'EmailComposer affiche les champs À, Cc et Bcc. Vous pouvez personnaliser les champs visibles via la prop headerFields :
<EmailComposer
:headerFields="['from', 'to', 'subject']"
/>
Si vous avez configuré plusieurs identités d'envoi, vous pouvez les passer via la prop senders :
<EmailComposer
:senders="[{ label: 'Support Technique', value: 'support@maisonverte.com' }]"
/>
Pour répondre à un email existant, utilisez la prop quoted :
<EmailComposer
v-model:quoted="originalMessage"
/>
Le contenu cité apparaîtra sous forme de bloc réductible dans l'éditeur et sera automatiquement intégré au corps du message lors de l'envoi.
Voici un exemple complet d'intégration de l'EmailComposer dans une vue Dokos :
<script setup>
import { ref } from "vue";
import { EmailComposer } from "@framework/ui/Composer";
const body = ref("");
const recipients = ref([{ label: "Maison Verte SARL", value: "contact@maisonverte.com" }]);
const composer = ref(null);
async function searchContacts(query) {
// Recherche de contacts dans Dokos
const results = await frappe.call("frappe.client.get_list", {
doctype: "Contact",
filters: { name: ["like", `%${query}%`] },
fields: ["name", "email_id"]
});
return results.map(contact => ({
label: contact.name,
value: contact.email_id
}));
}
async function uploadFile(file) {
// Téléchargement de la pièce jointe
const attachment = await frappe.call("upload_file", {
file: file,
doctype: "Communication",
docname: "Nouveau"
});
return {
name: attachment.file_url,
url: attachment.file_url
};
}
async function onSend(payload) {
// Envoi de l'email via Dokos
await frappe.call("frappe.email.queue", {
recipients: payload.recipients.map(r => r.value),
sender: payload.from,
subject: payload.subject,
message: payload.body,
attachments: payload.attachments.map(a => a.name)
});
composer.value?.reset();
}
</script>
<template>
<EmailComposer
ref="composer"
v-model="body"
v-model:recipients="recipients"
v-model:subject="subject"
:search-recipients="searchContacts"
:upload-function="uploadFile"
@submit="onSend"
/>
</template>
Le CommentComposer est conçu pour rédiger des commentaires internes avec mentions d'utilisateurs, idéal pour les discussions au sein des documents Dokos.
@ pour mentionner des utilisateurs Dokos.<CommentComposer
ref="commentComposer"
v-model="comment"
:upload-function="uploadFile"
@submit="onCommentSubmit"
/>
<script setup>
import { ref } from "vue";
import { CommentComposer } from "@framework/ui/Composer";
const comment = ref("");
const commentComposer = ref(null);
async function uploadFile(file) {
const attachment = await frappe.call("upload_file", {
file: file,
doctype: "Comment",
docname: "Nouveau"
});
return {
name: attachment.file_url,
url: attachment.file_url
};
}
async function onCommentSubmit(payload) {
await frappe.call("frappe.desk.add_comment", {
reference_doctype: "Task",
reference_name: "TASK-001",
content: payload.body
});
commentComposer.value?.reset();
}
</script>
<template>
<CommentComposer
ref="commentComposer"
v-model="comment"
:upload-function="uploadFile"
@submit="onCommentSubmit"
/>
</template>
Les deux compositeurs gèrent automatiquement les erreurs de recherche de destinataires ou de téléchargement de fichiers. Assurez-vous de fournir des fonctions de recherche et de téléchargement robustes pour une expérience utilisateur optimale.
Les compositeurs sont conçus pour être accessibles :
Échap pour fermer les popups).Pour une intégration plus poussée, vous pouvez utiliser les slots pour personnaliser l'apparence :
<EmailComposer v-model="body" @submit="onSend">
<template #header>
<div class="custom-header">
<input v-model="customSubject" placeholder="Sujet personnalisé" />
</div>
</template>
</EmailComposer>
Voici un aperçu du flux de travail avec l'EmailComposer :
@ pour l'alerter.Pour tester ces fonctionnalités avec les données de démonstration de Dokos :
Ces exemples vous permettront de simuler des envois d'emails et des commentaires internes dans un environnement réaliste.
Pour toute question ou besoin d'assistance sur l'intégration de ces composants, consultez la documentation des développeurs de Dokos ou contactez l'équipe support.