Fix: Modify the index_mode attribute of the Confluence data source.

This commit is contained in:
chanx 2025-12-05 19:49:37 +08:00
parent b34b884883
commit 805f7b44a0
5 changed files with 72 additions and 56 deletions

View file

@ -7,6 +7,7 @@ import {
useState, useState,
} from 'react'; } from 'react';
import { import {
ControllerRenderProps,
DefaultValues, DefaultValues,
FieldValues, FieldValues,
SubmitHandler, SubmitHandler,
@ -67,7 +68,7 @@ export interface FormFieldConfig {
max?: number; max?: number;
message?: string; message?: string;
}; };
render?: (fieldProps: any) => React.ReactNode; render?: (fieldProps: ControllerRenderProps) => React.ReactNode;
horizontal?: boolean; horizontal?: boolean;
onChange?: (value: any) => void; onChange?: (value: any) => void;
tooltip?: React.ReactNode; tooltip?: React.ReactNode;

View file

@ -53,14 +53,16 @@ export function RAGFlowFormItem({
{label} {label}
</FormLabel> </FormLabel>
)} )}
<FormControl> <div className="w-full flex flex-col">
{typeof children === 'function' <FormControl>
? children(field) {typeof children === 'function'
: isValidElement(children) ? children(field)
? cloneElement(children, { ...field }) : isValidElement(children)
: children} ? cloneElement(children, { ...field })
</FormControl> : children}
<FormMessage /> </FormControl>
<FormMessage />
</div>
</FormItem> </FormItem>
)} )}
/> />

View file

