From 5e59e020e3847bf1923bb5a2b79d54a844d10919 Mon Sep 17 00:00:00 2001 From: Lin Wang Date: Sun, 4 Feb 2024 15:46:43 +0800 Subject: [PATCH] Feat add tooltip for chat window header (#124) * feat: add tooltip to chat widnow header title Signed-off-by: Lin Wang * feat: remove title popover trigger Signed-off-by: Lin Wang * test: add miss unit tests for save to notebook button Signed-off-by: Lin Wang --------- Signed-off-by: Lin Wang --- .../chat_window_header_title.test.tsx | 23 ++++--- .../components/chat_window_header_title.tsx | 63 ++++++++++--------- 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/public/components/__tests__/chat_window_header_title.test.tsx b/public/components/__tests__/chat_window_header_title.test.tsx index 0234a5af..025dd62c 100644 --- a/public/components/__tests__/chat_window_header_title.test.tsx +++ b/public/components/__tests__/chat_window_header_title.test.tsx @@ -81,7 +81,7 @@ describe('', () => { it('should reload history list after edit conversation name', async () => { const { renderResult, useCoreMock } = setup(); - fireEvent.click(renderResult.getByText('foo')); + fireEvent.click(renderResult.getByLabelText('toggle chat context menu')); fireEvent.click(renderResult.getByText('Rename conversation')); fireEvent.change(renderResult.getByLabelText('Conversation name input'), { target: { value: 'bar' }, @@ -108,7 +108,7 @@ describe('', () => { renderResult.queryByRole('button', { name: 'Save to notebook' }) ).not.toBeInTheDocument(); - fireEvent.click(renderResult.getByText('foo')); + fireEvent.click(renderResult.getByLabelText('toggle chat context menu')); expect(renderResult.getByRole('button', { name: 'Rename conversation' })).toBeInTheDocument(); expect(renderResult.getByRole('button', { name: 'New conversation' })).toBeInTheDocument(); @@ -118,7 +118,7 @@ describe('', () => { it('should show rename modal and hide rename actions after rename button clicked', async () => { const { renderResult } = setup(); - fireEvent.click(renderResult.getByText('foo')); + fireEvent.click(renderResult.getByLabelText('toggle chat context menu')); fireEvent.click(renderResult.getByRole('button', { name: 'Rename conversation' })); await waitFor(() => { @@ -132,7 +132,7 @@ describe('', () => { it('should call loadChat with undefined, hide actions and show success toasts after new conversation button clicked', async () => { const { renderResult, useCoreMock, useChatActionsMock } = setup(); - fireEvent.click(renderResult.getByText('foo')); + fireEvent.click(renderResult.getByLabelText('toggle chat context menu')); expect(useChatActionsMock.loadChat).not.toHaveBeenCalled(); expect(useCoreMock.services.notifications.toasts.addSuccess).not.toHaveBeenCalled(); @@ -151,13 +151,20 @@ describe('', () => { }); it('should show save to notebook modal after "Save to notebook" clicked', async () => { - const { renderResult } = setup(); + const { renderResult } = setup({ + messages: [{ type: 'input', contentType: 'text', content: 'foo' }], + }); + + fireEvent.click(renderResult.getByLabelText('toggle chat context menu')); + + expect(renderResult.getByRole('button', { name: 'Save to notebook' })).not.toBeDisabled(); - fireEvent.click(renderResult.getByText('foo')); fireEvent.click(renderResult.getByRole('button', { name: 'Save to notebook' })); await waitFor(() => { - expect(renderResult.queryByText('Save to notebook')).toBeInTheDocument(); + expect( + renderResult.queryByText('Please enter a name for your notebook.') + ).toBeInTheDocument(); }); }); @@ -166,7 +173,7 @@ describe('', () => { messages: [{ type: 'output', content: 'bar', contentType: 'markdown' }], }); - fireEvent.click(renderResult.getByText('foo')); + fireEvent.click(renderResult.getByLabelText('toggle chat context menu')); expect(renderResult.getByRole('button', { name: 'Save to notebook' })).toBeDisabled(); }); diff --git a/public/components/chat_window_header_title.tsx b/public/components/chat_window_header_title.tsx index 9a305b44..1d2fde1b 100644 --- a/public/components/chat_window_header_title.tsx +++ b/public/components/chat_window_header_title.tsx @@ -10,6 +10,7 @@ import { EuiFlexItem, EuiPopover, EuiButtonIcon, + EuiToolTip, } from '@elastic/eui'; import React, { useCallback, useState } from 'react'; import { useChatContext } from '../contexts'; @@ -28,6 +29,7 @@ export const ChatWindowHeaderTitle = React.memo(() => { const [isSaveNotebookModalOpen, setSaveNotebookModalOpen] = useState(false); const { chatState } = useChatState(); const { saveChat } = useSaveChat(); + const displayTitle = chatContext.conversationId ? chatContext.title : 'OpenSearch Assistant'; const onButtonClick = useCallback(() => { setPopoverOpen((flag) => !flag); @@ -59,27 +61,6 @@ export const ChatWindowHeaderTitle = React.memo(() => { setSaveNotebookModalOpen(false); }; - const button = ( - - -

- {chatContext.conversationId ? chatContext.title : 'OpenSearch Assistant'} -

-
- - - - - - -
- ); - const items = [ { return ( <> - - - + +

{displayTitle}

+
+ + + + + + } + isOpen={isPopoverOpen} + closePopover={closePopover} + panelPaddingSize="none" + anchorPosition="downCenter" + > + + + + {isRenameModalOpen && (