Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/global/core/chat/favouriteApp/type.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ export type ChatFavouriteAppSchema = {
_id: string;
teamId: string;
appId: string;
tags: string[]; // tag id list
favouriteTags: string[]; // tag id list
order: number;
};

Expand Down
4 changes: 2 additions & 2 deletions packages/global/core/chat/setting/type.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export type ChatSettingSchema = {
inputs?: Record<`${NodeInputKeyEnum}` | string, any>;
}[];
quickAppIds: string[];
tags: {
favouriteTags: {
id: string;
name: string;
}[];
Expand All @@ -22,7 +22,7 @@ export type ChatSettingSchema = {
export type ChatSettingUpdateParams = Partial<Omit<ChatSettingSchema, '_id' | 'appId' | 'teamId'>>;

export type QuickAppType = { _id: string; name: string; avatar: string };
export type ChatTagType = ChatSettingSchema['tags'][number];
export type ChatFavouriteTagType = ChatSettingSchema['favouriteTags'][number];
export type SelectedToolType = ChatSettingSchema['selectedTools'][number] & {
name: string;
avatar: string;
Expand Down
2 changes: 1 addition & 1 deletion packages/service/core/chat/favouriteApp/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const ChatFavouriteAppSchema = new Schema({
ref: AppCollectionName,
required: true
},
tags: {
favouriteTags: {
type: [String],
default: []
},
Expand Down
5 changes: 3 additions & 2 deletions packages/service/core/chat/setting/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,15 @@ const ChatSettingSchema = new Schema({
type: [String],
default: []
},
tags: {
favouriteTags: {
type: [
{
id: String,
name: String
}
],
default: []
default: [],
_id: false
}
});

Expand Down
4 changes: 4 additions & 0 deletions packages/web/i18n/en/chat.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,10 @@
"setting.favourite.categories_modal.delete_confirm_button": "delete",
"setting.favourite.categories_modal.delete_confirm_title": "Confirm deletion",
"setting.favourite.categories_modal.title": "Total {{num}} categories",
"setting.favourite.category.no_data": "No selected applications available",
"setting.favourite.category_all": "All Categories",
"setting.favourite.category_placeholder": "Select a category",
"setting.favourite.category_tab.all": "All",
"setting.favourite.confirm_button": "Sure",
"setting.favourite.delete_app_cancel_button": "Cancel",
"setting.favourite.delete_app_confirm": "Are you sure you want to remove this featured app?",
Expand All @@ -122,6 +124,7 @@
"setting.favourite.table_column_category": "Category",
"setting.favourite.table_column_intro": "Introduce",
"setting.favourite.table_column_name": "Name",
"setting.favourite.tag.no_data": "No classification yet",
"setting.favourite.title": "Favourite App",
"setting.home.available_tools": "Available tools",
"setting.home.available_tools.add": "Add",
Expand All @@ -134,6 +137,7 @@
"setting.home.dialogue_tips_placeholder": "Please enter the prompt text of the dialog box",
"setting.home.home_tab_title": "Home Page Title",
"setting.home.home_tab_title_placeholder": "Please enter the title of the homepage",
"setting.home.no_selected_app": "No selected App",
"setting.home.quick_apps": "Quick Apps",
"setting.home.quick_apps.add": "Configure quick applications",
"setting.home.quick_apps.placeholder": "Please select an application",
Expand Down
9 changes: 7 additions & 2 deletions packages/web/i18n/zh-CN/chat.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@
"setting.favourite.categories_modal.delete_confirm_title": "确认删除",
"setting.favourite.categories_modal.title": "共 {{num}} 个分类",
"setting.favourite.category_all": "全部分类",
"setting.favourite.category_tab.all": "全部",
"setting.favourite.category.no_data": "暂无可用精选应用",
"setting.favourite.tag.no_data": "暂无分类",
"setting.favourite.category_placeholder": "选择分类",
"setting.favourite.confirm_button": "确定",
"setting.favourite.delete_app_cancel_button": "取消",
Expand All @@ -124,11 +127,10 @@
"setting.favourite.table_column_intro": "介绍",
"setting.favourite.table_column_name": "名称",
"setting.favourite.title": "精选应用",
"setting.favourite.goto_add": "去配置",
"setting.home.available_tools": "可用工具",
"setting.home.available_tools.add": "添加",
"setting.home.cancel_button": "取消",
"setting.home.commercial_version": "商业版",
"setting.home.confirm_button": "确定",
"setting.home.diagram": "示意图",
"setting.home.dialogue_tips": "对话框提示文字",
"setting.home.dialogue_tips.default": "你可以问我任何问题",
Expand All @@ -142,6 +144,9 @@
"setting.home.slogan.default": "你好👋,我是 FastGPT ! 请问有什么可以帮你?",
"setting.home.slogan_placeholder": "请输入 Slogan",
"setting.home.title": "首页配置",
"setting.home.cancel_button": "取消",
"setting.home.confirm_button": "确定",
"setting.home.no_selected_app": "未选择应用",
"setting.incorrect_plan": "当前套餐不支持该功能,请升级订阅套餐",
"setting.incorrect_version": "当前版本不支持该功能",
"setting.log_details.title": "首页日志",
Expand Down
4 changes: 4 additions & 0 deletions packages/web/i18n/zh-Hant/chat.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,10 @@
"setting.favourite.categories_modal.delete_confirm_button": "刪除",
"setting.favourite.categories_modal.delete_confirm_title": "確認刪除",
"setting.favourite.categories_modal.title": "共 {{num}} 個分類",
"setting.favourite.category.no_data": "暫無可用精選應用",
"setting.favourite.category_all": "全部分類",
"setting.favourite.category_placeholder": "選擇分類",
"setting.favourite.category_tab.all": "全部",
"setting.favourite.confirm_button": "確定",
"setting.favourite.delete_app_cancel_button": "取消",
"setting.favourite.delete_app_confirm": "確定要移除該精選應用嗎?",
Expand All @@ -121,6 +123,7 @@
"setting.favourite.table_column_category": "分類",
"setting.favourite.table_column_intro": "介紹",
"setting.favourite.table_column_name": "名稱",
"setting.favourite.tag.no_data": "暫無分類",
"setting.favourite.title": "精選應用",
"setting.home.available_tools": "可用工具",
"setting.home.available_tools.add": "添加",
Expand All @@ -133,6 +136,7 @@
"setting.home.dialogue_tips_placeholder": "請輸入對話框提示文字",
"setting.home.home_tab_title": "首頁標題",
"setting.home.home_tab_title_placeholder": "請輸入首頁標題",
"setting.home.no_selected_app": "未選擇應用",
"setting.home.quick_apps": "快捷應用",
"setting.home.quick_apps.add": "配置快捷應用",
"setting.home.quick_apps.placeholder": "請選擇應用",
Expand Down
169 changes: 98 additions & 71 deletions projects/app/src/pageComponents/chat/ChatFavouriteApp/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { getFavouriteApps } from '@/web/core/chat/api';
import {
Box,
Button,
Flex,
Grid,
GridItem,
Expand All @@ -20,13 +21,14 @@ import { useContextSelector } from 'use-context-selector';
import { ChatSettingContext } from '@/web/core/chat/context/chatSettingContext';
import { useMemo } from 'react';
import Avatar from '@fastgpt/web/components/common/Avatar';
import { ChatSidebarPaneEnum } from '@/pageComponents/chat/constants';
import { ChatSettingTabOptionEnum, ChatSidebarPaneEnum } from '@/pageComponents/chat/constants';
import MyPopover from '@fastgpt/web/components/common/MyPopover';
import NextHead from '@/components/common/NextHead';
import MyBox from '@fastgpt/web/components/common/MyBox';
import ChatSliderMobileDrawer from '@/pageComponents/chat/slider/ChatSliderMobileDrawer';
import { useSystem } from '@fastgpt/web/hooks/useSystem';
import { ChatContext } from '@/web/core/chat/context/chatContext';
import EmptyTip from '@fastgpt/web/components/common/EmptyTip';

const ChatFavouriteApp = () => {
const { isPc } = useSystem();
Expand All @@ -38,7 +40,7 @@ const ChatFavouriteApp = () => {
const wideLogoUrl = useContextSelector(ChatSettingContext, (v) => v.chatSettings?.wideLogoUrl);
const homeTabTitle = useContextSelector(ChatSettingContext, (v) => v.chatSettings?.homeTabTitle);

const tags = useContextSelector(ChatSettingContext, (v) => v.chatSettings?.tags || []);
const tags = useContextSelector(ChatSettingContext, (v) => v.chatSettings?.favouriteTags || []);
const tagCache = useMemo(() => {
return tags.reduce(
(acc, tag) => {
Expand All @@ -50,7 +52,7 @@ const ChatFavouriteApp = () => {
}, [tags]);
const tagOptions = useMemo(
() => [
{ label: t('chat:setting.favourite.category_all'), value: '' },
{ label: t('chat:setting.favourite.category_tab.all'), value: '' },
...tags.map((tag) => ({
label: tag.name,
value: tag.id
Expand Down Expand Up @@ -146,7 +148,12 @@ const ChatFavouriteApp = () => {
)}

{/* header */}
<Flex w="full" p={['0 16px 0 16px', '24px 24px 0 24px']} justifyContent="space-between">
<Flex
w="full"
p={['0 16px 0 16px', '24px 24px 0 24px']}
gap={4}
justifyContent="space-between"
>
{/* tag tabs */}
<Tabs variant="unstyled">
<TabList
Expand Down Expand Up @@ -193,77 +200,97 @@ const ChatFavouriteApp = () => {
</Flex>

{/* list */}
<Grid templateColumns={['1fr', 'repeat(3, 1fr)']} gap={4} p={['4', '6']} overflowY="auto">
{favouriteApps.map((app) => (
<GridItem key={app.appId} cursor="pointer">
<Flex
flexDirection={'column'}
justifyContent="space-between"
gap={2}
p={4}
borderRadius={8}
border="sm"
borderColor="myGray.200"
boxShadow="sm"
minH="140px"
transition="all 0.1s ease-in-out"
_hover={{
borderColor: 'primary.300'
}}
onClick={() => handlePaneChange(ChatSidebarPaneEnum.RECENTLY_USED_APPS, app.appId)}
>
<Box>
<Flex fontSize="16px" fontWeight="500" alignItems="center" gap={2}>
<Avatar src={app.avatar} borderRadius={8} />
<Flex>{app.name}</Flex>
</Flex>
{favouriteApps.length > 0 ? (
<Grid templateColumns={['1fr', 'repeat(3, 1fr)']} gap={4} p={['4', '6']} overflowY="auto">
{favouriteApps.map((app) => (
<GridItem key={app.appId} cursor="pointer">
<Flex
flexDirection={'column'}
justifyContent="space-between"
gap={2}
p={4}
borderRadius={8}
border="sm"
borderColor="myGray.200"
boxShadow="sm"
minH="140px"
transition="all 0.1s ease-in-out"
_hover={{
borderColor: 'primary.300'
}}
onClick={() => handlePaneChange(ChatSidebarPaneEnum.RECENTLY_USED_APPS, app.appId)}
>
<Box>
<Flex fontSize="16px" fontWeight="500" alignItems="center" gap={2}>
<Avatar src={app.avatar} borderRadius={8} />
<Flex>{app.name}</Flex>
</Flex>

<Box fontSize="sm">{app.intro}</Box>
</Box>
<Box fontSize="sm">{app.intro}</Box>
</Box>

<Flex gap="2" flexWrap="wrap">
{app.tags.slice(0, 3).map((id) => (
<TagBox key={id} id={id} />
))}
<Flex gap="2" flexWrap="wrap">
{app.favouriteTags.slice(0, 3).map((id) => (
<TagBox key={id} id={id} />
))}

{app.tags.length > 3 && (
<MyPopover
placement="bottom"
trigger="hover"
width="fit-content"
Trigger={
<Box
fontSize="xs"
borderRadius={8}
bg="myGray.100"
px="1.5"
py="0.5"
onClick={(e) => e.stopPropagation()}
>
+{app.tags.length - 3}
</Box>
}
>
{() => (
<Flex
p="2"
gap="2"
flexWrap="wrap"
maxW="200px"
onClick={(e) => e.stopPropagation()}
>
{app.tags.slice(3).map((id) => (
<TagBox key={id} id={id} />
))}
</Flex>
)}
</MyPopover>
)}
{app.favouriteTags.length > 3 && (
<MyPopover
placement="bottom"
trigger="hover"
width="fit-content"
Trigger={
<Box
fontSize="xs"
borderRadius={8}
bg="myGray.100"
px="1.5"
py="0.5"
onClick={(e) => e.stopPropagation()}
>
+{app.favouriteTags.length - 3}
</Box>
}
>
{() => (
<Flex
p="2"
gap="2"
flexWrap="wrap"
maxW="200px"
onClick={(e) => e.stopPropagation()}
>
{app.favouriteTags.slice(3).map((id) => (
<TagBox key={id} id={id} />
))}
</Flex>
)}
</MyPopover>
)}
</Flex>
</Flex>
</Flex>
</GridItem>
))}
</Grid>
</GridItem>
))}
</Grid>
) : (
<Flex flexDir="column" flex="1" justifyContent="center" alignItems="center" gap={4}>
<EmptyTip p="0" text={t('chat:setting.favourite.category.no_data')} />

<Button
variant="primary"
leftIcon={<MyIcon name="common/settingLight" w="16px" />}
onClick={() =>
handlePaneChange(
ChatSidebarPaneEnum.SETTING,
undefined,
ChatSettingTabOptionEnum.FAVOURITE_APPS
)
}
>
{t('chat:setting.favourite.goto_add')}
</Button>
</Flex>
)}
</MyBox>
);
};
Expand Down
Loading
Loading