diff --git a/web/.eslintrc.js b/web/.eslintrc.js new file mode 100644 index 00000000..8f9843ed --- /dev/null +++ b/web/.eslintrc.js @@ -0,0 +1,5 @@ +// .eslintrc.js +module.exports = { + // Umi 项目 + extends: [require.resolve('umi/eslint'), 'plugin:react-hooks/recommended'], +}; diff --git a/web/package-lock.json b/web/package-lock.json index 6906fc24..194342df 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -27,6 +27,7 @@ "@types/lodash": "^4.14.202", "@types/react": "^18.0.33", "@types/react-dom": "^18.0.11", + "@umijs/lint": "^4.1.1", "@umijs/plugins": "^4.1.0", "cross-env": "^7.0.3", "prettier": "^3.2.4", @@ -3479,16 +3480,17 @@ } }, "node_modules/@umijs/lint": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/@umijs/lint/-/lint-4.1.0.tgz", - "integrity": "sha512-drXkAeBJGMLrPr/dDiOZ2Z+3VKkAf53MzoOIhwHy5atq+PFNG9Y7e6YuWrK3qVF75zg9culQzlHTvinCjDK97Q==", + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@umijs/lint/-/lint-4.1.1.tgz", + "integrity": "sha512-fy2edKuYw42eM3LuH/2AiH0ZKdembFx3SR8dIGKxf7BmEQOSfUhskLiNGE8tSRubCiVzGUWvZQDw1YQcU0bsHg==", + "dev": true, "dependencies": { "@babel/core": "7.23.6", "@babel/eslint-parser": "7.23.3", "@stylelint/postcss-css-in-js": "^0.38.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "@umijs/babel-preset-umi": "4.1.0", + "@umijs/babel-preset-umi": "4.1.1", "eslint-plugin-jest": "27.2.3", "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "4.6.0", @@ -3501,6 +3503,7 @@ "version": "7.23.6", "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.6.tgz", "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", @@ -3522,6 +3525,54 @@ "node": ">=6.9.0" } }, + "node_modules/@umijs/lint/node_modules/@babel/runtime": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@umijs/lint/node_modules/@umijs/babel-preset-umi": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@umijs/babel-preset-umi/-/babel-preset-umi-4.1.1.tgz", + "integrity": "sha512-6pYZnF03euAJGZN3VLe8PKKRNMH6Zxj4GKNooLvJ0Wz0eMufmYDcA4CpbR6h8i1JpgcQ0Sngr8bqHLb7oMqrvw==", + "dev": true, + "dependencies": { + "@babel/runtime": "7.23.6", + "@bloomberg/record-tuple-polyfill": "0.0.4", + "@umijs/bundler-utils": "4.1.1", + "@umijs/utils": "4.1.1", + "core-js": "3.34.0" + } + }, + "node_modules/@umijs/lint/node_modules/@umijs/bundler-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@umijs/bundler-utils/-/bundler-utils-4.1.1.tgz", + "integrity": "sha512-k1I1tjDePgB1XqpQHZiLJ/5gS4EykY8hqqzEzD1CSbd5KFE614+q6W/gcpFZ0YLJDWY1GdjOYpRokvuI/MSRfg==", + "dev": true, + "dependencies": { + "@umijs/utils": "4.1.1", + "esbuild": "0.17.19", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "10.1.1", + "spdy": "^4.0.2" + } + }, + "node_modules/@umijs/lint/node_modules/@umijs/utils": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@umijs/utils/-/utils-4.1.1.tgz", + "integrity": "sha512-hbnbJR3RA7fu4E7q4JFZ47XMYArr6Zn5bftr8YZ+o6hzJlomr4gzoOXE+XxM7rVMK4AFZoc+QZgNTJyISd08Pg==", + "dev": true, + "dependencies": { + "chokidar": "3.5.3", + "pino": "7.11.0" + } + }, "node_modules/@umijs/mfsu": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/@umijs/mfsu/-/mfsu-4.1.0.tgz", @@ -16319,6 +16370,31 @@ "qs": "^6.9.1" } }, + "node_modules/umi/node_modules/@babel/core": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/umi/node_modules/@babel/runtime": { "version": "7.23.6", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.6.tgz", @@ -16330,6 +16406,25 @@ "node": ">=6.9.0" } }, + "node_modules/umi/node_modules/@umijs/lint": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/@umijs/lint/-/lint-4.1.0.tgz", + "integrity": "sha512-drXkAeBJGMLrPr/dDiOZ2Z+3VKkAf53MzoOIhwHy5atq+PFNG9Y7e6YuWrK3qVF75zg9culQzlHTvinCjDK97Q==", + "dependencies": { + "@babel/core": "7.23.6", + "@babel/eslint-parser": "7.23.3", + "@stylelint/postcss-css-in-js": "^0.38.0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "@umijs/babel-preset-umi": "4.1.0", + "eslint-plugin-jest": "27.2.3", + "eslint-plugin-react": "7.33.2", + "eslint-plugin-react-hooks": "4.6.0", + "postcss": "^8.4.21", + "postcss-syntax": "0.36.2", + "stylelint-config-standard": "25.0.0" + } + }, "node_modules/umi/node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz", diff --git a/web/package.json b/web/package.json index 41b054d5..9f3f056b 100644 --- a/web/package.json +++ b/web/package.json @@ -5,6 +5,7 @@ "build": "umi build", "dev": "cross-env PORT=9000 umi dev", "postinstall": "umi setup", + "lint": "umi lint --eslint-only", "setup": "umi setup", "start": "npm run dev" }, @@ -30,6 +31,7 @@ "@types/lodash": "^4.14.202", "@types/react": "^18.0.33", "@types/react-dom": "^18.0.11", + "@umijs/lint": "^4.1.1", "@umijs/plugins": "^4.1.0", "cross-env": "^7.0.3", "prettier": "^3.2.4", diff --git a/web/src/app.tsx b/web/src/app.tsx index 15473641..a67e507e 100644 --- a/web/src/app.tsx +++ b/web/src/app.tsx @@ -1,5 +1,5 @@ -import React, { ReactNode } from "react"; -import { Inspector } from "react-dev-inspector"; +import React, { ReactNode } from 'react'; +import { Inspector } from 'react-dev-inspector'; export function rootContainer(container: ReactNode) { return React.createElement(Inspector, null, container); diff --git a/web/src/interfaces/common.ts b/web/src/interfaces/common.ts index f99511fa..518d077c 100644 --- a/web/src/interfaces/common.ts +++ b/web/src/interfaces/common.ts @@ -5,4 +5,5 @@ export interface Pagination { export interface BaseState { pagination: Pagination; + searchString: string; } diff --git a/web/src/interfaces/database/knowledge.ts b/web/src/interfaces/database/knowledge.ts index 24cebae5..a98a04be 100644 --- a/web/src/interfaces/database/knowledge.ts +++ b/web/src/interfaces/database/knowledge.ts @@ -65,3 +65,13 @@ export interface ITenantInfo { chat_id: string; speech2text_id: string; } + +export interface IChunk { + available_int: number; // Whether to enable, 0: not enabled, 1: enabled + chunk_id: string; + content_with_weight: string; + doc_id: string; + docnm_kwd: string; + img_id: string; + important_kwd: any[]; +} diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.less b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.less new file mode 100644 index 00000000..876e4263 --- /dev/null +++ b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.less @@ -0,0 +1,8 @@ +.image { + width: 100px !important; + min-width: 100px; +} + +.imagePreview { + width: 600px; +} diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.tsx b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.tsx new file mode 100644 index 00000000..d4d169a5 --- /dev/null +++ b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-card/index.tsx @@ -0,0 +1,88 @@ +import { IChunk } from '@/interfaces/database/knowledge'; +import { api_host } from '@/utils/api'; +import { Card, Checkbox, CheckboxProps, Flex, Popover, Switch } from 'antd'; +import { useDispatch } from 'umi'; + +import { useState } from 'react'; +import styles from './index.less'; + +interface IProps { + item: IChunk; + checked: boolean; + handleCheckboxClick: (chunkId: string, checked: boolean) => void; +} + +interface IImage { + id: string; + className: string; +} +// Pass onMouseEnter and onMouseLeave to img tag using props +const Image = ({ id, className, ...props }: IImage) => { + return ( + + ); +}; + +const ChunkCard = ({ item, checked, handleCheckboxClick }: IProps) => { + const dispatch = useDispatch(); + + const available = Number(item.available_int); + const [enabled, setEnabled] = useState(available === 1); + + const switchChunk = () => { + dispatch({ + type: 'chunkModel/switch_chunk', + payload: { + chunk_ids: [item.chunk_id], + available_int: available === 0 ? 1 : 0, + doc_id: item.doc_id, + }, + }); + }; + + const onChange = (checked: boolean) => { + setEnabled(checked); + switchChunk(); + }; + + const handleCheck: CheckboxProps['onChange'] = (e) => { + handleCheckboxClick(item.chunk_id, e.target.checked); + }; + + return ( +
+ + + + {item.img_id && ( + + } + > + + + + )} + +
{item.content_with_weight}
+
+ +
+
+
+
+ ); +}; + +export default ChunkCard; diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-toolbar/index.tsx b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-toolbar/index.tsx index d812c8e3..8200f71d 100644 --- a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-toolbar/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-toolbar/index.tsx @@ -1,4 +1,6 @@ import { ReactComponent as FilterIcon } from '@/assets/filter.svg'; +import { KnowledgeRouteKey } from '@/constants/knowledge'; +import { useKnowledgeBaseId } from '@/hooks/knowledgeHook'; import { ArrowLeftOutlined, CheckCircleOutlined, @@ -9,17 +11,50 @@ import { PlusOutlined, SearchOutlined, } from '@ant-design/icons'; -import { Button, Checkbox, Flex, Menu, MenuProps, Popover, Space } from 'antd'; -import { useMemo } from 'react'; +import { + Button, + Checkbox, + Flex, + Menu, + MenuProps, + Popover, + Radio, + RadioChangeEvent, + Space, +} from 'antd'; +import { useCallback, useMemo } from 'react'; +import { Link, useDispatch, useSelector } from 'umi'; +import { ChunkModelState } from '../../model'; + +interface IProps { + checked: boolean; + getChunkList: () => void; + selectAllChunk: (checked: boolean) => void; +} + +const ChunkToolBar = ({ getChunkList, selectAllChunk, checked }: IProps) => { + const { documentInfo, available }: ChunkModelState = useSelector( + (state: any) => state.chunkModel, + ); + const dispatch = useDispatch(); + + const knowledgeBaseId = useKnowledgeBaseId(); + + const handleSelectAllCheck = useCallback( + (e: any) => { + // console.info(e.target.checked); + selectAllChunk(e.target.checked); + }, + [selectAllChunk], + ); -const ChunkToolBar = () => { const items: MenuProps['items'] = useMemo(() => { return [ { key: '1', label: ( <> - + Select All @@ -55,47 +90,49 @@ const ChunkToolBar = () => { ), }, ]; - }, []); + }, [checked, handleSelectAllCheck]); const content = ( ); + const handleFilterChange = (e: RadioChangeEvent) => { + dispatch({ type: 'chunkModel/setAvailable', payload: e.target.value }); + getChunkList(); + }; + + const filterContent = ( + + + All + Enabled + Disabled + + + ); + return ( - - + + + + - xxx.pdf + {documentInfo.name} - {/* */} - +