@ -1,9 +1,10 @@
import { useEffect, useMemo } from 'react'; import { useCallback, useEffect, useMemo, useState } from 'react';
import { ControllerRenderProps, useFormContext } from 'react-hook-form'; import { ControllerRenderProps, useFormContext } from 'react-hook-form';
import { Checkbox } from '@/components/ui/checkbox'; import { Checkbox } from '@/components/ui/checkbox';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { debounce } from 'lodash';
/* ---------------- Token Field ---------------- */ /* ---------------- Token Field ---------------- */
@ -48,15 +49,15 @@ type ConfluenceIndexingMode = 'everything' | 'space' | 'page';
export type ConfluenceIndexingModeFieldProps = ControllerRenderProps; export type ConfluenceIndexingModeFieldProps = ControllerRenderProps;
export const ConfluenceIndexingModeField = ( export const ConfluenceIndexingModeField = (
fieldProps: ConfluenceIndexingModeFieldProps, fieldProps: ControllerRenderProps,
) => { ) => {
const { value, onChange, disabled } = fieldProps; const { value, onChange, disabled } = fieldProps;
const [mode, setMode] = useState<ConfluenceIndexingMode>(
value || 'everything',
);
const { watch, setValue } = useFormContext(); const { watch, setValue } = useFormContext();
const mode = useMemo<ConfluenceIndexingMode>( useEffect(() => setMode(value), [value]);
() => (value as ConfluenceIndexingMode) || 'everything',
[value],
);
const spaceValue = watch('config.space'); const spaceValue = watch('config.space');
const pageIdValue = watch('config.page_id'); const pageIdValue = watch('config.page_id');
@ -66,27 +67,40 @@ export const ConfluenceIndexingModeField = (
if (!value) onChange('everything'); if (!value) onChange('everything');
}, [value, onChange]); }, [value, onChange]);
const handleModeChange = (nextMode?: string) => { const handleModeChange = useCallback(
const normalized = (nextMode || 'everything') as ConfluenceIndexingMode; (nextMode?: string) => {
onChange(normalized); let normalized: ConfluenceIndexingMode = 'everything';
if (nextMode) {
normalized = nextMode as ConfluenceIndexingMode;
setMode(normalized);
onChange(normalized);
} else {
setMode(mode);
normalized = mode;
onChange(mode);
// onChange(mode);
}
if (normalized === 'everything') {
setValue('config.space', '');
setValue('config.page_id', '');
setValue('config.index_recursively', false);
} else if (normalized === 'space') {
setValue('config.page_id', '');
setValue('config.index_recursively', false);
} else if (normalized === 'page') {
setValue('config.space', '');
}
},
[mode, onChange, setValue],
);
if (normalized === 'everything') { const debouncedHandleChange = useMemo(
setValue('config.space', '', { shouldDirty: true, shouldTouch: true }); () =>
setValue('config.page_id', '', { shouldDirty: true, shouldTouch: true }); debounce(() => {
setValue('config.index_recursively', false, { handleModeChange();
shouldDirty: true, }, 300),
shouldTouch: true, [handleModeChange],
}); );
} else if (normalized === 'space') {
setValue('config.page_id', '', { shouldDirty: true, shouldTouch: true });
setValue('config.index_recursively', false, {
shouldDirty: true,
shouldTouch: true,
});
} else if (normalized === 'page') {
setValue('config.space', '', { shouldDirty: true, shouldTouch: true });
}
};
return ( return (
<div className="w-full rounded-lg border border-border-button bg-bg-card p-4 space-y-4"> <div className="w-full rounded-lg border border-border-button bg-bg-card p-4 space-y-4">
@ -127,12 +141,11 @@ export const ConfluenceIndexingModeField = (
<Input <Input
className="w-full" className="w-full"
value={spaceValue ?? ''} value={spaceValue ?? ''}
onChange={(e) => onChange={(e) => {
setValue('config.space', e.target.value, { const value = e.target.value;
shouldDirty: true, setValue('config.space', value);
shouldTouch: true, debouncedHandleChange();
}) }}
}
placeholder="e.g. KB" placeholder="e.g. KB"
disabled={disabled} disabled={disabled}
/> />
@ -148,12 +161,10 @@ export const ConfluenceIndexingModeField = (
<Input <Input
className="w-full" className="w-full"
value={pageIdValue ?? ''} value={pageIdValue ?? ''}
onChange={(e) => onChange={(e) => {
setValue('config.page_id', e.target.value, { setValue('config.page_id', e.target.value);
shouldDirty: true, debouncedHandleChange();
shouldTouch: true, }}
})
}
placeholder="e.g. 123456" placeholder="e.g. 123456"
disabled={disabled} disabled={disabled}
/> />
@ -164,12 +175,10 @@ export const ConfluenceIndexingModeField = (
<div className="flex items-center gap-2 pt-2"> <div className="flex items-center gap-2 pt-2">
<Checkbox <Checkbox
checked={Boolean(indexRecursively)} checked={Boolean(indexRecursively)}
onCheckedChange={(checked) => onCheckedChange={(checked) => {
setValue('config.index_recursively', Boolean(checked), { setValue('config.index_recursively', Boolean(checked));
shouldDirty: true, debouncedHandleChange();
shouldTouch: true, }}
})
}
disabled={disabled} disabled={disabled}
/> />
<span className="text-sm text-text-secondary"> <span className="text-sm text-text-secondary">

View file

@ -1,6 +1,7 @@
import { FormFieldType } from '@/components/dynamic-form'; import { FormFieldType } from '@/components/dynamic-form';
import SvgIcon from '@/components/svg-icon'; import SvgIcon from '@/components/svg-icon';
import { t } from 'i18next'; import { t } from 'i18next';
import { ControllerRenderProps } from 'react-hook-form';
import { ConfluenceIndexingModeField } from './component/confluence-token-field'; import { ConfluenceIndexingModeField } from './component/confluence-token-field';
import GmailTokenField from './component/gmail-token-field'; import GmailTokenField from './component/gmail-token-field';
import GoogleDriveTokenField from './component/google-drive-token-field'; import GoogleDriveTokenField from './component/google-drive-token-field';
@ -237,7 +238,9 @@ export const DataSourceFormFields = {
required: false, required: false,
horizontal: true, horizontal: true,
labelClassName: 'self-start pt-4', labelClassName: 'self-start pt-4',
render: (fieldProps) => <ConfluenceIndexingModeField {...fieldProps} />, render: (fieldProps: ControllerRenderProps) => (
<ConfluenceIndexingModeField {...fieldProps} />
),
}, },
{ {
label: 'Space Key', label: 'Space Key',
@ -598,6 +601,7 @@ export const DataSourceFormDefaultValues = {
confluence_username: '', confluence_username: '',
confluence_access_token: '', confluence_access_token: '',
}, },
index_mode: 'everything',
}, },
}, },
[DataSourceKey.GOOGLE_DRIVE]: { [DataSourceKey.GOOGLE_DRIVE]: {

View file

@ -136,7 +136,7 @@ const SourceDetailPage = () => {
...customFields, ...customFields,
] as FormFieldConfig[]; ] as FormFieldConfig[];
const neweFields = fields.map((field) => { const newFields = fields.map((field) => {
return { return {
...field, ...field,
horizontal: true, horizontal: true,
@ -145,7 +145,7 @@ const SourceDetailPage = () => {
}, },
}; };
}); });
setFields(neweFields); setFields(newFields);
const defultValueTemp = { const defultValueTemp = {
...(DataSourceFormDefaultValues[ ...(DataSourceFormDefaultValues[