Add new branch button to chat panel
This commit is contained in:
parent
0acd67ee57
commit
f1dff8f855
|
|
@ -38,6 +38,8 @@ export class ChatPanel {
|
||||||
selectedModel: string;
|
selectedModel: string;
|
||||||
customPromptIndicator: HTMLSpanElement | null = null;
|
customPromptIndicator: HTMLSpanElement | null = null;
|
||||||
currentStreamingNodeId: string | null;
|
currentStreamingNodeId: string | null;
|
||||||
|
|
||||||
|
branchChatBtn: HTMLButtonElement;
|
||||||
stopButton: HTMLButtonElement;
|
stopButton: HTMLButtonElement;
|
||||||
scrollToBottomBtn: HTMLButtonElement;
|
scrollToBottomBtn: HTMLButtonElement;
|
||||||
scrollToTopBtn: HTMLButtonElement;
|
scrollToTopBtn: HTMLButtonElement;
|
||||||
|
|
@ -457,6 +459,7 @@ export class ChatPanel {
|
||||||
async updateHistory(newHistory: ChatHistoryItem[]): Promise<void> {
|
async updateHistory(newHistory: ChatHistoryItem[]): Promise<void> {
|
||||||
this.chatHistory = newHistory;
|
this.chatHistory = newHistory;
|
||||||
await this.renderHistory();
|
await this.renderHistory();
|
||||||
|
this.updateScrollButtonsVisibility(); // НОВОЕ: проверяем видимость кнопок
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -614,6 +617,10 @@ export class ChatPanel {
|
||||||
<div class="llm-agent-chat-panel">
|
<div class="llm-agent-chat-panel">
|
||||||
|
|
||||||
<div class="sticky-btn-wrapper">
|
<div class="sticky-btn-wrapper">
|
||||||
|
<button class="branch-chat-btn" id="branch-chat-btn" title="Новая независимая ветвь" aria-label="Сбросить историю и начать ветку от корня графа">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-git-branch"><line x1="6" x2="6" y1="3" y2="15"></line><circle cx="18" cy="6" r="3"></circle><circle cx="6" cy="18" r="3"></circle><path d="M18 9a9 9 0 0 1-9 9"></path></svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button class="scroll-to-top-btn" id="scroll-to-top-btn" title="Прокрутить вверх" aria-label="Прокрутить к первому сообщению">
|
<button class="scroll-to-top-btn" id="scroll-to-top-btn" title="Прокрутить вверх" aria-label="Прокрутить к первому сообщению">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"></line><polyline points="5 12 12 5 19 12"></polyline></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"></line><polyline points="5 12 12 5 19 12"></polyline></svg>
|
||||||
</button>
|
</button>
|
||||||
|
|
@ -698,8 +705,9 @@ export class ChatPanel {
|
||||||
this.modelSelectButton = this.container.querySelector('#model-select-button') as HTMLButtonElement;
|
this.modelSelectButton = this.container.querySelector('#model-select-button') as HTMLButtonElement;
|
||||||
this.modelDropdown = this.container.querySelector('#model-dropdown') as HTMLDivElement;
|
this.modelDropdown = this.container.querySelector('#model-dropdown') as HTMLDivElement;
|
||||||
this.customPromptIndicator = this.container.querySelector('#custom-prompt-indicator') as HTMLSpanElement;
|
this.customPromptIndicator = this.container.querySelector('#custom-prompt-indicator') as HTMLSpanElement;
|
||||||
this.stopButton = this.container.querySelector('#stop-button') as HTMLButtonElement;
|
|
||||||
|
|
||||||
|
this.branchChatBtn = this.container.querySelector('#branch-chat-btn') as HTMLButtonElement;
|
||||||
|
this.stopButton = this.container.querySelector('#stop-button') as HTMLButtonElement;
|
||||||
this.scrollToTopBtn = this.container.querySelector('#scroll-to-top-btn') as HTMLButtonElement;
|
this.scrollToTopBtn = this.container.querySelector('#scroll-to-top-btn') as HTMLButtonElement;
|
||||||
this.scrollToBottomBtn = this.container.querySelector('#scroll-to-bottom-btn') as HTMLButtonElement;
|
this.scrollToBottomBtn = this.container.querySelector('#scroll-to-bottom-btn') as HTMLButtonElement;
|
||||||
|
|
||||||
|
|
@ -813,6 +821,10 @@ export class ChatPanel {
|
||||||
this.props.plugin.eventBus.emit('stop-all-streams');
|
this.props.plugin.eventBus.emit('stop-all-streams');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.branchChatBtn.addEventListener('click', () => {
|
||||||
|
this.props.plugin.eventBus.emit('start-new-independent-chat');
|
||||||
|
});
|
||||||
|
|
||||||
// Подписка на изменение стримов
|
// Подписка на изменение стримов
|
||||||
this.props.plugin.eventBus.on('global-stream-state-changed', (isStreaming: boolean) => {
|
this.props.plugin.eventBus.on('global-stream-state-changed', (isStreaming: boolean) => {
|
||||||
this.hasGlobalStreams = isStreaming;
|
this.hasGlobalStreams = isStreaming;
|
||||||
|
|
@ -1730,14 +1742,16 @@ export class ChatPanel {
|
||||||
if (!this.cachedScrollContainer || !this.cachedBtnWrapper) return;
|
if (!this.cachedScrollContainer || !this.cachedBtnWrapper) return;
|
||||||
|
|
||||||
const hasScrollbar = this.cachedScrollContainer.scrollHeight > (this.cachedScrollContainer.clientHeight + 2);
|
const hasScrollbar = this.cachedScrollContainer.scrollHeight > (this.cachedScrollContainer.clientHeight + 2);
|
||||||
|
const hasHistory = this.chatHistory && this.chatHistory.length > 0;
|
||||||
|
|
||||||
// Управляем видимостью кнопок скролла (скрываем их индивидуально)
|
// Управляем видимостью кнопок скролла (скрываем их индивидуально)
|
||||||
this.scrollToTopBtn.style.display = hasScrollbar ? 'flex' : 'none';
|
this.scrollToTopBtn.style.display = hasScrollbar ? 'flex' : 'none';
|
||||||
this.scrollToBottomBtn.style.display = hasScrollbar ? 'flex' : 'none';
|
this.scrollToBottomBtn.style.display = hasScrollbar ? 'flex' : 'none';
|
||||||
this.globalStopBtn.style.display = this.hasGlobalStreams ? 'flex' : 'none';
|
this.globalStopBtn.style.display = this.hasGlobalStreams ? 'flex' : 'none';
|
||||||
|
this.branchChatBtn.style.display = hasHistory ? 'flex' : 'none';
|
||||||
|
|
||||||
// Обертка видна, если есть либо скроллбар, либо активный стрим
|
// Обертка видна, если есть либо скроллбар, либо активный стрим
|
||||||
if (hasScrollbar || this.hasGlobalStreams) {
|
if (hasScrollbar || this.hasGlobalStreams || hasHistory) {
|
||||||
this.cachedBtnWrapper.classList.add('is-visible');
|
this.cachedBtnWrapper.classList.add('is-visible');
|
||||||
} else {
|
} else {
|
||||||
this.cachedBtnWrapper.classList.remove('is-visible');
|
this.cachedBtnWrapper.classList.remove('is-visible');
|
||||||
|
|
|
||||||
|
|
@ -528,7 +528,8 @@
|
||||||
|
|
||||||
/* Добавить общий стиль для обеих кнопок и специфичный для новой */
|
/* Добавить общий стиль для обеих кнопок и специфичный для новой */
|
||||||
.scroll-to-bottom-btn,
|
.scroll-to-bottom-btn,
|
||||||
.scroll-to-top-btn {
|
.scroll-to-top-btn,
|
||||||
|
.branch-chat-btn {
|
||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
border: 2px solid var(--background-primary);
|
border: 2px solid var(--background-primary);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
|
|
@ -557,7 +558,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.scroll-to-bottom-btn:hover,
|
.scroll-to-bottom-btn:hover,
|
||||||
.scroll-to-top-btn:hover {
|
.scroll-to-top-btn:hover,
|
||||||
|
.branch-chat-btn:hover {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transform: scale(1.1);
|
transform: scale(1.1);
|
||||||
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
|
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
|
||||||
|
|
@ -565,13 +567,15 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.scroll-to-bottom-btn:active,
|
.scroll-to-bottom-btn:active,
|
||||||
.scroll-to-top-btn:active {
|
.scroll-to-top-btn:active,
|
||||||
|
.branch-chat-btn:active {
|
||||||
transform: scale(0.95);
|
transform: scale(0.95);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Иконки кнопок */
|
/* Иконки кнопок */
|
||||||
.scroll-to-bottom-btn svg,
|
.scroll-to-bottom-btn svg,
|
||||||
.scroll-to-top-btn svg {
|
.scroll-to-top-btn svg,
|
||||||
|
.branch-chat-btn svg {
|
||||||
width: 18px;
|
width: 18px;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
stroke-width: 3px;
|
stroke-width: 3px;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user