diff --git a/web/.eslintrc.cjs b/web/.eslintrc.cjs index 689dec1fc3..bf1cf54727 100644 --- a/web/.eslintrc.cjs +++ b/web/.eslintrc.cjs @@ -70,4 +70,12 @@ module.exports = { }, ], }, + overrides: [ + { + files: ['**/__tests__/**'], + rules: { + 'check-file/folder-naming-convention': 'off', + }, + }, + ], }; diff --git a/web/src/components/highlight-markdown/index.tsx b/web/src/components/highlight-markdown/index.tsx index c6ad6f3b6d..766f0bde07 100644 --- a/web/src/components/highlight-markdown/index.tsx +++ b/web/src/components/highlight-markdown/index.tsx @@ -1,3 +1,4 @@ +import { MarkdownRemarkPlugins } from '@/constants/markdown-remark-plugins'; import classNames from 'classnames'; import Markdown from 'react-markdown'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; @@ -7,18 +8,17 @@ import { } from 'react-syntax-highlighter/dist/esm/styles/prism'; import rehypeKatex from 'rehype-katex'; import rehypeRaw from 'rehype-raw'; -import { MarkdownRemarkPlugins } from '@/constants/markdown-remark-plugins'; import 'katex/dist/katex.min.css'; // `rehype-katex` does not import the CSS for you import { preprocessLaTeX } from '@/utils/chat'; import { citationMarkerReg } from '@/utils/citation-utils'; import { getDirAttribute } from '@/utils/text-direction'; +import { omit } from 'lodash'; import { useIsDarkTheme } from '../theme-provider'; import styles from './index.module.less'; const HighLightMarkdown = ({ - className, children, }: { className?: string; @@ -36,8 +36,8 @@ const HighLightMarkdown = ({ rehypePlugins={[rehypeRaw, rehypeKatex]} components={ { - p: ({ children, node, ...props }: any) => ( -

{children}

