Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1006,18 +1006,105 @@ with gr.Blocks(css=custom_css, title="ChargeNode Kundtjänst") as app:
|
|
| 1006 |
|
| 1007 |
# Lägg till anpassad JavaScript för att styra scrollning
|
| 1008 |
js_code = """
|
|
|
|
| 1009 |
function scrollToLatestBotMessage() {
|
| 1010 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1011 |
if (latestBotMessage) {
|
|
|
|
|
|
|
| 1012 |
// Scrolla så att det senaste botmeddelandet är synligt i toppen av chattrutan
|
| 1013 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1014 |
}
|
| 1015 |
}
|
| 1016 |
|
| 1017 |
// Kör funktionen när nya meddelanden läggs till
|
| 1018 |
document.addEventListener('DOMNodeInserted', function(event) {
|
| 1019 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1020 |
setTimeout(scrollToLatestBotMessage, 100);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1021 |
}
|
| 1022 |
});
|
| 1023 |
"""
|
|
|
|
| 1006 |
|
| 1007 |
# Lägg till anpassad JavaScript för att styra scrollning
|
| 1008 |
js_code = """
|
| 1009 |
+
// Mer robust funktion för att scrolla till senaste botmeddelandet
|
| 1010 |
function scrollToLatestBotMessage() {
|
| 1011 |
+
console.log("Försöker scrolla till senaste botmeddelandet");
|
| 1012 |
+
|
| 1013 |
+
// Försök hitta det senaste botmeddelandet med olika selektorer (för kompatibilitet med Hugging Face)
|
| 1014 |
+
let latestBotMessage = document.querySelector('.gradio-container .message.bot:last-child');
|
| 1015 |
+
|
| 1016 |
+
// Alternativ selektor för Hugging Face
|
| 1017 |
+
if (!latestBotMessage) {
|
| 1018 |
+
latestBotMessage = document.querySelector('.gradio-container [data-testid="bot"]:last-child');
|
| 1019 |
+
}
|
| 1020 |
+
|
| 1021 |
+
// Ytterligare alternativ selektor
|
| 1022 |
+
if (!latestBotMessage) {
|
| 1023 |
+
latestBotMessage = document.querySelector('.gradio-container .message:last-child');
|
| 1024 |
+
}
|
| 1025 |
+
|
| 1026 |
if (latestBotMessage) {
|
| 1027 |
+
console.log("Hittade senaste botmeddelandet, scrollar till det");
|
| 1028 |
+
|
| 1029 |
// Scrolla så att det senaste botmeddelandet är synligt i toppen av chattrutan
|
| 1030 |
+
try {
|
| 1031 |
+
latestBotMessage.scrollIntoView({block: 'start', behavior: 'smooth'});
|
| 1032 |
+
console.log("scrollIntoView utförd");
|
| 1033 |
+
} catch (e) {
|
| 1034 |
+
console.error("Fel vid scrollning:", e);
|
| 1035 |
+
|
| 1036 |
+
// Fallback: Använd manuell scrollning om scrollIntoView misslyckas
|
| 1037 |
+
try {
|
| 1038 |
+
const chatContainer = latestBotMessage.closest('.chat');
|
| 1039 |
+
if (chatContainer) {
|
| 1040 |
+
const topPos = latestBotMessage.offsetTop;
|
| 1041 |
+
chatContainer.scrollTop = topPos;
|
| 1042 |
+
console.log("Manuell scrollning utförd");
|
| 1043 |
+
}
|
| 1044 |
+
} catch (e2) {
|
| 1045 |
+
console.error("Fallback-scrollning misslyckades:", e2);
|
| 1046 |
+
}
|
| 1047 |
+
}
|
| 1048 |
+
} else {
|
| 1049 |
+
console.log("Kunde inte hitta senaste botmeddelandet");
|
| 1050 |
}
|
| 1051 |
}
|
| 1052 |
|
| 1053 |
// Kör funktionen när nya meddelanden läggs till
|
| 1054 |
document.addEventListener('DOMNodeInserted', function(event) {
|
| 1055 |
+
// Kontrollera om det infogade elementet är ett botmeddelande
|
| 1056 |
+
if (event.target.classList &&
|
| 1057 |
+
(event.target.classList.contains('bot') ||
|
| 1058 |
+
event.target.getAttribute('data-testid') === 'bot')) {
|
| 1059 |
+
|
| 1060 |
+
console.log("Bot-meddelande detekterat, schemalägg scrollning");
|
| 1061 |
+
|
| 1062 |
+
// Använd flera timeouts med olika fördröjningar för att säkerställa att scrollningen fungerar
|
| 1063 |
setTimeout(scrollToLatestBotMessage, 100);
|
| 1064 |
+
setTimeout(scrollToLatestBotMessage, 300);
|
| 1065 |
+
setTimeout(scrollToLatestBotMessage, 500);
|
| 1066 |
+
}
|
| 1067 |
+
});
|
| 1068 |
+
|
| 1069 |
+
// Lägg även till en MutationObserver som ett alternativt sätt att upptäcka nya meddelanden
|
| 1070 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 1071 |
+
console.log("DOM laddad, sätter upp MutationObserver");
|
| 1072 |
+
|
| 1073 |
+
// Hitta chatcontainern
|
| 1074 |
+
const chatContainer = document.querySelector('.gradio-container');
|
| 1075 |
+
|
| 1076 |
+
if (chatContainer) {
|
| 1077 |
+
// Skapa en observer som övervakar ändringar i DOM
|
| 1078 |
+
const observer = new MutationObserver(function(mutations) {
|
| 1079 |
+
let shouldScroll = false;
|
| 1080 |
+
|
| 1081 |
+
mutations.forEach(function(mutation) {
|
| 1082 |
+
// Kontrollera om nya noder har lagts till
|
| 1083 |
+
if (mutation.addedNodes.length) {
|
| 1084 |
+
mutation.addedNodes.forEach(function(node) {
|
| 1085 |
+
// Kontrollera om den tillagda noden är ett botmeddelande
|
| 1086 |
+
if (node.classList &&
|
| 1087 |
+
(node.classList.contains('bot') ||
|
| 1088 |
+
node.getAttribute('data-testid') === 'bot')) {
|
| 1089 |
+
shouldScroll = true;
|
| 1090 |
+
}
|
| 1091 |
+
});
|
| 1092 |
+
}
|
| 1093 |
+
});
|
| 1094 |
+
|
| 1095 |
+
if (shouldScroll) {
|
| 1096 |
+
console.log("MutationObserver detekterade nytt botmeddelande");
|
| 1097 |
+
setTimeout(scrollToLatestBotMessage, 200);
|
| 1098 |
+
}
|
| 1099 |
+
});
|
| 1100 |
+
|
| 1101 |
+
// Starta övervakning av hela chatcontainern för ändringar i DOM
|
| 1102 |
+
observer.observe(chatContainer, {
|
| 1103 |
+
childList: true,
|
| 1104 |
+
subtree: true
|
| 1105 |
+
});
|
| 1106 |
+
|
| 1107 |
+
console.log("MutationObserver startad");
|
| 1108 |
}
|
| 1109 |
});
|
| 1110 |
"""
|