From cc3fff0757bc7d57445347b690ff377f3ce748f7 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Sun, 15 Feb 2026 21:02:40 +0000 Subject: [PATCH] Renovate mitigation panels and messages --- app/urls.py | 10 + core/templates/base.html | 50 +- .../pages/ai-workspace-information.html | 25 + core/templates/pages/compose-workspace.html | 20 + .../partials/ai-workspace-ai-result.html | 311 ++++++++- .../ai-workspace-mitigation-panel.html | 255 ++++++-- .../partials/ai-workspace-person-widget.html | 70 +- core/templates/partials/compose-panel.html | 601 ++++++++++++++---- .../compose-workspace-contacts-widget.html | 114 ++++ .../partials/nav-contacts-dropdown.html | 12 +- core/views/compose.py | 207 +++++- core/views/workspace.py | 79 ++- 12 files changed, 1518 insertions(+), 236 deletions(-) create mode 100644 core/templates/pages/compose-workspace.html create mode 100644 core/templates/partials/compose-workspace-contacts-widget.html 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; + }); + }); + } + });