Fix: Modify the index_mode attribute of the Confluence data source.
This commit is contained in:
parent
b34b884883
commit
805f7b44a0
5 changed files with 72 additions and 56 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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]: {
|
||||||
|
|
|
||||||
|
|
@ -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[
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue