From 2fd6484d61e6678405548da9a838c5beb90772a7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 13 Feb 2025 16:50:39 +0800 Subject: [PATCH 1/6] chore(version): 0.9.23 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8b69195a..0132b8691 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "CherryStudio", - "version": "0.9.22", + "version": "0.9.23", "private": true, "description": "A powerful AI assistant for producer.", "main": "./out/main/index.js", From fe427b9a4bf4f3bf91d3baa23063e8243cc6dbc0 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Fri, 14 Feb 2025 11:31:41 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat(renderer):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=BD=91=E6=A0=BC=E6=A8=A1=E5=BC=8F=E7=9A=84=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/home/Messages/MessageGroup.tsx | 130 ++++++++++++++---- src/renderer/src/store/settings.ts | 2 +- 2 files changed, 105 insertions(+), 27 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index 3b8488bfe..067c6797a 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -1,4 +1,10 @@ -import { ColumnHeightOutlined, ColumnWidthOutlined, DeleteOutlined, FolderOutlined } from '@ant-design/icons' +import { + ColumnHeightOutlined, + ColumnWidthOutlined, + DeleteOutlined, + FolderOutlined, + NumberOutlined +} from '@ant-design/icons' import ModelAvatar from '@renderer/components/Avatar/ModelAvatar' import { HStack } from '@renderer/components/Layout' import Scrollbar from '@renderer/components/Scrollbar' @@ -6,7 +12,7 @@ import { useSettings } from '@renderer/hooks/useSettings' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { MultiModelMessageStyle } from '@renderer/store/settings' import { Message, Model, Topic } from '@renderer/types' -import { Button, Segmented as AntdSegmented } from 'antd' +import { Button, Popover, Segmented as AntdSegmented } from 'antd' import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' @@ -68,32 +74,84 @@ const MessageGroup: FC = ({ return ( - {messages.map((message, index) => ( - - - - ))} + {messages.map((message, index) => + multiModelMessageStyle === 'grid' ? ( + + + + } + trigger="hover" + styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto' } }} + getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement} + key={message.id}> + + + + + ) : ( + + + + ) + )} {isGrouped && ( - {['fold', 'vertical', 'horizontal'].map((layout) => ( + {['fold', 'vertical', 'horizontal', 'grid'].map((layout) => ( = ({ ) : layout === 'horizontal' ? ( - ) : ( + ) : layout === 'vertical' ? ( + ) : ( + )} ))} @@ -143,7 +203,7 @@ const MessageGroup: FC = ({ } const GroupContainer = styled.div<{ $isGrouped: boolean; $layout: MultiModelMessageStyle }>` - padding-top: ${({ $isGrouped, $layout }) => ($isGrouped && $layout === 'horizontal' ? '15px' : '0')}; + padding-top: ${({ $isGrouped, $layout }) => ($isGrouped && ['horizontal', 'grid'].includes($layout) ? '15px' : '0')}; ` const GridContainer = styled.div<{ $count: number; $layout: MultiModelMessageStyle }>` @@ -161,12 +221,20 @@ const GridContainer = styled.div<{ $count: number; $layout: MultiModelMessageSty ); } overflow-y: auto; + ${(props) => + props.$layout === 'grid' && + css` + grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-rows: auto; + gap: 16px; + `} ` interface MessageWrapperProps { - $layout: 'fold' | 'horizontal' | 'vertical' + $layout: 'fold' | 'horizontal' | 'vertical' | 'grid' $selected: boolean $isGrouped: boolean + $isInPopover?: boolean } const MessageWrapper = styled(Scrollbar)` @@ -193,6 +261,16 @@ const MessageWrapper = styled(Scrollbar)` } return '' }} + + ${({ $layout, $isInPopover }) => + $layout === 'grid' && + css` + max-height: ${$isInPopover ? '50vh' : '300px'}; + overflow-y: auto; + border: 0.5px solid var(--color-border); + padding: 10px; + border-radius: 6px; + `} ` const GroupMenuBar = styled.div<{ $layout: MultiModelMessageStyle }>` diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 18dba29f9..568c017b4 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -69,7 +69,7 @@ export interface SettingsState { notionApiKey: string | null } -export type MultiModelMessageStyle = 'horizontal' | 'vertical' | 'fold' +export type MultiModelMessageStyle = 'horizontal' | 'vertical' | 'fold' | 'grid' const initialState: SettingsState = { showAssistants: true, From 26db0460b89b877ebeae1d5f99c88e6d3303228a Mon Sep 17 00:00:00 2001 From: cuiliang Date: Fri, 14 Feb 2025 14:42:29 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat(message):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=BD=91=E6=A0=BC=E5=B1=95=E7=A4=BA=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/i18n/locales/en-us.json | 2 ++ src/renderer/src/i18n/locales/ja-jp.json | 2 ++ src/renderer/src/i18n/locales/ru-ru.json | 2 ++ src/renderer/src/i18n/locales/zh-cn.json | 2 ++ src/renderer/src/i18n/locales/zh-tw.json | 2 ++ .../src/pages/home/Messages/MessageGroup.tsx | 20 +++++------ .../src/pages/home/Tabs/SettingsTab.tsx | 36 +++++++++++++++++-- src/renderer/src/store/settings.ts | 12 +++++++ 8 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index bd07c9e43..794beac77 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -627,6 +627,8 @@ "messages.input.title": "Input Settings", "messages.markdown_rendering_input_message": "Markdown render input message", "messages.math_engine": "Math engine", + "messages.grid_columns": "Message grid display columns", + "messages.grid_popover_trigger": "Grid detail trigger", "messages.metrics": "{{time_first_token_millsec}}ms to first token | {{token_speed}} tok/sec", "messages.model.title": "Model Settings", "messages.title": "Message Settings", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 355982878..1dc8f2e6a 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -627,6 +627,8 @@ "messages.input.title": "入力設定", "messages.markdown_rendering_input_message": "Markdownで入力メッセージをレンダリング", "messages.math_engine": "数式エンジン", + "messages.grid_columns": "メッセージグリッドの表示列数", + "messages.grid_popover_trigger": "グリッド詳細トリガー", "messages.metrics": "最初のトークンまでの時間 {{time_first_token_millsec}}ms | トークン速度 {{token_speed}} tok/sec", "messages.model.title": "モデル設定", "messages.title": "メッセージ設定", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 4d5f7e213..9e7c61bd3 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -628,6 +628,8 @@ "messages.math_engine": "Математический движок", "messages.metrics": "{{time_first_token_millsec}}ms до первого токена | {{token_speed}} tok/sec", "messages.model.title": "Настройки модели", + "messages.grid_columns": "Количество столбцов сетки сообщений", + "messages.grid_popover_trigger": "Триггер для отображения подробной информации в сетке", "messages.title": "Настройки сообщений", "messages.use_serif_font": "Использовать serif шрифт", "model": "Модель по умолчанию", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index eb93bbaae..6b4763a79 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -627,6 +627,8 @@ "messages.input.title": "输入设置", "messages.markdown_rendering_input_message": "Markdown 渲染输入消息", "messages.math_engine": "数学公式引擎", + "messages.grid_columns": "消息网格展示列数", + "messages.grid_popover_trigger": "网格详情触发", "messages.metrics": "首字时延 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens", "messages.model.title": "模型设置", "messages.title": "消息设置", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 7001096ab..8f3b51387 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -626,6 +626,8 @@ "messages.input.show_estimated_tokens": "顯示預估 Token 數", "messages.input.title": "輸入設定", "messages.math_engine": "Markdown 渲染輸入訊息", + "messages.grid_columns": "消息網格展示列數", + "messages.grid_popover_trigger": "網格詳情觸發", "messages.metrics": "首字時延 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens", "messages.model.title": "模型設定", "messages.title": "訊息設定", diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index 067c6797a..95c3ef438 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -12,7 +12,7 @@ import { useSettings } from '@renderer/hooks/useSettings' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { MultiModelMessageStyle } from '@renderer/store/settings' import { Message, Model, Topic } from '@renderer/types' -import { Button, Popover, Segmented as AntdSegmented } from 'antd' +import { Segmented as AntdSegmented, Button, Popover } from 'antd' import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' @@ -38,7 +38,7 @@ const MessageGroup: FC = ({ onGetMessages, onDeleteGroupMessages }) => { - const { multiModelMessageStyle: multiModelMessageStyleSetting } = useSettings() + const { multiModelMessageStyle: multiModelMessageStyleSetting, gridColumns, gridPopoverTrigger } = useSettings() const { t } = useTranslation() const [multiModelMessageStyle, setMultiModelMessageStyle] = @@ -73,7 +73,7 @@ const MessageGroup: FC = ({ return ( - + {messages.map((message, index) => multiModelMessageStyle === 'grid' ? ( = ({ /> } - trigger="hover" + trigger={gridPopoverTrigger} styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto' } }} getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement} key={message.id}> @@ -206,25 +206,25 @@ const GroupContainer = styled.div<{ $isGrouped: boolean; $layout: MultiModelMess padding-top: ${({ $isGrouped, $layout }) => ($isGrouped && ['horizontal', 'grid'].includes($layout) ? '15px' : '0')}; ` -const GridContainer = styled.div<{ $count: number; $layout: MultiModelMessageStyle }>` +const GridContainer = styled.div<{ $count: number; $layout: MultiModelMessageStyle; $gridColumns: number }>` width: 100%; display: grid; grid-template-columns: repeat( - ${(props) => (['fold', 'vertical'].includes(props.$layout) ? 1 : props.$count)}, + ${({ $layout, $count }) => (['fold', 'vertical'].includes($layout) ? 1 : $count)}, minmax(550px, 1fr) ); gap: ${({ $layout }) => ($layout === 'horizontal' ? '16px' : '0')}; @media (max-width: 800px) { grid-template-columns: repeat( - ${(props) => (['fold', 'vertical'].includes(props.$layout) ? 1 : props.$count)}, + ${({ $layout, $count }) => (['fold', 'vertical'].includes($layout) ? 1 : $count)}, minmax(400px, 1fr) ); } overflow-y: auto; - ${(props) => - props.$layout === 'grid' && + ${({ $gridColumns, $layout }) => + $layout === 'grid' && css` - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(${$gridColumns || 2}, minmax(0, 1fr)); grid-template-rows: auto; gap: 16px; `} diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 2df3ff66d..2f336d539 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -19,6 +19,8 @@ import { setCodeShowLineNumbers, setCodeStyle, setFontSize, + setGridColumns, + setGridPopoverTrigger, setMathEngine, setMessageFont, setMessageStyle, @@ -42,13 +44,14 @@ interface Props { const SettingsTab: FC = (props) => { const { assistant, updateAssistantSettings, updateAssistant } = useAssistant(props.assistant.id) - const { messageStyle, codeStyle, fontSize, language } = useSettings() + const { messageStyle, codeStyle, fontSize, language, gridColumns } = useSettings() const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) const [contextCount, setContextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT) const [enableMaxTokens, setEnableMaxTokens] = useState(assistant?.settings?.enableMaxTokens ?? false) const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0) const [fontSizeValue, setFontSizeValue] = useState(fontSize) + const [gridColumnsValue, setGridColumnsValue] = useState(gridColumns) const [streamOutput, setStreamOutput] = useState(assistant?.settings?.streamOutput ?? true) const { t } = useTranslation() @@ -69,7 +72,8 @@ const SettingsTab: FC = (props) => { mathEngine, autoTranslateWithSpace, pasteLongTextThreshold, - multiModelMessageStyle + multiModelMessageStyle, + gridPopoverTrigger } = useSettings() const onUpdateAssistantSettings = (settings: Partial) => { @@ -313,6 +317,34 @@ const SettingsTab: FC = (props) => { + + {t('settings.messages.grid_popover_trigger')} + + + + + {t('settings.messages.grid_columns')} + + + + setGridColumnsValue(value)} + onChangeComplete={(value) => dispatch(setGridColumns(value))} + min={2} + max={9} + step={1} + /> + + + {t('settings.font_size.title')} diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 568c017b4..c2e91b989 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -44,6 +44,8 @@ export interface SettingsState { mathEngine: 'MathJax' | 'KaTeX' messageStyle: 'plain' | 'bubble' codeStyle: CodeStyleVarious + gridColumns: number + gridPopoverTrigger: 'hover' | 'click' // webdav 配置 host, user, pass, path webdavHost: string webdavUser: string @@ -99,6 +101,8 @@ const initialState: SettingsState = { mathEngine: 'KaTeX', messageStyle: 'plain', codeStyle: 'auto', + gridColumns: 2, + gridPopoverTrigger: 'hover', webdavHost: '', webdavUser: '', webdavPass: '', @@ -224,6 +228,12 @@ const settingsSlice = createSlice({ setMathEngine: (state, action: PayloadAction<'MathJax' | 'KaTeX'>) => { state.mathEngine = action.payload }, + setGridColumns: (state, action: PayloadAction) => { + state.gridColumns = action.payload + }, + setGridPopoverTrigger: (state, action: PayloadAction<'hover' | 'click'>) => { + state.gridPopoverTrigger = action.payload + }, setMessageStyle: (state, action: PayloadAction<'plain' | 'bubble'>) => { state.messageStyle = action.payload }, @@ -310,6 +320,8 @@ export const { setCodeShowLineNumbers, setCodeCollapsible, setMathEngine, + setGridColumns, + setGridPopoverTrigger, setMessageStyle, setCodeStyle, setTranslateModelPrompt, From 6c8ea444f01bd470732470062de4c496dfb3f8ad Mon Sep 17 00:00:00 2001 From: cuiliang Date: Fri, 14 Feb 2025 15:05:58 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=20gridPopoverTrigger=20?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=8A=A8=E6=80=81=E8=AE=BE=E7=BD=AE=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=88=86=E7=BB=84=E7=9A=84=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/home/Messages/MessageGroup.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index 95c3ef438..7337d0566 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -12,7 +12,7 @@ import { useSettings } from '@renderer/hooks/useSettings' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { MultiModelMessageStyle } from '@renderer/store/settings' import { Message, Model, Topic } from '@renderer/types' -import { Segmented as AntdSegmented, Button, Popover } from 'antd' +import { Button, Popover, Segmented as AntdSegmented } from 'antd' import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' @@ -114,11 +114,17 @@ const MessageGroup: FC = ({ topic={topic} index={message.index} hidePresetMessages={hidePresetMessages} - style={{ - paddingTop: isGrouped && ['horizontal', 'grid'].includes(multiModelMessageStyle) ? 0 : 15, - overflow: isGrouped ? 'hidden' : 'auto', - maxHeight: isGrouped ? '280px' : 'unset' - }} + style={ + gridPopoverTrigger === 'hover' + ? { + paddingTop: isGrouped && ['horizontal', 'grid'].includes(multiModelMessageStyle) ? 0 : 15, + overflow: isGrouped ? 'hidden' : 'auto', + maxHeight: isGrouped ? '280px' : 'unset' + } + : { + paddingTop: isGrouped && ['horizontal', 'grid'].includes(multiModelMessageStyle) ? 0 : 15 + } + } onSetMessages={onSetMessages} onDeleteMessage={onDeleteMessage} onGetMessages={onGetMessages} From 32168d92150039379123d0f77ea861cef638380e Mon Sep 17 00:00:00 2001 From: cuiliang Date: Fri, 14 Feb 2025 15:28:15 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=9C=A8=20MessageMenubar=20=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=B8=AD=EF=BC=8C=E5=90=84=E4=B8=AA=E6=8C=89=E9=92=AE?= =?UTF-8?q?=20click=20=E4=BA=8B=E4=BB=B6=E9=98=BB=E6=AD=A2=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=86=92=E6=B3=A1,=E9=81=BF=E5=85=8D=E6=89=93?= =?UTF-8?q?=E5=BC=80=20popover?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/home/Messages/MessageMenubar.tsx | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index a354b0a92..abaeebb17 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -60,12 +60,16 @@ const MessageMenubar: FC = (props) => { const isUserMessage = message.role === 'user' - const onCopy = useCallback(() => { - navigator.clipboard.writeText(removeTrailingDoubleSpaces(message.content)) - window.message.success({ content: t('message.copied'), key: 'copy-message' }) - setCopied(true) - setTimeout(() => setCopied(false), 2000) - }, [message.content, t]) + const onCopy = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation() + navigator.clipboard.writeText(removeTrailingDoubleSpaces(message.content)) + window.message.success({ content: t('message.copied'), key: 'copy-message' }) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + }, + [message.content, t] + ) const onNewBranch = useCallback(async () => { await modelGenerating() @@ -195,13 +199,15 @@ const MessageMenubar: FC = (props) => { [message, onEdit, onNewBranch, t] ) - const onRegenerate = async () => { + const onRegenerate = async (e: React.MouseEvent | undefined) => { + e?.stopPropagation?.() await modelGenerating() const _message: Message = resetAssistantMessage(message, model || assistantModel) onEditMessage?.(_message) } - const onMentionModel = async () => { + const onMentionModel = async (e: React.MouseEvent) => { + e.stopPropagation() await modelGenerating() const selectedModel = await SelectModelPopup.show({ model }) if (!selectedModel) return @@ -215,9 +221,13 @@ const MessageMenubar: FC = (props) => { onEditMessage?.(_message) } - const onUseful = useCallback(() => { - onEditMessage?.({ ...message, useful: !message.useful }) - }, [message, onEditMessage]) + const onUseful = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation() + onEditMessage?.({ ...message, useful: !message.useful }) + }, + [message, onEditMessage] + ) return ( @@ -269,13 +279,14 @@ const MessageMenubar: FC = (props) => { key: 'translate-close', onClick: () => onEditMessage?.({ ...message, translatedContent: undefined }) } - ] + ], + onClick: (e) => e.domEvent.stopPropagation() }} trigger={['click']} placement="topRight" arrow> - + e.stopPropagation()}> @@ -297,14 +308,25 @@ const MessageMenubar: FC = (props) => { onDeleteMessage?.(message) : undefined}> + onClick={ + isGrouped + ? (e) => { + e.stopPropagation() + onDeleteMessage?.(message) + } + : (e) => e.stopPropagation() + }> {!isUserMessage && ( - - + e.domEvent.stopPropagation() }} + trigger={['click']} + placement="topRight" + arrow> + e.stopPropagation()}> From 160ffc364466474e8fb559f7b09623185a42c154 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Sun, 16 Feb 2025 21:35:53 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=A4=9A=E6=A8=A1=E5=9E=8B=E5=9B=9E?= =?UTF-8?q?=E7=AD=94=E6=A0=B7=E5=BC=8F=E6=B7=BB=E5=8A=A0=E7=BD=91=E6=A0=BC?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=B9=B6=E4=BC=98=E5=8C=96=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/i18n/locales/ja-jp.json | 1 + src/renderer/src/i18n/locales/ru-ru.json | 1 + src/renderer/src/i18n/locales/zh-cn.json | 1 + src/renderer/src/i18n/locales/zh-tw.json | 1 + .../src/pages/home/Messages/MessageGroup.tsx | 40 ++++++++++--------- .../src/pages/home/Tabs/SettingsTab.tsx | 1 + src/renderer/src/store/settings.ts | 2 +- 8 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 7c390d3c0..5aabfc922 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -364,6 +364,7 @@ "message.multi_model_style.fold": "Fold", "message.multi_model_style.horizontal": "Horizontal", "message.multi_model_style.vertical": "Vertical", + "message.multi_model_style.grid": "Grid", "message.style": "Message style", "message.style.bubble": "Bubble", "message.style.plain": "Plain", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index ba6b25bb0..25774cc60 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -363,6 +363,7 @@ "message.multi_model_style.fold": "折りたたむ", "message.multi_model_style.horizontal": "水平", "message.multi_model_style.vertical": "垂直", + "message.multi_model_style.grid": "グリッド", "message.style": "メッセージスタイル", "message.style.bubble": "バブル", "message.style.plain": "プレーン", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 2903f255b..79ea0c77f 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -364,6 +364,7 @@ "message.multi_model_style.fold": "Свернуть", "message.multi_model_style.horizontal": "Горизонтальный", "message.multi_model_style.vertical": "Вертикальный", + "message.multi_model_style.grid": "клетчатый вид", "message.style": "Стиль сообщения", "message.style.bubble": "Пузырь", "message.style.plain": "Простой", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index fa6341a63..61ada8dba 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -366,6 +366,7 @@ "message.multi_model_style.fold": "折叠", "message.multi_model_style.horizontal": "水平", "message.multi_model_style.vertical": "垂直", + "message.multi_model_style.grid": "网格", "message.style": "消息样式", "message.style.bubble": "气泡", "message.style.plain": "简洁", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 36fb27b78..425aa4923 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -364,6 +364,7 @@ "message.multi_model_style.fold": "折疊", "message.multi_model_style.horizontal": "水平", "message.multi_model_style.vertical": "垂直", + "message.multi_model_style.grid": "网格", "message.style": "消息樣式", "message.style.bubble": "氣泡", "message.style.plain": "簡潔", diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index 7337d0566..629185edf 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -75,7 +75,7 @@ const MessageGroup: FC = ({ {messages.map((message, index) => - multiModelMessageStyle === 'grid' ? ( + multiModelMessageStyle === 'grid' && message.role === 'assistant' && isGrouped ? ( = ({ } trigger={gridPopoverTrigger} - styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto' } }} + styles={{ root: { maxWidth: '60vw', minWidth: '550px', overflowY: 'auto', zIndex: 1000 } }} getPopupContainer={(triggerNode) => triggerNode.parentNode as HTMLElement} key={message.id}> = ({ index={message.index} hidePresetMessages={hidePresetMessages} style={ - gridPopoverTrigger === 'hover' + gridPopoverTrigger === 'hover' && isGrouped ? { paddingTop: isGrouped && ['horizontal', 'grid'].includes(multiModelMessageStyle) ? 0 : 15, overflow: isGrouped ? 'hidden' : 'auto', maxHeight: isGrouped ? '280px' : 'unset' } - : { - paddingTop: isGrouped && ['horizontal', 'grid'].includes(multiModelMessageStyle) ? 0 : 15 - } + : undefined } onSetMessages={onSetMessages} onDeleteMessage={onDeleteMessage} @@ -209,7 +207,7 @@ const MessageGroup: FC = ({ } const GroupContainer = styled.div<{ $isGrouped: boolean; $layout: MultiModelMessageStyle }>` - padding-top: ${({ $isGrouped, $layout }) => ($isGrouped && ['horizontal', 'grid'].includes($layout) ? '15px' : '0')}; + padding-top: ${({ $isGrouped, $layout }) => ($isGrouped && 'horizontal' === $layout ? '15px' : '0')}; ` const GridContainer = styled.div<{ $count: number; $layout: MultiModelMessageStyle; $gridColumns: number }>` @@ -227,10 +225,10 @@ const GridContainer = styled.div<{ $count: number; $layout: MultiModelMessageSty ); } overflow-y: auto; - ${({ $gridColumns, $layout }) => + ${({ $gridColumns, $layout, $count }) => $layout === 'grid' && css` - grid-template-columns: repeat(${$gridColumns || 2}, minmax(0, 1fr)); + grid-template-columns: repeat(${$count > 1 ? $gridColumns || 2 : 1}, minmax(0, 1fr)); grid-template-rows: auto; gap: 16px; `} @@ -268,15 +266,21 @@ const MessageWrapper = styled(Scrollbar)` return '' }} - ${({ $layout, $isInPopover }) => - $layout === 'grid' && - css` - max-height: ${$isInPopover ? '50vh' : '300px'}; - overflow-y: auto; - border: 0.5px solid var(--color-border); - padding: 10px; - border-radius: 6px; - `} + ${({ $layout, $isInPopover, $isGrouped }) => + $layout === 'grid' && $isGrouped + ? css` + max-height: ${$isInPopover ? '50vh' : '300px'}; + overflow-y: auto; + border: 0.5px solid var(--color-border); + padding: 10px; + border-radius: 6px; + ` + : css` + overflow-y: auto; + border: 0.5px solid transparent; + padding: 0 10px; + border-radius: 6px; + `} ` const GroupMenuBar = styled.div<{ $layout: MultiModelMessageStyle }>` diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 2f336d539..8828716c0 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -287,6 +287,7 @@ const SettingsTab: FC = (props) => { {t('message.message.multi_model_style.fold')} {t('message.message.multi_model_style.vertical')} {t('message.message.multi_model_style.horizontal')} + {t('message.message.multi_model_style.grid')} diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index c2e91b989..03b516581 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -275,7 +275,7 @@ const settingsSlice = createSlice({ setEnableQuickAssistant: (state, action: PayloadAction) => { state.enableQuickAssistant = action.payload }, - setMultiModelMessageStyle: (state, action: PayloadAction<'horizontal' | 'vertical' | 'fold'>) => { + setMultiModelMessageStyle: (state, action: PayloadAction<'horizontal' | 'vertical' | 'fold' | 'grid'>) => { state.multiModelMessageStyle = action.payload }, setNotionDatabaseID: (state, action: PayloadAction) => {