balibabu
commited on
Commit
·
e441caf
1
Parent(s):
72412ac
remove showDeleteConfirm function and center the Empty of knowledge list and extract the text of the login page to en.json (#203)
Browse filesfeat: remove showDeleteConfirm function
feat: center the Empty of knowledge list
feat: extract the text of the login page to en.json
#204
- web/src/app.tsx +9 -9
- web/src/components/deleting-confirm/index.less +0 -0
- web/src/components/deleting-confirm/index.tsx +0 -39
- web/src/components/svg-icon.tsx +0 -1
- web/src/hooks/{commonHooks.ts → commonHooks.tsx} +44 -1
- web/src/hooks/knowledgeHook.ts +4 -2
- web/src/layouts/components/header/index.tsx +5 -3
- web/src/locales/en.json +30 -1
- web/src/pages/add-knowledge/components/knowledge-file/model.ts +0 -2
- web/src/pages/add-knowledge/components/knowledge-file/parsing-action-cell/index.tsx +2 -1
- web/src/pages/chat/hooks.ts +3 -2
- web/src/pages/knowledge/index.less +3 -0
- web/src/pages/knowledge/index.tsx +6 -6
- web/src/pages/knowledge/knowledge-card/index.tsx +2 -1
- web/src/pages/knowledge/knowledge-creating-modal/index.tsx +6 -4
- web/src/pages/login/index.tsx +20 -25
web/src/app.tsx
CHANGED
|
@@ -1,16 +1,16 @@
|
|
| 1 |
-
import { ConfigProvider } from 'antd';
|
| 2 |
-
import
|
| 3 |
|
| 4 |
export function rootContainer(container: ReactNode) {
|
| 5 |
-
return
|
| 6 |
-
ConfigProvider
|
| 7 |
-
|
| 8 |
-
theme: {
|
| 9 |
token: {
|
| 10 |
fontFamily: 'Inter',
|
| 11 |
},
|
| 12 |
-
}
|
| 13 |
-
|
| 14 |
-
|
|
|
|
| 15 |
);
|
| 16 |
}
|
|
|
|
| 1 |
+
import { App, ConfigProvider } from 'antd';
|
| 2 |
+
import { ReactNode } from 'react';
|
| 3 |
|
| 4 |
export function rootContainer(container: ReactNode) {
|
| 5 |
+
return (
|
| 6 |
+
<ConfigProvider
|
| 7 |
+
theme={{
|
|
|
|
| 8 |
token: {
|
| 9 |
fontFamily: 'Inter',
|
| 10 |
},
|
| 11 |
+
}}
|
| 12 |
+
>
|
| 13 |
+
<App> {container}</App>
|
| 14 |
+
</ConfigProvider>
|
| 15 |
);
|
| 16 |
}
|
web/src/components/deleting-confirm/index.less
DELETED
|
File without changes
|
web/src/components/deleting-confirm/index.tsx
DELETED
|
@@ -1,39 +0,0 @@
|
|
| 1 |
-
import { ExclamationCircleFilled } from '@ant-design/icons';
|
| 2 |
-
import { Modal } from 'antd';
|
| 3 |
-
|
| 4 |
-
const { confirm } = Modal;
|
| 5 |
-
|
| 6 |
-
interface IProps {
|
| 7 |
-
onOk?: (...args: any[]) => any;
|
| 8 |
-
onCancel?: (...args: any[]) => any;
|
| 9 |
-
}
|
| 10 |
-
|
| 11 |
-
export const showDeleteConfirm = ({
|
| 12 |
-
onOk,
|
| 13 |
-
onCancel,
|
| 14 |
-
}: IProps): Promise<number> => {
|
| 15 |
-
return new Promise((resolve, reject) => {
|
| 16 |
-
confirm({
|
| 17 |
-
title: 'Are you sure delete this item?',
|
| 18 |
-
icon: <ExclamationCircleFilled />,
|
| 19 |
-
content: 'Some descriptions',
|
| 20 |
-
okText: 'Yes',
|
| 21 |
-
okType: 'danger',
|
| 22 |
-
cancelText: 'No',
|
| 23 |
-
async onOk() {
|
| 24 |
-
try {
|
| 25 |
-
const ret = await onOk?.();
|
| 26 |
-
resolve(ret);
|
| 27 |
-
console.info(ret);
|
| 28 |
-
} catch (error) {
|
| 29 |
-
reject(error);
|
| 30 |
-
}
|
| 31 |
-
},
|
| 32 |
-
onCancel() {
|
| 33 |
-
onCancel?.();
|
| 34 |
-
},
|
| 35 |
-
});
|
| 36 |
-
});
|
| 37 |
-
};
|
| 38 |
-
|
| 39 |
-
export default showDeleteConfirm;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
web/src/components/svg-icon.tsx
CHANGED
|
@@ -4,7 +4,6 @@ import { IconComponentProps } from '@ant-design/icons/lib/components/Icon';
|
|
| 4 |
const importAll = (requireContext: __WebpackModuleApi.RequireContext) => {
|
| 5 |
const list = requireContext.keys().map((key) => {
|
| 6 |
const name = key.replace(/\.\/(.*)\.\w+$/, '$1');
|
| 7 |
-
console.log(name, requireContext(key));
|
| 8 |
return { name, value: requireContext(key) };
|
| 9 |
});
|
| 10 |
return list;
|
|
|
|
| 4 |
const importAll = (requireContext: __WebpackModuleApi.RequireContext) => {
|
| 5 |
const list = requireContext.keys().map((key) => {
|
| 6 |
const name = key.replace(/\.\/(.*)\.\w+$/, '$1');
|
|
|
|
| 7 |
return { name, value: requireContext(key) };
|
| 8 |
});
|
| 9 |
return list;
|
web/src/hooks/{commonHooks.ts → commonHooks.tsx}
RENAMED
|
@@ -1,5 +1,8 @@
|
|
|
|
|
|
|
|
| 1 |
import isEqual from 'lodash/isEqual';
|
| 2 |
-
import { useEffect, useRef, useState } from 'react';
|
|
|
|
| 3 |
|
| 4 |
export const useSetModalState = () => {
|
| 5 |
const [visible, setVisible] = useState(false);
|
|
@@ -72,3 +75,43 @@ export function useDynamicSVGImport(
|
|
| 72 |
|
| 73 |
return { error, loading, SvgIcon: ImportedIconRef.current };
|
| 74 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { ExclamationCircleFilled } from '@ant-design/icons';
|
| 2 |
+
import { App } from 'antd';
|
| 3 |
import isEqual from 'lodash/isEqual';
|
| 4 |
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
| 5 |
+
import { useTranslation } from 'react-i18next';
|
| 6 |
|
| 7 |
export const useSetModalState = () => {
|
| 8 |
const [visible, setVisible] = useState(false);
|
|
|
|
| 75 |
|
| 76 |
return { error, loading, SvgIcon: ImportedIconRef.current };
|
| 77 |
}
|
| 78 |
+
|
| 79 |
+
interface IProps {
|
| 80 |
+
onOk?: (...args: any[]) => any;
|
| 81 |
+
onCancel?: (...args: any[]) => any;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
export const useShowDeleteConfirm = () => {
|
| 85 |
+
const { modal } = App.useApp();
|
| 86 |
+
const { t } = useTranslation();
|
| 87 |
+
|
| 88 |
+
const showDeleteConfirm = useCallback(
|
| 89 |
+
({ onOk, onCancel }: IProps): Promise<number> => {
|
| 90 |
+
return new Promise((resolve, reject) => {
|
| 91 |
+
modal.confirm({
|
| 92 |
+
title: t('common.deleteModalTitle'),
|
| 93 |
+
icon: <ExclamationCircleFilled />,
|
| 94 |
+
// content: 'Some descriptions',
|
| 95 |
+
okText: 'Yes',
|
| 96 |
+
okType: 'danger',
|
| 97 |
+
cancelText: 'No',
|
| 98 |
+
async onOk() {
|
| 99 |
+
try {
|
| 100 |
+
const ret = await onOk?.();
|
| 101 |
+
resolve(ret);
|
| 102 |
+
console.info(ret);
|
| 103 |
+
} catch (error) {
|
| 104 |
+
reject(error);
|
| 105 |
+
}
|
| 106 |
+
},
|
| 107 |
+
onCancel() {
|
| 108 |
+
onCancel?.();
|
| 109 |
+
},
|
| 110 |
+
});
|
| 111 |
+
});
|
| 112 |
+
},
|
| 113 |
+
[t, modal],
|
| 114 |
+
);
|
| 115 |
+
|
| 116 |
+
return showDeleteConfirm;
|
| 117 |
+
};
|
web/src/hooks/knowledgeHook.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import
|
| 2 |
import { IKnowledge } from '@/interfaces/database/knowledge';
|
| 3 |
import { useCallback, useEffect, useMemo } from 'react';
|
| 4 |
import { useDispatch, useSearchParams, useSelector } from 'umi';
|
|
@@ -17,6 +17,7 @@ export const useDeleteDocumentById = (): {
|
|
| 17 |
} => {
|
| 18 |
const dispatch = useDispatch();
|
| 19 |
const knowledgeBaseId = useKnowledgeBaseId();
|
|
|
|
| 20 |
|
| 21 |
const removeDocument = (documentId: string) => () => {
|
| 22 |
return dispatch({
|
|
@@ -79,6 +80,7 @@ export const useDeleteChunkByIds = (): {
|
|
| 79 |
removeChunk: (chunkIds: string[], documentId: string) => Promise<number>;
|
| 80 |
} => {
|
| 81 |
const dispatch = useDispatch();
|
|
|
|
| 82 |
|
| 83 |
const removeChunk = useCallback(
|
| 84 |
(chunkIds: string[], documentId: string) => () => {
|
|
@@ -97,7 +99,7 @@ export const useDeleteChunkByIds = (): {
|
|
| 97 |
(chunkIds: string[], documentId: string): Promise<number> => {
|
| 98 |
return showDeleteConfirm({ onOk: removeChunk(chunkIds, documentId) });
|
| 99 |
},
|
| 100 |
-
[removeChunk],
|
| 101 |
);
|
| 102 |
|
| 103 |
return {
|
|
|
|
| 1 |
+
import { useShowDeleteConfirm } from '@/hooks/commonHooks';
|
| 2 |
import { IKnowledge } from '@/interfaces/database/knowledge';
|
| 3 |
import { useCallback, useEffect, useMemo } from 'react';
|
| 4 |
import { useDispatch, useSearchParams, useSelector } from 'umi';
|
|
|
|
| 17 |
} => {
|
| 18 |
const dispatch = useDispatch();
|
| 19 |
const knowledgeBaseId = useKnowledgeBaseId();
|
| 20 |
+
const showDeleteConfirm = useShowDeleteConfirm();
|
| 21 |
|
| 22 |
const removeDocument = (documentId: string) => () => {
|
| 23 |
return dispatch({
|
|
|
|
| 80 |
removeChunk: (chunkIds: string[], documentId: string) => Promise<number>;
|
| 81 |
} => {
|
| 82 |
const dispatch = useDispatch();
|
| 83 |
+
const showDeleteConfirm = useShowDeleteConfirm();
|
| 84 |
|
| 85 |
const removeChunk = useCallback(
|
| 86 |
(chunkIds: string[], documentId: string) => () => {
|
|
|
|
| 99 |
(chunkIds: string[], documentId: string): Promise<number> => {
|
| 100 |
return showDeleteConfirm({ onOk: removeChunk(chunkIds, documentId) });
|
| 101 |
},
|
| 102 |
+
[removeChunk, showDeleteConfirm],
|
| 103 |
);
|
| 104 |
|
| 105 |
return {
|
web/src/layouts/components/header/index.tsx
CHANGED
|
@@ -8,6 +8,7 @@ import styles from './index.less';
|
|
| 8 |
|
| 9 |
import { useNavigateWithFromState } from '@/hooks/routeHook';
|
| 10 |
import { useCallback, useMemo } from 'react';
|
|
|
|
| 11 |
import { useLocation } from 'umi';
|
| 12 |
|
| 13 |
const { Header } = Layout;
|
|
@@ -18,14 +19,15 @@ const RagHeader = () => {
|
|
| 18 |
} = theme.useToken();
|
| 19 |
const navigate = useNavigateWithFromState();
|
| 20 |
const { pathname } = useLocation();
|
|
|
|
| 21 |
|
| 22 |
const tagsData = useMemo(
|
| 23 |
() => [
|
| 24 |
-
{ path: '/knowledge', name: '
|
| 25 |
-
{ path: '/chat', name: '
|
| 26 |
// { path: '/file', name: 'File Management', icon: FileIcon },
|
| 27 |
],
|
| 28 |
-
[],
|
| 29 |
);
|
| 30 |
|
| 31 |
const currentPath = useMemo(() => {
|
|
|
|
| 8 |
|
| 9 |
import { useNavigateWithFromState } from '@/hooks/routeHook';
|
| 10 |
import { useCallback, useMemo } from 'react';
|
| 11 |
+
import { useTranslation } from 'react-i18next';
|
| 12 |
import { useLocation } from 'umi';
|
| 13 |
|
| 14 |
const { Header } = Layout;
|
|
|
|
| 19 |
} = theme.useToken();
|
| 20 |
const navigate = useNavigateWithFromState();
|
| 21 |
const { pathname } = useLocation();
|
| 22 |
+
const { t } = useTranslation('translation', { keyPrefix: 'header' });
|
| 23 |
|
| 24 |
const tagsData = useMemo(
|
| 25 |
() => [
|
| 26 |
+
{ path: '/knowledge', name: t('knowledgeBase'), icon: KnowledgeBaseIcon },
|
| 27 |
+
{ path: '/chat', name: t('chat'), icon: StarIon },
|
| 28 |
// { path: '/file', name: 'File Management', icon: FileIcon },
|
| 29 |
],
|
| 30 |
+
[t],
|
| 31 |
);
|
| 32 |
|
| 33 |
const currentPath = useMemo(() => {
|
web/src/locales/en.json
CHANGED
|
@@ -1,12 +1,41 @@
|
|
| 1 |
{
|
| 2 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
"header": {
|
|
|
|
|
|
|
| 4 |
"register": "Register",
|
| 5 |
"signin": "Sign in",
|
| 6 |
"home": "Home",
|
| 7 |
"setting": "用户设置",
|
| 8 |
"logout": "登出"
|
| 9 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
"footer": {
|
| 11 |
"detail": "All rights reserved @ React"
|
| 12 |
},
|
|
|
|
| 1 |
{
|
| 2 |
+
"common": {
|
| 3 |
+
"delete": "Delete",
|
| 4 |
+
"deleteModalTitle": "Are you sure delete this item?"
|
| 5 |
+
},
|
| 6 |
+
"login": {
|
| 7 |
+
"login": "Sign in",
|
| 8 |
+
"signUp": "Sign up",
|
| 9 |
+
"loginDescription": "We’re so excited to see you again!",
|
| 10 |
+
"registerDescription": "Glad to have you on board!",
|
| 11 |
+
"emailLabel": "Email",
|
| 12 |
+
"emailPlaceholder": "Please input email",
|
| 13 |
+
"passwordLabel": "Password",
|
| 14 |
+
"passwordPlaceholder": "Please input password",
|
| 15 |
+
"rememberMe": "Remember me",
|
| 16 |
+
"signInTip": "Don’t have an account?",
|
| 17 |
+
"signUpTip": "Already have an account?",
|
| 18 |
+
"nicknameLabel": "Nickname",
|
| 19 |
+
"nicknamePlaceholder": "Please input nickname",
|
| 20 |
+
"register": "Create an account",
|
| 21 |
+
"continue": "Continue"
|
| 22 |
+
},
|
| 23 |
"header": {
|
| 24 |
+
"knowledgeBase": "Knowledge Base",
|
| 25 |
+
"chat": "Chat",
|
| 26 |
"register": "Register",
|
| 27 |
"signin": "Sign in",
|
| 28 |
"home": "Home",
|
| 29 |
"setting": "用户设置",
|
| 30 |
"logout": "登出"
|
| 31 |
},
|
| 32 |
+
"knowledgeList": {
|
| 33 |
+
"welcome": "Welcome back",
|
| 34 |
+
"description": "Which database are we going to use today?",
|
| 35 |
+
"createKnowledgeBase": "Create knowledge base",
|
| 36 |
+
"name": "Name",
|
| 37 |
+
"namePlaceholder": "Please input name!"
|
| 38 |
+
},
|
| 39 |
"footer": {
|
| 40 |
"detail": "All rights reserved @ React"
|
| 41 |
},
|
web/src/pages/add-knowledge/components/knowledge-file/model.ts
CHANGED
|
@@ -203,7 +203,6 @@ const model: DvaModel<KFModelState> = {
|
|
| 203 |
const documentId = payload;
|
| 204 |
try {
|
| 205 |
const ret = yield call(getDocumentFile, documentId);
|
| 206 |
-
console.info('fetch_document_file:', ret);
|
| 207 |
return ret;
|
| 208 |
} catch (error) {
|
| 209 |
console.warn(error);
|
|
@@ -238,7 +237,6 @@ const model: DvaModel<KFModelState> = {
|
|
| 238 |
payload: { current: 1, pageSize: 10 },
|
| 239 |
});
|
| 240 |
}
|
| 241 |
-
console.info(location);
|
| 242 |
});
|
| 243 |
},
|
| 244 |
},
|
|
|
|
| 203 |
const documentId = payload;
|
| 204 |
try {
|
| 205 |
const ret = yield call(getDocumentFile, documentId);
|
|
|
|
| 206 |
return ret;
|
| 207 |
} catch (error) {
|
| 208 |
console.warn(error);
|
|
|
|
| 237 |
payload: { current: 1, pageSize: 10 },
|
| 238 |
});
|
| 239 |
}
|
|
|
|
| 240 |
});
|
| 241 |
},
|
| 242 |
},
|
web/src/pages/add-knowledge/components/knowledge-file/parsing-action-cell/index.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import
|
| 2 |
import { useRemoveDocument } from '@/hooks/documentHooks';
|
| 3 |
import { IKnowledgeFile } from '@/interfaces/database/knowledge';
|
| 4 |
import { api_host } from '@/utils/api';
|
|
@@ -31,6 +31,7 @@ const ParsingActionCell = ({
|
|
| 31 |
const isRunning = isParserRunning(record.run);
|
| 32 |
|
| 33 |
const removeDocument = useRemoveDocument(documentId);
|
|
|
|
| 34 |
|
| 35 |
const onRmDocument = () => {
|
| 36 |
if (!isRunning) {
|
|
|
|
| 1 |
+
import { useShowDeleteConfirm } from '@/hooks/commonHooks';
|
| 2 |
import { useRemoveDocument } from '@/hooks/documentHooks';
|
| 3 |
import { IKnowledgeFile } from '@/interfaces/database/knowledge';
|
| 4 |
import { api_host } from '@/utils/api';
|
|
|
|
| 31 |
const isRunning = isParserRunning(record.run);
|
| 32 |
|
| 33 |
const removeDocument = useRemoveDocument(documentId);
|
| 34 |
+
const showDeleteConfirm = useShowDeleteConfirm();
|
| 35 |
|
| 36 |
const onRmDocument = () => {
|
| 37 |
if (!isRunning) {
|
web/src/pages/chat/hooks.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
| 1 |
-
import showDeleteConfirm from '@/components/deleting-confirm';
|
| 2 |
import { MessageType } from '@/constants/chat';
|
| 3 |
import { fileIconMap } from '@/constants/common';
|
| 4 |
-
import { useSetModalState } from '@/hooks/commonHooks';
|
| 5 |
import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
|
| 6 |
import { IConversation, IDialog } from '@/interfaces/database/chat';
|
| 7 |
import { IChunk } from '@/interfaces/database/knowledge';
|
|
@@ -150,6 +149,7 @@ export const useSelectPromptConfigParameters = (): VariableTableDataType[] => {
|
|
| 150 |
|
| 151 |
export const useRemoveDialog = () => {
|
| 152 |
const dispatch = useDispatch();
|
|
|
|
| 153 |
|
| 154 |
const removeDocument = (dialogIds: Array<string>) => () => {
|
| 155 |
return dispatch({
|
|
@@ -668,6 +668,7 @@ export const useRemoveConversation = () => {
|
|
| 668 |
const dispatch = useDispatch();
|
| 669 |
const { dialogId } = useGetChatSearchParams();
|
| 670 |
const { handleClickConversation } = useClickConversationCard();
|
|
|
|
| 671 |
|
| 672 |
const removeConversation = (conversationIds: Array<string>) => async () => {
|
| 673 |
const ret = await dispatch<any>({
|
|
|
|
|
|
|
| 1 |
import { MessageType } from '@/constants/chat';
|
| 2 |
import { fileIconMap } from '@/constants/common';
|
| 3 |
+
import { useSetModalState, useShowDeleteConfirm } from '@/hooks/commonHooks';
|
| 4 |
import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
|
| 5 |
import { IConversation, IDialog } from '@/interfaces/database/chat';
|
| 6 |
import { IChunk } from '@/interfaces/database/knowledge';
|
|
|
|
| 149 |
|
| 150 |
export const useRemoveDialog = () => {
|
| 151 |
const dispatch = useDispatch();
|
| 152 |
+
const showDeleteConfirm = useShowDeleteConfirm();
|
| 153 |
|
| 154 |
const removeDocument = (dialogIds: Array<string>) => () => {
|
| 155 |
return dispatch({
|
|
|
|
| 668 |
const dispatch = useDispatch();
|
| 669 |
const { dialogId } = useGetChatSearchParams();
|
| 670 |
const { handleClickConversation } = useClickConversationCard();
|
| 671 |
+
const showDeleteConfirm = useShowDeleteConfirm();
|
| 672 |
|
| 673 |
const removeConversation = (conversationIds: Array<string>) => async () => {
|
| 674 |
const ret = await dispatch<any>({
|
web/src/pages/knowledge/index.less
CHANGED
|
@@ -44,4 +44,7 @@
|
|
| 44 |
.knowledgeCardContainer {
|
| 45 |
padding: 0 60px;
|
| 46 |
overflow: auto;
|
|
|
|
|
|
|
|
|
|
| 47 |
}
|
|
|
|
| 44 |
.knowledgeCardContainer {
|
| 45 |
padding: 0 60px;
|
| 46 |
overflow: auto;
|
| 47 |
+
.knowledgeEmpty {
|
| 48 |
+
width: 100%;
|
| 49 |
+
}
|
| 50 |
}
|
web/src/pages/knowledge/index.tsx
CHANGED
|
@@ -6,22 +6,22 @@ import { Button, Empty, Flex, Space, Spin } from 'antd';
|
|
| 6 |
import KnowledgeCard from './knowledge-card';
|
| 7 |
import KnowledgeCreatingModal from './knowledge-creating-modal';
|
| 8 |
|
|
|
|
| 9 |
import styles from './index.less';
|
| 10 |
|
| 11 |
const Knowledge = () => {
|
| 12 |
const { list, loading } = useFetchKnowledgeList();
|
| 13 |
const userInfo = useSelectUserInfo();
|
|
|
|
| 14 |
|
| 15 |
return (
|
| 16 |
<Flex className={styles.knowledge} vertical flex={1}>
|
| 17 |
<div className={styles.topWrapper}>
|
| 18 |
<div>
|
| 19 |
<span className={styles.title}>
|
| 20 |
-
|
| 21 |
</span>
|
| 22 |
-
<p className={styles.description}>
|
| 23 |
-
Which database are we going to use today?
|
| 24 |
-
</p>
|
| 25 |
</div>
|
| 26 |
<Space size={'large'}>
|
| 27 |
{/* <Button icon={<FilterIcon />} className={styles.filterButton}>
|
|
@@ -38,7 +38,7 @@ const Knowledge = () => {
|
|
| 38 |
}}
|
| 39 |
className={styles.topButton}
|
| 40 |
>
|
| 41 |
-
|
| 42 |
</Button>
|
| 43 |
<KnowledgeCreatingModal
|
| 44 |
visible={visible}
|
|
@@ -62,7 +62,7 @@ const Knowledge = () => {
|
|
| 62 |
);
|
| 63 |
})
|
| 64 |
) : (
|
| 65 |
-
<Empty></Empty>
|
| 66 |
)}
|
| 67 |
</Flex>
|
| 68 |
</Spin>
|
|
|
|
| 6 |
import KnowledgeCard from './knowledge-card';
|
| 7 |
import KnowledgeCreatingModal from './knowledge-creating-modal';
|
| 8 |
|
| 9 |
+
import { useTranslation } from 'react-i18next';
|
| 10 |
import styles from './index.less';
|
| 11 |
|
| 12 |
const Knowledge = () => {
|
| 13 |
const { list, loading } = useFetchKnowledgeList();
|
| 14 |
const userInfo = useSelectUserInfo();
|
| 15 |
+
const { t } = useTranslation('translation', { keyPrefix: 'knowledgeList' });
|
| 16 |
|
| 17 |
return (
|
| 18 |
<Flex className={styles.knowledge} vertical flex={1}>
|
| 19 |
<div className={styles.topWrapper}>
|
| 20 |
<div>
|
| 21 |
<span className={styles.title}>
|
| 22 |
+
{t('welcome')}, {userInfo.nickname}
|
| 23 |
</span>
|
| 24 |
+
<p className={styles.description}>{t('description')}</p>
|
|
|
|
|
|
|
| 25 |
</div>
|
| 26 |
<Space size={'large'}>
|
| 27 |
{/* <Button icon={<FilterIcon />} className={styles.filterButton}>
|
|
|
|
| 38 |
}}
|
| 39 |
className={styles.topButton}
|
| 40 |
>
|
| 41 |
+
{t('createKnowledgeBase')}
|
| 42 |
</Button>
|
| 43 |
<KnowledgeCreatingModal
|
| 44 |
visible={visible}
|
|
|
|
| 62 |
);
|
| 63 |
})
|
| 64 |
) : (
|
| 65 |
+
<Empty className={styles.knowledgeEmpty}></Empty>
|
| 66 |
)}
|
| 67 |
</Flex>
|
| 68 |
</Spin>
|
web/src/pages/knowledge/knowledge-card/index.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
import { ReactComponent as MoreIcon } from '@/assets/svg/more.svg';
|
| 2 |
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
|
|
|
| 3 |
import { IKnowledge } from '@/interfaces/database/knowledge';
|
| 4 |
import { formatDate } from '@/utils/date';
|
| 5 |
import {
|
|
@@ -11,7 +12,6 @@ import {
|
|
| 11 |
import { Avatar, Card, Dropdown, MenuProps, Space } from 'antd';
|
| 12 |
import { useDispatch, useNavigate } from 'umi';
|
| 13 |
|
| 14 |
-
import showDeleteConfirm from '@/components/deleting-confirm';
|
| 15 |
import styles from './index.less';
|
| 16 |
|
| 17 |
interface IProps {
|
|
@@ -21,6 +21,7 @@ interface IProps {
|
|
| 21 |
const KnowledgeCard = ({ item }: IProps) => {
|
| 22 |
const navigate = useNavigate();
|
| 23 |
const dispatch = useDispatch();
|
|
|
|
| 24 |
|
| 25 |
const removeKnowledge = () => {
|
| 26 |
return dispatch({
|
|
|
|
| 1 |
import { ReactComponent as MoreIcon } from '@/assets/svg/more.svg';
|
| 2 |
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
| 3 |
+
import { useShowDeleteConfirm } from '@/hooks/commonHooks';
|
| 4 |
import { IKnowledge } from '@/interfaces/database/knowledge';
|
| 5 |
import { formatDate } from '@/utils/date';
|
| 6 |
import {
|
|
|
|
| 12 |
import { Avatar, Card, Dropdown, MenuProps, Space } from 'antd';
|
| 13 |
import { useDispatch, useNavigate } from 'umi';
|
| 14 |
|
|
|
|
| 15 |
import styles from './index.less';
|
| 16 |
|
| 17 |
interface IProps {
|
|
|
|
| 21 |
const KnowledgeCard = ({ item }: IProps) => {
|
| 22 |
const navigate = useNavigate();
|
| 23 |
const dispatch = useDispatch();
|
| 24 |
+
const showDeleteConfirm = useShowDeleteConfirm();
|
| 25 |
|
| 26 |
const removeKnowledge = () => {
|
| 27 |
return dispatch({
|
web/src/pages/knowledge/knowledge-creating-modal/index.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
| 1 |
import { IModalManagerChildrenProps } from '@/components/modal-manager';
|
| 2 |
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
| 3 |
import { Form, Input, Modal } from 'antd';
|
|
|
|
| 4 |
import { useDispatch, useNavigate, useSelector } from 'umi';
|
| 5 |
|
| 6 |
type FieldType = {
|
|
@@ -17,6 +18,7 @@ const KnowledgeCreatingModal = ({
|
|
| 17 |
(state: any) => state.loading.effects['kSModel/createKb'],
|
| 18 |
);
|
| 19 |
const navigate = useNavigate();
|
|
|
|
| 20 |
|
| 21 |
const handleOk = async () => {
|
| 22 |
const ret = await form.validateFields();
|
|
@@ -50,7 +52,7 @@ const KnowledgeCreatingModal = ({
|
|
| 50 |
|
| 51 |
return (
|
| 52 |
<Modal
|
| 53 |
-
title=
|
| 54 |
open={visible}
|
| 55 |
onOk={handleOk}
|
| 56 |
onCancel={handleCancel}
|
|
@@ -67,11 +69,11 @@ const KnowledgeCreatingModal = ({
|
|
| 67 |
form={form}
|
| 68 |
>
|
| 69 |
<Form.Item<FieldType>
|
| 70 |
-
label=
|
| 71 |
name="name"
|
| 72 |
-
rules={[{ required: true, message: '
|
| 73 |
>
|
| 74 |
-
<Input />
|
| 75 |
</Form.Item>
|
| 76 |
</Form>
|
| 77 |
</Modal>
|
|
|
|
| 1 |
import { IModalManagerChildrenProps } from '@/components/modal-manager';
|
| 2 |
import { KnowledgeRouteKey } from '@/constants/knowledge';
|
| 3 |
import { Form, Input, Modal } from 'antd';
|
| 4 |
+
import { useTranslation } from 'react-i18next';
|
| 5 |
import { useDispatch, useNavigate, useSelector } from 'umi';
|
| 6 |
|
| 7 |
type FieldType = {
|
|
|
|
| 18 |
(state: any) => state.loading.effects['kSModel/createKb'],
|
| 19 |
);
|
| 20 |
const navigate = useNavigate();
|
| 21 |
+
const { t } = useTranslation('translation', { keyPrefix: 'knowledgeList' });
|
| 22 |
|
| 23 |
const handleOk = async () => {
|
| 24 |
const ret = await form.validateFields();
|
|
|
|
| 52 |
|
| 53 |
return (
|
| 54 |
<Modal
|
| 55 |
+
title={t('createKnowledgeBase')}
|
| 56 |
open={visible}
|
| 57 |
onOk={handleOk}
|
| 58 |
onCancel={handleCancel}
|
|
|
|
| 69 |
form={form}
|
| 70 |
>
|
| 71 |
<Form.Item<FieldType>
|
| 72 |
+
label={t('name')}
|
| 73 |
name="name"
|
| 74 |
+
rules={[{ required: true, message: t('namePlaceholder') }]}
|
| 75 |
>
|
| 76 |
+
<Input placeholder={t('namePlaceholder')} />
|
| 77 |
</Form.Item>
|
| 78 |
</Form>
|
| 79 |
</Modal>
|
web/src/pages/login/index.tsx
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
|
| 2 |
import { rsaPsw } from '@/utils';
|
| 3 |
import { Button, Checkbox, Form, Input } from 'antd';
|
|
@@ -6,7 +7,6 @@ import { useTranslation } from 'react-i18next';
|
|
| 6 |
import { Icon, useNavigate } from 'umi';
|
| 7 |
import RightPanel from './right-panel';
|
| 8 |
|
| 9 |
-
import { useLogin, useRegister } from '@/hooks/loginHooks';
|
| 10 |
import styles from './index.less';
|
| 11 |
|
| 12 |
const Login = () => {
|
|
@@ -14,7 +14,7 @@ const Login = () => {
|
|
| 14 |
const navigate = useNavigate();
|
| 15 |
const login = useLogin();
|
| 16 |
const register = useRegister();
|
| 17 |
-
const { t } = useTranslation();
|
| 18 |
|
| 19 |
// TODO: When the server address request is not accessible, the value of dva-loading always remains true.
|
| 20 |
|
|
@@ -75,13 +75,11 @@ const Login = () => {
|
|
| 75 |
<div className={styles.loginLeft}>
|
| 76 |
<div className={styles.leftContainer}>
|
| 77 |
<div className={styles.loginTitle}>
|
| 78 |
-
<div>
|
| 79 |
-
{title === 'login' ? t('login.login') : 'Create an account'}
|
| 80 |
-
</div>
|
| 81 |
<span>
|
| 82 |
{title === 'login'
|
| 83 |
-
? '
|
| 84 |
-
: '
|
| 85 |
</span>
|
| 86 |
</div>
|
| 87 |
|
|
@@ -94,55 +92,52 @@ const Login = () => {
|
|
| 94 |
<Form.Item
|
| 95 |
{...formItemLayout}
|
| 96 |
name="email"
|
| 97 |
-
label=
|
| 98 |
-
rules={[{ required: true, message: '
|
| 99 |
>
|
| 100 |
-
<Input size="large" placeholder=
|
| 101 |
</Form.Item>
|
| 102 |
{title === 'register' && (
|
| 103 |
<Form.Item
|
| 104 |
{...formItemLayout}
|
| 105 |
name="nickname"
|
| 106 |
-
label=
|
| 107 |
-
rules={[
|
| 108 |
-
{ required: true, message: 'Please input your nickname' },
|
| 109 |
-
]}
|
| 110 |
>
|
| 111 |
-
<Input size="large" placeholder=
|
| 112 |
</Form.Item>
|
| 113 |
)}
|
| 114 |
<Form.Item
|
| 115 |
{...formItemLayout}
|
| 116 |
name="password"
|
| 117 |
-
label=
|
| 118 |
-
rules={[{ required: true, message: '
|
| 119 |
>
|
| 120 |
<Input.Password
|
| 121 |
size="large"
|
| 122 |
-
placeholder=
|
| 123 |
onPressEnter={onCheck}
|
| 124 |
/>
|
| 125 |
</Form.Item>
|
| 126 |
{title === 'login' && (
|
| 127 |
<Form.Item name="remember" valuePropName="checked">
|
| 128 |
-
<Checkbox>
|
| 129 |
</Form.Item>
|
| 130 |
)}
|
| 131 |
<div>
|
| 132 |
-
{' '}
|
| 133 |
{title === 'login' && (
|
| 134 |
<div>
|
| 135 |
-
|
| 136 |
<Button type="link" onClick={changeTitle}>
|
| 137 |
-
|
| 138 |
</Button>
|
| 139 |
</div>
|
| 140 |
)}
|
| 141 |
{title === 'register' && (
|
| 142 |
<div>
|
| 143 |
-
|
| 144 |
<Button type="link" onClick={changeTitle}>
|
| 145 |
-
|
| 146 |
</Button>
|
| 147 |
</div>
|
| 148 |
)}
|
|
@@ -154,7 +149,7 @@ const Login = () => {
|
|
| 154 |
onClick={onCheck}
|
| 155 |
loading={signLoading}
|
| 156 |
>
|
| 157 |
-
{title === 'login' ? '
|
| 158 |
</Button>
|
| 159 |
{title === 'login' && (
|
| 160 |
<>
|
|
|
|
| 1 |
+
import { useLogin, useRegister } from '@/hooks/loginHooks';
|
| 2 |
import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks';
|
| 3 |
import { rsaPsw } from '@/utils';
|
| 4 |
import { Button, Checkbox, Form, Input } from 'antd';
|
|
|
|
| 7 |
import { Icon, useNavigate } from 'umi';
|
| 8 |
import RightPanel from './right-panel';
|
| 9 |
|
|
|
|
| 10 |
import styles from './index.less';
|
| 11 |
|
| 12 |
const Login = () => {
|
|
|
|
| 14 |
const navigate = useNavigate();
|
| 15 |
const login = useLogin();
|
| 16 |
const register = useRegister();
|
| 17 |
+
const { t } = useTranslation('translation', { keyPrefix: 'login' });
|
| 18 |
|
| 19 |
// TODO: When the server address request is not accessible, the value of dva-loading always remains true.
|
| 20 |
|
|
|
|
| 75 |
<div className={styles.loginLeft}>
|
| 76 |
<div className={styles.leftContainer}>
|
| 77 |
<div className={styles.loginTitle}>
|
| 78 |
+
<div>{title === 'login' ? t('login') : 'Create an account'}</div>
|
|
|
|
|
|
|
| 79 |
<span>
|
| 80 |
{title === 'login'
|
| 81 |
+
? t('loginDescription')
|
| 82 |
+
: t('registerDescription')}
|
| 83 |
</span>
|
| 84 |
</div>
|
| 85 |
|
|
|
|
| 92 |
<Form.Item
|
| 93 |
{...formItemLayout}
|
| 94 |
name="email"
|
| 95 |
+
label={t('emailLabel')}
|
| 96 |
+
rules={[{ required: true, message: t('emailPlaceholder') }]}
|
| 97 |
>
|
| 98 |
+
<Input size="large" placeholder={t('emailPlaceholder')} />
|
| 99 |
</Form.Item>
|
| 100 |
{title === 'register' && (
|
| 101 |
<Form.Item
|
| 102 |
{...formItemLayout}
|
| 103 |
name="nickname"
|
| 104 |
+
label={t('nicknameLabel')}
|
| 105 |
+
rules={[{ required: true, message: t('nicknamePlaceholder') }]}
|
|
|
|
|
|
|
| 106 |
>
|
| 107 |
+
<Input size="large" placeholder={t('nicknamePlaceholder')} />
|
| 108 |
</Form.Item>
|
| 109 |
)}
|
| 110 |
<Form.Item
|
| 111 |
{...formItemLayout}
|
| 112 |
name="password"
|
| 113 |
+
label={t('passwordLabel')}
|
| 114 |
+
rules={[{ required: true, message: t('passwordPlaceholder') }]}
|
| 115 |
>
|
| 116 |
<Input.Password
|
| 117 |
size="large"
|
| 118 |
+
placeholder={t('passwordPlaceholder')}
|
| 119 |
onPressEnter={onCheck}
|
| 120 |
/>
|
| 121 |
</Form.Item>
|
| 122 |
{title === 'login' && (
|
| 123 |
<Form.Item name="remember" valuePropName="checked">
|
| 124 |
+
<Checkbox> {t('rememberMe')}</Checkbox>
|
| 125 |
</Form.Item>
|
| 126 |
)}
|
| 127 |
<div>
|
|
|
|
| 128 |
{title === 'login' && (
|
| 129 |
<div>
|
| 130 |
+
{t('signInTip')}
|
| 131 |
<Button type="link" onClick={changeTitle}>
|
| 132 |
+
{t('signUp')}
|
| 133 |
</Button>
|
| 134 |
</div>
|
| 135 |
)}
|
| 136 |
{title === 'register' && (
|
| 137 |
<div>
|
| 138 |
+
{t('signUpTip')}
|
| 139 |
<Button type="link" onClick={changeTitle}>
|
| 140 |
+
{t('login')}
|
| 141 |
</Button>
|
| 142 |
</div>
|
| 143 |
)}
|
|
|
|
| 149 |
onClick={onCheck}
|
| 150 |
loading={signLoading}
|
| 151 |
>
|
| 152 |
+
{title === 'login' ? t('login') : t('continue')}
|
| 153 |
</Button>
|
| 154 |
{title === 'login' && (
|
| 155 |
<>
|