diff --git a/app/urls.py b/app/urls.py
index 258d205..9f45d72 100644
--- a/app/urls.py
+++ b/app/urls.py
@@ -119,11 +119,21 @@ urlpatterns = [
compose.ComposePage.as_view(),
name="compose_page",
),
+ path(
+ "compose/workspace/",
+ compose.ComposeWorkspace.as_view(),
+ name="compose_workspace",
+ ),
path(
"compose/widget/",
compose.ComposeWidget.as_view(),
name="compose_widget",
),
+ path(
+ "compose/workspace/widget/contacts/",
+ compose.ComposeWorkspaceContactsWidget.as_view(),
+ name="compose_workspace_contacts_widget",
+ ),
path(
"compose/send/",
compose.ComposeSend.as_view(),
diff --git a/core/templates/base.html b/core/templates/base.html
index d3860a1..dcf74ae 100644
--- a/core/templates/base.html
+++ b/core/templates/base.html
@@ -60,6 +60,41 @@
});
});
+ const composeLink = document.getElementById('nav-compose-link');
+ const composeDropdown = document.getElementById('nav-compose-contacts');
+ let composePreviewLoaded = false;
+ let composePreviewLoading = false;
+ if (composeLink && composeDropdown) {
+ composeLink.addEventListener('mouseenter', () => {
+ const previewUrl = composeLink.dataset.previewUrl || '';
+ if (!previewUrl || composePreviewLoaded || composePreviewLoading) {
+ return;
+ }
+ composePreviewLoading = true;
+ fetch(previewUrl, {
+ method: 'GET',
+ credentials: 'same-origin',
+ headers: { 'HX-Request': 'true' },
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error('Failed contacts preview fetch.');
+ }
+ return response.text();
+ })
+ .then((html) => {
+ composeDropdown.innerHTML = html;
+ composePreviewLoaded = true;
+ })
+ .catch(() => {
+ composePreviewLoaded = false;
+ })
+ .finally(() => {
+ composePreviewLoading = false;
+ });
+ });
+ }
+
});