+ p: ({ children, ...props }: any) => ( +

{children}

), code(props: any) { const { children, className, ...rest } = props; diff --git a/web/src/components/json-edit/index.tsx b/web/src/components/json-edit/index.tsx index 31586c59e0..99a4a3bf80 100644 --- a/web/src/components/json-edit/index.tsx +++ b/web/src/components/json-edit/index.tsx @@ -103,6 +103,7 @@ const JsonEditor: React.FC = ({ try { currentData = editorRef.current.get(); } catch (e) { + console.error(e); // If there's an error getting data, use the passed value or empty object currentData = value || {}; } @@ -127,6 +128,7 @@ const JsonEditor: React.FC = ({ const updatedJson = editorRef.current.get(); onChange(updatedJson); } catch (err) { + console.error(err); // Do not trigger onChange when parsing error occurs } } @@ -157,6 +159,7 @@ const JsonEditor: React.FC = ({ editorRef.current.set(value); } } catch (err) { + console.error(err); // Skip update if there is a syntax error in the current editor editorRef.current.set(value); } diff --git a/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx b/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx index f39d9e260e..c4d92ec142 100644 --- a/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx +++ b/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx @@ -52,6 +52,7 @@ const JsonSchemaVisualizer: FC = ({ onChange(parsedJson); } } catch (_error) { + console.error(_error); // Monaco will show the error inline, no need for additional error handling } }; diff --git a/web/src/components/ui/input.tsx b/web/src/components/ui/input.tsx index f742b0256d..a1ea6f8e21 100644 --- a/web/src/components/ui/input.tsx +++ b/web/src/components/ui/input.tsx @@ -84,7 +84,7 @@ const Input = React.forwardRef( !!prefix && prefixWidth ? `${prefixWidth}px` : '', paddingInlineEnd: isPasswordInput ? '40px' - : !!suffix + : suffix ? `${suffixWidth}px` : '', }} @@ -155,9 +155,6 @@ const Input = React.forwardRef( Input.displayName = 'Input'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ExpandedInputProps extends InputProps {} - const ExpandedInput = Input; const SearchInput = (props: InputProps) => { diff --git a/web/src/components/ui/segmented.tsx b/web/src/components/ui/segmented.tsx index 7318c017dd..33488ada26 100644 --- a/web/src/components/ui/segmented.tsx +++ b/web/src/components/ui/segmented.tsx @@ -64,7 +64,7 @@ export interface SegmentedProps extends Omit< const Segmented = React.forwardRef( supportsCssAnchor - ? ( + ? function Segmented( { options, value, @@ -77,7 +77,7 @@ const Segmented = React.forwardRef( buttonSize = 'default', }, ref, - ) => { + ) { const anchorNamePrefix = useId().replace(/:/g, ''); const [selectedValue, setSelectedValue] = React.useState< SegmentedValue | undefined @@ -143,7 +143,7 @@ const Segmented = React.forwardRef( ); } - : ( + : function Segmented( { options, value, @@ -156,7 +156,7 @@ const Segmented = React.forwardRef( buttonSize = 'default', }, ref, - ) => { + ) { const [selectedValue, setSelectedValue] = React.useState< SegmentedValue | undefined >(value); diff --git a/web/src/components/what-is-this.tsx b/web/src/components/what-is-this.tsx index 52d297aaa0..68d92437b3 100644 --- a/web/src/components/what-is-this.tsx +++ b/web/src/components/what-is-this.tsx @@ -2,7 +2,7 @@ import { LucideCircleQuestionMark } from 'lucide-react'; import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip'; -export default function WhatIsThis({ children }: React.PropsWithChildren<{}>) { +export default function WhatIsThis({ children }: React.PropsWithChildren) { return ( diff --git a/web/src/hooks/__tests__/logic-hooks.useScrollToBottom.test.tsx b/web/src/hooks/__tests__/logic-hooks-use-scroll-to-bottom.test.tsx similarity index 100% rename from web/src/hooks/__tests__/logic-hooks.useScrollToBottom.test.tsx rename to web/src/hooks/__tests__/logic-hooks-use-scroll-to-bottom.test.tsx diff --git a/web/src/interfaces/request/file-manager.ts b/web/src/interfaces/request/file-manager.ts index b355bf3a93..7c79e81c3f 100644 --- a/web/src/interfaces/request/file-manager.ts +++ b/web/src/interfaces/request/file-manager.ts @@ -4,10 +4,6 @@ export interface IFileListRequestBody extends IPaginationRequestBody { parent_id?: string; // folder id } -interface BaseRequestBody { - parentId: string; -} - export interface IConnectRequestBody { fileIds: string[]; kbIds: string[]; diff --git a/web/src/pages/agent/form/tool-form/searxng-form/index.tsx b/web/src/pages/agent/form/tool-form/searxng-form/index.tsx index 703c4b3955..e77b239e18 100644 --- a/web/src/pages/agent/form/tool-form/searxng-form/index.tsx +++ b/web/src/pages/agent/form/tool-form/searxng-form/index.tsx @@ -9,7 +9,6 @@ import { FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; -import { useTranslate } from '@/hooks/common-hooks'; import { zodResolver } from '@hookform/resolvers/zod'; import { memo } from 'react'; import { useForm } from 'react-hook-form'; @@ -23,7 +22,6 @@ const FormSchema = z.object({ }); function SearXNGForm() { - const { t } = useTranslate('flow'); const values = useValues(); const form = useForm>({ diff --git a/web/src/pages/agent/gobal-variable-sheet/hooks/use-form.tsx b/web/src/pages/agent/gobal-variable-sheet/hooks/use-form.tsx index 54d37957a2..685e3cd87a 100644 --- a/web/src/pages/agent/gobal-variable-sheet/hooks/use-form.tsx +++ b/web/src/pages/agent/gobal-variable-sheet/hooks/use-form.tsx @@ -12,6 +12,7 @@ export const useHandleForm = () => { try { return JSON.parse(value); } catch (error) { + console.warn(error); return value; } }; diff --git a/web/src/pages/agent/hooks/use-download-output.ts b/web/src/pages/agent/hooks/use-download-output.ts index 8e02105e87..8d1705b878 100644 --- a/web/src/pages/agent/hooks/use-download-output.ts +++ b/web/src/pages/agent/hooks/use-download-output.ts @@ -15,7 +15,9 @@ export function findEndOutput(list?: ITraceData[]) { const json = JSON.parse(str); return json; } - } catch (error) {} + } catch (error) { + console.warn(error); + } } } diff --git a/web/src/pages/dataset/components/metedata/manage-modal-column.tsx b/web/src/pages/dataset/components/metedata/manage-modal-column.tsx index bae956c3a1..8aaedd5756 100644 --- a/web/src/pages/dataset/components/metedata/manage-modal-column.tsx +++ b/web/src/pages/dataset/components/metedata/manage-modal-column.tsx @@ -5,7 +5,7 @@ import { Input } from '@/components/ui/input'; import { formatDate } from '@/utils/date'; import { ColumnDef, Row, Table } from '@tanstack/react-table'; import { ListChevronsDownUp, LucidePencil, Trash2 } from 'lucide-react'; -import { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { getMetadataValueTypeLabel, @@ -56,12 +56,6 @@ export const useMetadataColumns = ({ Record >({}); - const isSettingsMode = - metadataType === MetadataType.Setting || - metadataType === MetadataType.SingleFileSetting || - metadataType === MetadataType.UpdateSingle; - - const showTypeColumn = isSettingsMode; const handleEditValue = (field: string, value: string) => { setEditingValue({ field, value, newValue: value }); }; @@ -193,6 +187,35 @@ export const useMetadataColumns = ({ })); }; + const handleToggleExpand = (e: React.MouseEvent) => { + e.stopPropagation(); + toggleRowExpanded(); + }; + + const handleDeleteValueClick = + (value: string): React.MouseEventHandler => + (e) => { + e.stopPropagation(); + setDeleteDialogContent({ + visible: true, + title: + t('common.delete') + + ' ' + + t('knowledgeDetails.metadata.value'), + name: value, + warnText: + MetadataDeleteMap(t)[metadataType as MetadataType] + .warnValueText, + onOk: () => { + hideDeleteModal(); + handleDeleteSingleValue(row.getValue('field'), value); + }, + onCancel: () => { + hideDeleteModal(); + }, + }); + }; + const displayedValues = isRowExpanded ? values : values.slice(0, 2); const hasMore = Array.isArray(values) && values.length > 2; @@ -269,32 +292,7 @@ export const useMetadataColumns = ({ @@ -308,10 +306,7 @@ export const useMetadataColumns = ({