Skip to content

Commit f842562

Browse files
committed
fix(webui): handle history wheel on message list
1 parent 06cef41 commit f842562

2 files changed

Lines changed: 39 additions & 16 deletions

File tree

dashboard/src/components/chat/MessageList.vue

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
<template>
2-
<div class="messages-container" ref="messageContainer" :class="{ 'is-dark': isDark }">
2+
<div
3+
class="messages-container"
4+
ref="messageContainer"
5+
:class="{ 'is-dark': isDark }"
6+
:tabindex="manualWheelScroll ? -1 : null"
7+
@wheel="handleWheelScroll">
38
<!-- 加载指示器 -->
49
<div v-if="isLoadingMessages" class="loading-overlay" :class="{ 'is-dark': isDark }">
510
<v-progress-circular indeterminate size="48" width="4" color="primary"></v-progress-circular>
@@ -224,6 +229,10 @@ export default {
224229
isLoadingMessages: {
225230
type: Boolean,
226231
default: false
232+
},
233+
manualWheelScroll: {
234+
type: Boolean,
235+
default: false
227236
}
228237
},
229238
emits: ['openImagePreview', 'replyMessage', 'replyWithText', 'openRefs'],
@@ -759,6 +768,33 @@ export default {
759768
}
760769
},
761770
771+
handleWheelScroll(event) {
772+
if (!this.manualWheelScroll || event.ctrlKey) {
773+
return;
774+
}
775+
776+
const container = this.$refs.messageContainer;
777+
if (!container) {
778+
return;
779+
}
780+
781+
if (document.activeElement !== container) {
782+
container.focus({ preventScroll: true });
783+
}
784+
785+
const deltaMultiplier = event.deltaMode === 1
786+
? 16
787+
: event.deltaMode === 2
788+
? container.clientHeight
789+
: 1;
790+
791+
container.scrollTop += event.deltaY * deltaMultiplier;
792+
793+
event.preventDefault();
794+
event.stopPropagation();
795+
this.handleScroll();
796+
},
797+
762798
// 组件销毁时移除监听器
763799
beforeUnmount() {
764800
const container = this.$refs.messageContainer;

dashboard/src/views/ConversationPage.vue

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -198,22 +198,15 @@
198198
</div>
199199

200200
<!-- 预览模式 - 聊天界面 -->
201-
<div
202-
v-else
203-
class="conversation-messages-container"
204-
style="background-color: var(--v-theme-surface);"
205-
role="region"
206-
:aria-label="tm('history.title')"
207-
tabindex="0"
208-
@wheel.stop>
201+
<div v-else class="conversation-messages-container" style="background-color: var(--v-theme-surface);">
209202
<!-- 空对话提示 -->
210203
<div v-if="conversationHistory.length === 0" class="text-center py-5">
211204
<v-icon size="48" color="grey">mdi-chat-remove</v-icon>
212205
<p class="text-disabled mt-2">{{ tm('status.emptyContent') }}</p>
213206
</div>
214207

215208
<!-- 消息列表组件 -->
216-
<MessageList v-else :messages="formattedMessages" :isDark="isDark" />
209+
<MessageList v-else :messages="formattedMessages" :isDark="isDark" :manualWheelScroll="true" />
217210
</div>
218211
</v-card-text>
219212

@@ -1109,17 +1102,11 @@ export default {
11091102
.conversation-messages-container {
11101103
max-height: 500px;
11111104
overflow-y: auto;
1112-
overscroll-behavior-y: contain;
11131105
padding: 8px;
11141106
border-radius: 8px;
11151107
background-color: #f9f9f9;
11161108
}
11171109
1118-
.conversation-messages-container:focus-visible {
1119-
outline: 2px solid rgba(var(--v-theme-primary), 0.6);
1120-
outline-offset: 2px;
1121-
}
1122-
11231110
/* 暗色模式下的聊天消息容器 */
11241111
.v-theme--dark .conversation-messages-container {
11251112
background-color: #1e1e1e;

0 commit comments

Comments
 (0)