diff --git a/TODO.md b/TODO.md index 9257f37..06483b3 100644 --- a/TODO.md +++ b/TODO.md @@ -14,6 +14,7 @@ - [x] Refactoring: Agent/Session-Einstellungen, die den System-Prompt bzw. das Tool Use bearbeiten - [ ] Cronjobs: Planung, ob cron von Debian/Linux verwendet werden soll, oder ein eigener Worker/Service in der App selbst, der das übernimmt - [x] Weiteres Modell hinzufügen: "Haiku 4.5" +- [ ] Weitere Tools: Glob? Search? ## Bugs - [x] Wenn gerade gestreamt wird und man refreshed die Seite, dann verliert das Frontend den Status "Streaming..." und ich kann eine Nachricht schreiben, obwohl das nicht möglich sein sollte @@ -31,7 +32,7 @@ - [x] Browser: "Zurück"-Taste soll auf den vorherigen location.hash wechseln - [x] File Explorer: CodeMirror lässt sich horizontal nicht scroll - [ ] Chat: Datum und Uhrzeit bei den Nachrichten anzeigen (Format: dd.MM.yyyy HH:mm:ss) -- [ ] Dashboard: Menu-Dropdown bei Cards sind abgeschnitten wenn die Card-Höhe nicht ausreicht (logisch, weil das Menu-Dropdown ein Child von der Card ist) +- [x] Dashboard: Menu-Dropdown bei Cards sind abgeschnitten wenn die Card-Höhe nicht ausreicht (logisch, weil das Menu-Dropdown ein Child von der Card ist) ## Ideas / Backlog - [ ] Memory: Embedding-Modell für semantische Suche über Memory-Dateien (Vektor-basiert + BM25 Hybrid Search) diff --git a/wwwroot/css/dashboard.css b/wwwroot/css/dashboard.css index 045afa4..8803bcf 100644 --- a/wwwroot/css/dashboard.css +++ b/wwwroot/css/dashboard.css @@ -211,10 +211,7 @@ } .card-menu-dropdown { - margin-top: var(--badge-spacing); - position: absolute; - top: 100%; - right: 0; + position: fixed; background: var(--f3-bg); border: var(--border-width) solid var(--f3-border); border-radius: var(--border-radius); @@ -223,6 +220,8 @@ flex-direction: column; overflow: hidden; padding-block: var(--badge-spacing); + z-index: 1000; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .card-menu-dropdown[hidden] { diff --git a/wwwroot/js/pages/dashboard.js b/wwwroot/js/pages/dashboard.js index 487d83b..3696434 100644 --- a/wwwroot/js/pages/dashboard.js +++ b/wwwroot/js/pages/dashboard.js @@ -78,7 +78,21 @@ registerPage('dashboard', { menuTrigger.addEventListener('click', (e) => { e.stopPropagation(); closeAllCardMenus(); + // Position fixed dropdown relative to trigger + const rect = menuTrigger.getBoundingClientRect(); + menuDropdown.style.top = `${rect.bottom + 4}px`; + menuDropdown.style.left = `${rect.right - menuDropdown.offsetWidth}px`; menuDropdown.hidden = !menuDropdown.hidden; + // Adjust if off-screen right + if (!menuDropdown.hidden) { + const dropRect = menuDropdown.getBoundingClientRect(); + if (dropRect.right > window.innerWidth) { + menuDropdown.style.left = `${window.innerWidth - dropRect.width - 8}px`; + } + if (dropRect.left < 0) { + menuDropdown.style.left = '8px'; + } + } }); chatBtn.addEventListener('click', (e) => { e.stopPropagation(); @@ -209,7 +223,21 @@ registerPage('dashboard', { menuTrigger.addEventListener('click', (e) => { e.stopPropagation(); closeAllCardMenus(); + // Position fixed dropdown relative to trigger + const rect = menuTrigger.getBoundingClientRect(); + menuDropdown.style.top = `${rect.bottom + 4}px`; + menuDropdown.style.left = `${rect.right - menuDropdown.offsetWidth}px`; menuDropdown.hidden = !menuDropdown.hidden; + // Adjust if off-screen right + if (!menuDropdown.hidden) { + const dropRect = menuDropdown.getBoundingClientRect(); + if (dropRect.right > window.innerWidth) { + menuDropdown.style.left = `${window.innerWidth - dropRect.width - 8}px`; + } + if (dropRect.left < 0) { + menuDropdown.style.left = '8px'; + } + } }); menuDropdown.querySelector('[data-action="files"]').addEventListener('click', (e) => { e.stopPropagation();