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; + }); + }); + } + });